link-stack/apps/bridge-frontend/app/_lib/facebook.ts

102 lines
2.5 KiB
TypeScript
Raw Normal View History

2024-03-16 19:39:20 +01:00
import { NextRequest, NextResponse } from "next/server";
2024-04-29 17:27:25 +02:00
import { makeWorkerUtils, WorkerUtils } from "graphile-worker";
import { Service } from "./service";
import { db } from "./database";
2024-03-16 19:39:20 +01:00
2024-04-29 17:27:25 +02:00
let workerUtils: WorkerUtils;
2024-03-16 19:39:20 +01:00
2024-04-29 17:27:25 +02:00
const getWorkerUtils = async () => {
if (!workerUtils) {
workerUtils = await makeWorkerUtils({
connectionString: process.env.DATABASE_URL,
});
}
2024-03-16 19:39:20 +01:00
2024-04-29 17:27:25 +02:00
return workerUtils;
2024-03-16 19:39:20 +01:00
};
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" });
};
2024-04-29 17:27:25 +02:00
const handleWebhook = async (req: NextRequest) => {
const { searchParams } = req.nextUrl;
const submittedToken = searchParams.get("hub.verify_token");
2024-03-16 19:39:20 +01:00
2024-04-29 17:27:25 +02:00
if (submittedToken) {
console.log({ submittedToken });
const row = await db
.selectFrom("FacebookBot")
.selectAll()
.where("verifyToken", "=", submittedToken)
.executeTakeFirst();
2024-03-16 19:39:20 +01:00
2024-04-29 17:27:25 +02:00
console.log({ row });
2024-03-16 19:39:20 +01:00
2024-04-29 17:27:25 +02:00
if (!row) {
return NextResponse.error();
}
2024-04-21 08:11:24 +02:00
2024-04-29 17:27:25 +02:00
if (searchParams.get("hub.mode") === "subscribe") {
const challenge = searchParams.get("hub.challenge");
console.log(submittedToken);
console.log(challenge);
2024-04-21 08:11:24 +02:00
2024-04-29 17:27:25 +02:00
return NextResponse.json(challenge) as any;
}
2024-04-21 08:11:24 +02:00
}
2024-04-29 17:27:25 +02:00
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);
2024-04-21 08:11:24 +02:00
return NextResponse.json({ response: "ok" });
};
2024-03-16 19:39:20 +01:00
export const Facebook: Service = {
sendMessage,
receiveMessages,
2024-04-21 08:11:24 +02:00
handleWebhook,
2024-03-16 19:39:20 +01:00
};