import { env } from "indite-js/env"; import { Credentials as CredentialsFromDb } from "indite-js/prisma"; import { decrypt } from "./api/encryption/decrypt"; import { encrypt } from "./api/encryption/encrypt"; import prisma from "./prisma"; import { isDefined } from "./utils"; import { OAuth2Client, Credentials } from "google-auth-library"; export const getAuthenticatedGoogleClient = async ( credentialsId: string ): Promise => { const credentials = (await prisma.credentials.findFirst({ where: { id: credentialsId }, })) as CredentialsFromDb | undefined; if (!credentials) return; const data = await decrypt(credentials.data, credentials.iv); const oauth2Client = new OAuth2Client( env.GOOGLE_CLIENT_ID, env.GOOGLE_CLIENT_SECRET, `${env.NEXTAUTH_URL}/api/credentials/google-sheets/callback` ); oauth2Client.setCredentials(data); oauth2Client.on("tokens", updateTokens(credentialsId, data)); return oauth2Client; }; const updateTokens = (credentialsId: string, existingCredentials: any) => async (credentials: Credentials) => { if ( isDefined(existingCredentials.id_token) && credentials.id_token !== existingCredentials.id_token ) return; const newCredentials = { ...existingCredentials, expiry_date: credentials.expiry_date, access_token: credentials.access_token, }; const { encryptedData, iv } = await encrypt(newCredentials); await prisma.credentials.updateMany({ where: { id: credentialsId }, data: { data: encryptedData, iv }, }); };