DB-backed workspace + LangGraph agent
This commit is contained in:
53
Frontend/server/api/communications.post.ts
Normal file
53
Frontend/server/api/communications.post.ts
Normal file
@@ -0,0 +1,53 @@
|
||||
import { readBody } from "h3";
|
||||
import { prisma } from "../utils/prisma";
|
||||
import { getAuthContext } from "../utils/auth";
|
||||
|
||||
function toDbChannel(channel: string) {
|
||||
const c = channel.toLowerCase();
|
||||
if (c === "telegram") return "TELEGRAM";
|
||||
if (c === "whatsapp") return "WHATSAPP";
|
||||
if (c === "instagram") return "INSTAGRAM";
|
||||
if (c === "email") return "EMAIL";
|
||||
return "PHONE";
|
||||
}
|
||||
|
||||
export default defineEventHandler(async (event) => {
|
||||
const auth = await getAuthContext(event);
|
||||
const body = await readBody<{
|
||||
contact?: string;
|
||||
channel?: string;
|
||||
kind?: "message" | "call";
|
||||
direction?: "in" | "out";
|
||||
text?: string;
|
||||
at?: string;
|
||||
durationSec?: number;
|
||||
transcript?: string[];
|
||||
}>(event);
|
||||
|
||||
const contactName = (body?.contact ?? "").trim();
|
||||
if (!contactName) throw createError({ statusCode: 400, statusMessage: "contact is required" });
|
||||
|
||||
const contact = await prisma.contact.findFirst({
|
||||
where: { teamId: auth.teamId, name: contactName },
|
||||
select: { id: true, name: true },
|
||||
});
|
||||
if (!contact) throw createError({ statusCode: 404, statusMessage: "contact not found" });
|
||||
|
||||
const occurredAt = body?.at ? new Date(body.at) : new Date();
|
||||
if (Number.isNaN(occurredAt.getTime())) throw createError({ statusCode: 400, statusMessage: "at is invalid" });
|
||||
|
||||
const created = await prisma.contactMessage.create({
|
||||
data: {
|
||||
contactId: contact.id,
|
||||
kind: body?.kind === "call" ? "CALL" : "MESSAGE",
|
||||
direction: body?.direction === "in" ? "IN" : "OUT",
|
||||
channel: toDbChannel(body?.channel ?? "Phone") as any,
|
||||
content: (body?.text ?? "").trim(),
|
||||
durationSec: typeof body?.durationSec === "number" ? body.durationSec : null,
|
||||
transcriptJson: Array.isArray(body?.transcript) ? body.transcript : undefined,
|
||||
occurredAt,
|
||||
},
|
||||
});
|
||||
|
||||
return { ok: true, id: created.id };
|
||||
});
|
||||
Reference in New Issue
Block a user