WhatsApp/Signal/Formstack/admin updates

This commit is contained in:
Darren Clarke 2025-11-21 14:55:28 +01:00
parent bcecf61a46
commit d0cc5a21de
451 changed files with 16139 additions and 39623 deletions

View file

@ -5,19 +5,26 @@ import { getService } from "./utils";
export const getBot = async (
_req: NextRequest,
params: ServiceParams,
): Promise<NextResponse> => getService(params)?.getBot(params);
): Promise<NextResponse> => (await getService(params))?.getBot(params);
export const sendMessage = async (
req: NextRequest,
params: ServiceParams,
): Promise<NextResponse> => getService(params)?.sendMessage(req, params);
): Promise<NextResponse> =>
(await getService(params))?.sendMessage(req, params);
export const receiveMessage = async (
req: NextRequest,
params: ServiceParams,
): Promise<NextResponse> => getService(params)?.receiveMessage(req, params);
): Promise<NextResponse> =>
(await getService(params))?.receiveMessage(req, params);
export const handleWebhook = async (
req: NextRequest,
params: ServiceParams,
): Promise<NextResponse> => getService(params)?.handleWebhook(req);
): Promise<NextResponse> => (await getService(params))?.handleWebhook(req);
export const relinkBot = async (
_req: NextRequest,
params: ServiceParams,
): Promise<NextResponse> => (await getService(params))?.relink(params);

View file

@ -51,16 +51,15 @@ export type ServiceConfig = {
};
export type ServiceParams = {
params: {
params: Promise<{
service: string;
token?: string;
};
}>;
};
export class Service {
async getBot({
params: { service, token },
}: ServiceParams): Promise<NextResponse> {
async getBot({ params }: ServiceParams): Promise<NextResponse> {
const { service, token } = await params;
const table = getServiceTable(service);
const row = await db
.selectFrom(table)
@ -71,16 +70,15 @@ export class Service {
return NextResponse.json(row);
}
async registerBot({
params: { service, token },
}: ServiceParams): Promise<NextResponse> {
async registerBot({ params: _params }: ServiceParams): Promise<NextResponse> {
return NextResponse.error() as any;
}
async sendMessage(
req: NextRequest,
{ params: { service, token } }: ServiceParams,
{ params }: ServiceParams,
): Promise<NextResponse> {
const { service, token } = await params;
const table = getServiceTable(service);
const row = await db
.selectFrom(table)
@ -103,14 +101,14 @@ export class Service {
},
};
console.log(response);
return NextResponse.json(response);
}
async receiveMessage(
req: NextRequest,
{ params: { service, token } }: ServiceParams,
{ params }: ServiceParams,
): Promise<NextResponse> {
const { service, token } = await params;
const json = await req.json();
const worker = await getWorkerUtils();
await worker.addJob(`${service}/receive-${service}-message`, {
@ -124,4 +122,8 @@ export class Service {
async handleWebhook(_req: NextRequest): Promise<NextResponse> {
return NextResponse.error() as any;
}
async relink({ params: _params }: ServiceParams): Promise<NextResponse> {
return NextResponse.error() as any;
}
}

View file

@ -11,7 +11,8 @@ const fetchNoCache = async (url: string, options = {}) => {
};
export class Signal extends Service {
async getBot({ params: { token } }: ServiceParams) {
async getBot({ params }: ServiceParams) {
const { token } = await params;
const row = await db
.selectFrom("SignalBot")
.selectAll()

View file

@ -3,7 +3,10 @@ import { Facebook } from "./facebook";
import { Signal } from "./signal";
import { Whatsapp } from "./whatsapp";
export const getService = ({ params: { service } }: ServiceParams): Service => {
export const getService = async ({
params,
}: ServiceParams): Promise<Service> => {
const { service } = await params;
if (service === "facebook") {
return new Facebook();
} else if (service === "signal") {

View file

@ -4,7 +4,8 @@ import { revalidatePath } from "next/cache";
import { Service, ServiceParams } from "./service";
export class Whatsapp extends Service {
async getBot({ params: { token } }: ServiceParams) {
async getBot({ params }: ServiceParams) {
const { token } = await params;
const row = await db
.selectFrom("WhatsappBot")
.selectAll()
@ -30,4 +31,30 @@ export class Whatsapp extends Service {
return NextResponse.json(json);
}
async relink({ params }: ServiceParams) {
const { token } = await params;
const row = await db
.selectFrom("WhatsappBot")
.selectAll()
.where("token", "=", token as string)
.executeTakeFirstOrThrow();
const id = row.id;
// Step 1: Call unverify to remove the bot directory and disconnect
const unverifyUrl = `${process.env.BRIDGE_WHATSAPP_URL}/api/bots/${id}/unverify`;
await fetch(unverifyUrl, { method: "POST" });
// Step 2: Reset verified flag in database
await db
.updateTable("WhatsappBot")
.set({ verified: false })
.where("id", "=", id)
.execute();
// Step 3: Revalidate the path to refresh the UI
revalidatePath(`/whatsapp/${id}`);
return NextResponse.json({ success: true, message: "WhatsApp connection reset. Please scan the new QR code." });
}
}