101 lines
2.5 KiB
TypeScript
101 lines
2.5 KiB
TypeScript
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,
|
|
};
|