Co-authored-by: peer@cal.com <peer@cal.com> Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Amit Sharma <74371312+Amit91848@users.noreply.github.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com>
96 lines
2.8 KiB
TypeScript
96 lines
2.8 KiB
TypeScript
import { cookies, headers } from "next/headers";
|
|
import { NextResponse } from "next/server";
|
|
import { z } from "zod";
|
|
|
|
import { getServerSession } from "@calcom/features/auth/lib/getServerSession";
|
|
import { IS_PLAIN_CHAT_ENABLED } from "@calcom/lib/constants";
|
|
import logger from "@calcom/lib/logger";
|
|
import { safeStringify } from "@calcom/lib/safeStringify";
|
|
|
|
import { buildLegacyRequest } from "@lib/buildLegacyCtx";
|
|
import { plain, upsertPlainCustomer } from "@lib/plain/plain";
|
|
|
|
const contactFormSchema = z.object({
|
|
message: z.string().min(1, "Message is required"),
|
|
attachmentIds: z.array(z.string()).optional(),
|
|
});
|
|
|
|
const log = logger.getSubLogger({ prefix: [`/api/support`] });
|
|
|
|
export async function POST(req: Request) {
|
|
if (!IS_PLAIN_CHAT_ENABLED) {
|
|
return NextResponse.json({ error: "Plain Chat is not enabled" }, { status: 404 });
|
|
}
|
|
|
|
const session = await getServerSession({ req: buildLegacyRequest(await headers(), await cookies()) });
|
|
if (!session?.user?.email) {
|
|
return NextResponse.json({ error: "Unauthorized - No session found" }, { status: 401 });
|
|
}
|
|
|
|
try {
|
|
const body = await req.json();
|
|
const { message, attachmentIds } = contactFormSchema.parse(body);
|
|
|
|
const plainApiKey = process.env.PLAIN_API_KEY;
|
|
if (!plainApiKey) {
|
|
return NextResponse.json({ error: "Plain API key not configured" }, { status: 500 });
|
|
}
|
|
|
|
let plainCustomerId: string | null = null;
|
|
|
|
const plainCustomer = await plain.getCustomerByEmail({ email: session.user.email });
|
|
|
|
if (plainCustomer.data) {
|
|
plainCustomerId = plainCustomer.data.id;
|
|
} else {
|
|
const { data, error } = await upsertPlainCustomer({
|
|
email: session.user.email,
|
|
id: session.user.id,
|
|
name: session.user.name,
|
|
});
|
|
|
|
if (error) {
|
|
log.error(`Error submitting plain contact form: `, safeStringify(error));
|
|
return NextResponse.json(
|
|
{
|
|
message: error.message,
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
|
|
if (data) {
|
|
plainCustomerId = data.customer.id;
|
|
}
|
|
}
|
|
|
|
if (!plainCustomerId) {
|
|
return NextResponse.json({ message: "Plain customer not found" }, { status: 404 });
|
|
}
|
|
|
|
const { data, error } = await plain.createThread({
|
|
customerIdentifier: {
|
|
customerId: plainCustomerId,
|
|
},
|
|
components: [
|
|
{
|
|
componentText: {
|
|
text: message,
|
|
},
|
|
},
|
|
],
|
|
attachmentIds,
|
|
});
|
|
|
|
if (error) {
|
|
log.error("Error creating plain contact form thread: ", safeStringify(error));
|
|
return NextResponse.json({ message: error.message }, { status: 500 });
|
|
}
|
|
|
|
return NextResponse.json(data);
|
|
} catch (err) {
|
|
log.error(`Error submitting plain contact form: `, safeStringify(err));
|
|
return NextResponse.json({ message: "Unexpected error occured" }, { status: 500 });
|
|
}
|
|
}
|