import { NextRequest, NextResponse } from "next/server"; import { GridColDef } from "@mui/x-data-grid-pro"; import { Database, db, getWorkerUtils } from "bridge-common"; import { getServiceTable } from "../config/config"; const entities = [ "facebook", "whatsapp", "signal", "voice", "webhooks", "users", ] as const; export type Entity = (typeof entities)[number]; export type SelectOption = { value: string; label: string; }; export type FieldDescription = { name: string; label: string; kind?: "text" | "phone" | "select" | "multi" | "qrcode"; getValue?: (token: string) => Promise; refreshInterval?: number; getOptions?: (formState: any) => Promise; autogenerated?: "token"; hidden?: boolean; type?: string; lines?: number; copyable?: boolean; refreshable?: boolean; defaultValue?: string; required?: boolean; disabled?: boolean; size?: number; helperText?: string; }; export type ServiceConfig = { entity: Entity; table: keyof Database; displayName: string; createFields: FieldDescription[]; updateFields: FieldDescription[]; displayFields: FieldDescription[]; listColumns: GridColDef[]; }; export type ServiceParams = { params: { service: string; token?: string; }; }; export class Service { async getBot({ params: { service, token }, }: ServiceParams): Promise { const table = getServiceTable(service); const row = await db .selectFrom(table) .selectAll() .where("token", "=", token ?? "NEVER_MATCH") .executeTakeFirstOrThrow(); return NextResponse.json(row); } async registerBot({ params: { service, token }, }: ServiceParams): Promise { return NextResponse.error() as any; } async sendMessage( req: NextRequest, { params: { service, token } }: ServiceParams, ): Promise { const json = await req.json(); const worker = await getWorkerUtils(); await worker.addJob(`${service}/send-${service}-message`, { token, ...json, }); return NextResponse.json({ response: "ok" }); } async receiveMessage( req: NextRequest, { params: { service, token } }: ServiceParams, ): Promise { console.log("INTO receiveMessage"); const json = await req.json(); console.log({ json }); const worker = await getWorkerUtils(); await worker.addJob(`${service}/receive-${service}-message`, { token, ...json, }); return NextResponse.json({ response: "ok" }); } async handleWebhook(_req: NextRequest): Promise { return NextResponse.error() as any; } }