| import { NextRequest, NextResponse } from "next/server"; |
| import { syncAndProcessGmail } from "@/lib/gmail/pipeline"; |
| import { loadConfig } from "@/lib/config"; |
| import { normalizeOrigin, getRequestOrigin } from "@/lib/utils"; |
| import { generateTelemetry } from "@/lib/telemetry/engine"; |
| import { detectCommitments } from "@/lib/commitment/detector"; |
| import { upsertCommitmentByEmailId } from "@/lib/commitment/store"; |
|
|
| export const dynamic = "force-dynamic"; |
| export const maxDuration = 120; |
|
|
| export async function POST(request: NextRequest) { |
| try { |
| const config = loadConfig(); |
| const body = await request.json().catch(() => ({})); |
|
|
| const clientId = body.clientId || process.env.GMAIL_CLIENT_ID || config.graph?.clientId || ""; |
| const clientSecret = body.clientSecret || process.env.GMAIL_CLIENT_SECRET || config.graph?.clientSecret || ""; |
|
|
| |
| const refreshToken = body.refreshToken || request.cookies.get("gmail-refresh-token")?.value || ""; |
|
|
| if (!clientId || !refreshToken) { |
| return NextResponse.json({ |
| error: "Gmail not connected. Go to Settings → Gmail Configuration and click Connect Gmail.", |
| }, { status: 401 }); |
| } |
|
|
| const maxEmails = body.maxEmails || 100; |
| const redirectUri = `${normalizeOrigin(getRequestOrigin(request))}/api/gmail/callback`; |
|
|
| const result = await syncAndProcessGmail( |
| { clientId, clientSecret, redirectUri, refreshToken, emailAddress: "" }, |
| maxEmails |
| ); |
|
|
| |
| let telemetry = null; |
| try { |
| telemetry = generateTelemetry(result.records); |
| } catch (e: any) { |
| console.error("Telemetry generation failed:", e.message); |
| } |
|
|
| let commitments = [] as any[]; |
| try { |
| commitments = detectCommitments(result.records || []); |
| for (const c of commitments) { |
| try { |
| upsertCommitmentByEmailId(c); |
| } catch (e: any) { |
| console.error("[gmail/sync] commitment upsert error:", e.message); |
| } |
| } |
| } catch (e: any) { |
| console.error("[gmail/sync] commitment detection error:", e.message); |
| } |
|
|
| return NextResponse.json({ ...result, telemetry, commitments }); |
| } catch (e: any) { |
| return NextResponse.json({ error: e.message }, { status: 500 }); |
| } |
| } |
|
|