link-stack/packages/bridge-ui/lib/service.ts

105 lines
2.4 KiB
TypeScript
Raw Normal View History

2024-03-16 19:39:20 +01:00
import { NextRequest, NextResponse } from "next/server";
2024-04-26 14:31:33 +02:00
import { GridColDef } from "@mui/x-data-grid-pro";
2024-04-30 11:39:16 +02:00
import { Database, db, getWorkerUtils } from "bridge-common";
import { getServiceTable } from "../config/config";
2024-03-16 19:39:20 +01:00
2024-04-26 14:31:33 +02:00
const entities = [
"facebook",
"whatsapp",
"signal",
"voice",
2024-04-26 15:49:58 +02:00
"webhooks",
"users",
2024-04-26 14:31:33 +02:00
] as const;
export type Entity = (typeof entities)[number];
2024-04-29 17:27:25 +02:00
export type SelectOption = {
value: string;
label: string;
};
2024-04-26 14:31:33 +02:00
export type FieldDescription = {
name: string;
label: string;
kind?: "text" | "phone" | "select" | "multi" | "qrcode";
getValue?: (id: string) => Promise<string>;
refreshInterval?: number;
2024-04-29 17:27:25 +02:00
getOptions?: (formState: any) => Promise<SelectOption[]>;
2024-04-26 16:29:13 +02:00
autogenerated?: "token";
hidden?: boolean;
2024-04-26 15:49:58 +02:00
type?: string;
2024-04-26 14:31:33 +02:00
lines?: number;
copyable?: boolean;
2024-04-26 16:29:13 +02:00
refreshable?: boolean;
2024-04-26 14:31:33 +02:00
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[];
};
2024-04-30 11:39:16 +02:00
export type ServiceParams = {
2024-04-30 13:13:49 +02:00
params: {
service: string;
token?: string;
};
2024-04-30 11:39:16 +02:00
};
2024-04-29 17:27:25 +02:00
export class Service {
2024-04-30 13:13:49 +02:00
async getBot({
params: { service, token },
}: ServiceParams): Promise<NextResponse> {
2024-04-30 11:39:16 +02:00
const table = getServiceTable(service);
const row = await db
.selectFrom(table)
.selectAll()
.where("token", "=", token ?? "NEVER_MATCH")
.executeTakeFirstOrThrow();
return NextResponse.json(row);
}
async sendMessage(
req: NextRequest,
2024-04-30 13:13:49 +02:00
{ params: { service, token } }: ServiceParams,
2024-04-30 11:39:16 +02:00
): Promise<NextResponse> {
const message = await req.json();
const worker = await getWorkerUtils();
2024-04-30 13:13:49 +02:00
await worker.addJob(`${service}/send-${service}-message`, {
token,
message,
});
2024-04-30 11:39:16 +02:00
return NextResponse.json({ response: "ok" });
}
2024-05-15 10:27:14 +02:00
async receiveMessage(
req: NextRequest,
{ params: { service, token } }: ServiceParams,
): Promise<NextResponse> {
const message = await req.json();
const worker = await getWorkerUtils();
await worker.addJob(`${service}/receive-${service}-message`, {
token,
message,
});
return NextResponse.json({ response: "ok" });
}
2024-04-30 11:39:16 +02:00
async handleWebhook(_req: NextRequest): Promise<NextResponse> {
return NextResponse.error() as any;
}
2024-04-29 17:27:25 +02:00
}