debug gsc sync
This commit is contained in:
@@ -1,8 +1,11 @@
|
|||||||
import { cacheable } from '@openpanel/redis';
|
import { cacheable } from '@openpanel/redis';
|
||||||
import { originalCh } from './clickhouse/client';
|
import { originalCh } from './clickhouse/client';
|
||||||
import { decrypt, encrypt } from './encryption';
|
import { decrypt, encrypt } from './encryption';
|
||||||
|
import { createLogger } from '@openpanel/logger';
|
||||||
import { db } from './prisma-client';
|
import { db } from './prisma-client';
|
||||||
|
|
||||||
|
const logger = createLogger({ name: 'db:gsc' });
|
||||||
|
|
||||||
export interface GscSite {
|
export interface GscSite {
|
||||||
siteUrl: string;
|
siteUrl: string;
|
||||||
permissionLevel: string;
|
permissionLevel: string;
|
||||||
@@ -46,9 +49,19 @@ export async function getGscAccessToken(projectId: string): Promise<string> {
|
|||||||
conn.accessTokenExpiresAt &&
|
conn.accessTokenExpiresAt &&
|
||||||
conn.accessTokenExpiresAt.getTime() > Date.now() + 60_000
|
conn.accessTokenExpiresAt.getTime() > Date.now() + 60_000
|
||||||
) {
|
) {
|
||||||
|
logger.info('GSC using cached access token', {
|
||||||
|
projectId,
|
||||||
|
expiresAt: conn.accessTokenExpiresAt,
|
||||||
|
});
|
||||||
return decrypt(conn.accessToken);
|
return decrypt(conn.accessToken);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logger.info('GSC access token expired, attempting refresh', {
|
||||||
|
projectId,
|
||||||
|
expiresAt: conn.accessTokenExpiresAt,
|
||||||
|
hasRefreshToken: !!conn.refreshToken,
|
||||||
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const { accessToken, expiresAt } = await refreshGscToken(
|
const { accessToken, expiresAt } = await refreshGscToken(
|
||||||
decrypt(conn.refreshToken)
|
decrypt(conn.refreshToken)
|
||||||
@@ -57,18 +70,21 @@ export async function getGscAccessToken(projectId: string): Promise<string> {
|
|||||||
where: { projectId },
|
where: { projectId },
|
||||||
data: { accessToken: encrypt(accessToken), accessTokenExpiresAt: expiresAt },
|
data: { accessToken: encrypt(accessToken), accessTokenExpiresAt: expiresAt },
|
||||||
});
|
});
|
||||||
|
logger.info('GSC token refreshed successfully', { projectId, expiresAt });
|
||||||
return accessToken;
|
return accessToken;
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
const errorMessage =
|
||||||
|
error instanceof Error ? error.message : 'Failed to refresh token';
|
||||||
|
logger.error('GSC token refresh failed', { projectId, error: errorMessage });
|
||||||
await db.gscConnection.update({
|
await db.gscConnection.update({
|
||||||
where: { projectId },
|
where: { projectId },
|
||||||
data: {
|
data: {
|
||||||
lastSyncStatus: 'token_expired',
|
lastSyncStatus: 'token_expired',
|
||||||
lastSyncError:
|
lastSyncError: errorMessage,
|
||||||
error instanceof Error ? error.message : 'Failed to refresh token',
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
throw new Error(
|
throw new Error(
|
||||||
'GSC token has expired or been revoked. Please reconnect Google Search Console.'
|
`GSC token refresh failed for project ${projectId}: ${errorMessage}`
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user