Rocky_Mountain_Vending/lib/google-search-console.ts

142 lines
3.2 KiB
TypeScript

/**
* Google Search Console API Client
* Handles sitemap submission, URL inspection, and indexing requests
*/
interface GSCConfig {
serviceAccountEmail?: string
privateKey?: string
siteUrl: string
}
interface SubmitSitemapResponse {
success: boolean
message?: string
error?: string
}
interface InspectUrlResponse {
success: boolean
indexed?: boolean
error?: string
}
/**
* Submit sitemap to Google Search Console
* Uses the Search Console API v1
*/
export async function submitSitemapToGSC(
sitemapUrl: string,
config: GSCConfig
): Promise<SubmitSitemapResponse> {
const { serviceAccountEmail, privateKey, siteUrl } = config
if (!serviceAccountEmail || !privateKey) {
return {
success: false,
error: "Google Search Console credentials not configured",
}
}
try {
// For Next.js, we'll use the API route approach
// The actual API call will be made server-side via the API route
// This function is a helper that can be called from API routes
const response = await fetch(
`${process.env.NEXT_PUBLIC_APP_URL || ""}/api/sitemap-submit`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
sitemapUrl,
siteUrl,
}),
}
)
if (!response.ok) {
const error = await response.json()
return {
success: false,
error: error.message || "Failed to submit sitemap",
}
}
const data = await response.json()
return {
success: true,
message: data.message || "Sitemap submitted successfully",
}
} catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : "Unknown error occurred",
}
}
}
/**
* Request URL indexing in Google Search Console
*/
export async function requestIndexing(
url: string,
config: GSCConfig
): Promise<InspectUrlResponse> {
const { serviceAccountEmail, privateKey } = config
if (!serviceAccountEmail || !privateKey) {
return {
success: false,
error: "Google Search Console credentials not configured",
}
}
try {
const response = await fetch(
`${process.env.NEXT_PUBLIC_APP_URL || ""}/api/request-indexing`,
{
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
url,
}),
}
)
if (!response.ok) {
const error = await response.json()
return {
success: false,
error: error.message || "Failed to request indexing",
}
}
const data = await response.json()
return {
success: true,
indexed: data.indexed || false,
}
} catch (error) {
return {
success: false,
error: error instanceof Error ? error.message : "Unknown error occurred",
}
}
}
/**
* Get Google Search Console configuration from environment variables
*/
export function getGSCConfig(): GSCConfig {
return {
serviceAccountEmail: process.env.GOOGLE_SERVICE_ACCOUNT_EMAIL,
privateKey: process.env.GOOGLE_PRIVATE_KEY?.replace(/\\n/g, "\n"),
siteUrl:
process.env.NEXT_PUBLIC_SITE_URL || "https://rockymountainvending.com",
}
}