diff --git a/apps/web/app/api/v1/integrations/airtable/callback/route.ts b/apps/web/app/api/v1/integrations/airtable/callback/route.ts index 490699c5eb..ab497df249 100644 --- a/apps/web/app/api/v1/integrations/airtable/callback/route.ts +++ b/apps/web/app/api/v1/integrations/airtable/callback/route.ts @@ -58,7 +58,9 @@ export async function GET(req: NextRequest) { try { const key = await fetchAirtableAuthToken(formData); - + if (!key) { + return NextResponse.json({ Error: "Failed to fetch Airtable auth token" }, { status: 500 }); + } const email = await getEmail(key.access_token); await connectAirtable({ diff --git a/packages/lib/airtable/service.ts b/packages/lib/airtable/service.ts index 34b80fb43d..f1b816f1e0 100644 --- a/packages/lib/airtable/service.ts +++ b/packages/lib/airtable/service.ts @@ -91,8 +91,13 @@ export const fetchAirtableAuthToken = async (formData: Record) => { const tokenRes: unknown = await tokenReq.json(); - const { access_token, expires_in, refresh_token } = ZIntegrationAirtableTokenSchema.parse(tokenRes); + const parsedToken = ZIntegrationAirtableTokenSchema.safeParse(tokenRes); + if (!parsedToken.success) { + throw new Error("invalid token format"); + return; + } + const { access_token, refresh_token, expires_in } = parsedToken.data; const expiry_date = new Date(); expiry_date.setSeconds(expiry_date.getSeconds() + expires_in); @@ -126,6 +131,10 @@ export const getAirtableToken = async (environmentId: string) => { client_id, }); + if (!newToken) { + throw new Error("Failed to create new token"); + } + await createOrUpdateIntegration(environmentId, { type: "airtable", config: {