import { NextRequest, NextResponse } from "next/server"; import { makeWorkerUtils, WorkerUtils } from "graphile-worker"; import { Service } from "./service"; import { db } from "./database"; let workerUtils: WorkerUtils; const getWorkerUtils = async () => { if (!workerUtils) { workerUtils = await makeWorkerUtils({ connectionString: process.env.DATABASE_URL, }); } return workerUtils; }; const sendMessage = async (req: NextRequest) => { console.log({ req }); return NextResponse.json({ response: "ok" }); }; const receiveMessages = async (req: NextRequest) => { console.log({ req }); return NextResponse.json({ response: "ok" }); }; const handleWebhook = async (req: NextRequest) => { const { searchParams } = req.nextUrl; const submittedToken = searchParams.get("hub.verify_token"); if (submittedToken) { console.log({ submittedToken }); const row = await db .selectFrom("FacebookBot") .selectAll() .where("verifyToken", "=", submittedToken) .executeTakeFirst(); console.log({ row }); if (!row) { return NextResponse.error(); } if (searchParams.get("hub.mode") === "subscribe") { const challenge = searchParams.get("hub.challenge"); console.log(submittedToken); console.log(challenge); return NextResponse.json(challenge) as any; } } const message = await req.json(); console.log({ message }); const entry = message.entry[0]; console.log({ entry }); const messaging = entry?.messaging[0]; const pageId = messaging?.recipient?.id; console.log({ pageId }); const row = await db .selectFrom("FacebookBot") .selectAll() .where("pageId", "=", pageId) .executeTakeFirst(); console.log({ row }); const endpoint = `https://graph.facebook.com/v19.0/${pageId}/messages`; const inMessage = messaging?.message?.text; const outgoingMessage = { recipient: { id: messaging?.sender?.id }, message: { text: `"${inMessage}", right back at you!` }, messaging_type: "RESPONSE", access_token: row?.pageAccessToken, }; console.log({ outgoingMessage }); const response = await fetch(endpoint, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(outgoingMessage), }); console.log({ response }); console.log(message); const wu = await getWorkerUtils(); await wu.addJob("receive_facebook_message", message); return NextResponse.json({ response: "ok" }); }; export const Facebook: Service = { sendMessage, receiveMessages, handleWebhook, };