83 lines
2.8 KiB
TypeScript
83 lines
2.8 KiB
TypeScript
// modules/helpdesk/helpdesk.inbound.routes.ts
|
||
import { FastifyPluginAsync } from 'fastify'
|
||
import { createConversation } from '../modules/helpdesk/helpdesk.conversation.service.js'
|
||
import { addMessage } from '../modules/helpdesk/helpdesk.message.service.js'
|
||
import { getOrCreateContact } from '../modules/helpdesk/helpdesk.contact.service.js'
|
||
import { findCustomerOrContactByEmailOrDomain } from "../utils/helpers";
|
||
import { eq } from "drizzle-orm";
|
||
import { helpdesk_channel_instances } from "../../db/schema";
|
||
|
||
const helpdeskInboundRoutes: FastifyPluginAsync = async (server) => {
|
||
// Öffentliche POST-Route
|
||
server.post('/helpdesk/inbound/:public_token', async (req, res) => {
|
||
const { public_token } = req.params as { public_token: string }
|
||
const { email, phone, display_name, subject, message } = req.body as {
|
||
email: string,
|
||
phone: string,
|
||
display_name: string
|
||
subject: string
|
||
message: string
|
||
}
|
||
|
||
if (!message) {
|
||
return res.status(400).send({ error: 'Message content required' })
|
||
}
|
||
|
||
// 1️⃣ Kanalinstanz anhand des Tokens ermitteln
|
||
const channels = await server.db
|
||
.select()
|
||
.from(helpdesk_channel_instances)
|
||
.where(eq(helpdesk_channel_instances.publicToken, public_token))
|
||
.limit(1)
|
||
const channel = channels[0]
|
||
|
||
if (!channel) {
|
||
return res.status(404).send({ error: 'Invalid channel token' })
|
||
}
|
||
|
||
const tenant_id = channel.tenantId
|
||
const channel_instance_id = channel.id
|
||
|
||
// @ts-ignore
|
||
const {customer, contact: contactPerson} = await findCustomerOrContactByEmailOrDomain(server,email, tenant_id )
|
||
|
||
|
||
// 2️⃣ Kontakt finden oder anlegen
|
||
const contact = await getOrCreateContact(server, tenant_id, {
|
||
email,
|
||
phone,
|
||
display_name,
|
||
customer_id: customer,
|
||
contact_id: contactPerson,
|
||
})
|
||
|
||
// 3️⃣ Konversation erstellen
|
||
const conversation = await createConversation(server, {
|
||
tenant_id,
|
||
contact,
|
||
channel_instance_id,
|
||
subject: subject ?? 'Kontaktformular Anfrage',
|
||
customer_id: customer,
|
||
contact_person_id: contactPerson
|
||
})
|
||
|
||
// 4️⃣ Erste Nachricht hinzufügen
|
||
await addMessage(server, {
|
||
tenant_id,
|
||
conversation_id: conversation.id,
|
||
direction: 'incoming',
|
||
payload: { type: 'text', text: message },
|
||
raw_meta: { source: 'contact_form' },
|
||
})
|
||
|
||
// (optional) Auto-Antwort oder Event hier ergänzen
|
||
|
||
return res.status(201).send({
|
||
success: true,
|
||
conversation_id: conversation.id,
|
||
})
|
||
})
|
||
}
|
||
|
||
export default helpdeskInboundRoutes
|