Files
scoreodonto.com/backend/dist/modules/templates/template.routes.js
T

128 lines
5.8 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.buildTemplateRoutes = buildTemplateRoutes;
/**
* Rotas de Templates de Mensagem
*
* GET /api/templates — Lista templates do tenant
* POST /api/templates — Cria template
* GET /api/templates/:id — Detalhe do template
* PUT /api/templates/:id — Atualiza template
* DELETE /api/templates/:id — Remove template
* POST /api/templates/:id/use — Incrementa usageCount (IA chama ao usar)
*/
const express_1 = require("express");
const zod_1 = require("zod");
const prisma_1 = require("../../infra/database/prisma");
const templateTypeValues = ['TEXT', 'BUTTONS', 'INTERACTIVE', 'LIST', 'POLL', 'CAROUSEL'];
const templateSchema = zod_1.z.object({
name: zod_1.z.string().min(1).max(100),
description: zod_1.z.string().max(500).optional(),
type: zod_1.z.enum(templateTypeValues),
payload: zod_1.z.record(zod_1.z.unknown()),
tags: zod_1.z.array(zod_1.z.string()).default([]),
});
function getId(req) {
const id = req.params['id'];
return Array.isArray(id) ? id[0] : id;
}
function buildTemplateRoutes() {
const router = (0, express_1.Router)();
// ── LIST ──────────────────────────────────────────────────────────────────
router.get('/', async (req, res) => {
const tenantId = req.tenantId;
const type = Array.isArray(req.query['type']) ? req.query['type'][0] : req.query['type'];
const search = Array.isArray(req.query['search']) ? req.query['search'][0] : req.query['search'];
const templates = await prisma_1.prisma.messageTemplate.findMany({
where: {
tenantId,
...(type ? { type: type } : {}),
...(search ? { name: { contains: search, mode: 'insensitive' } } : {}),
},
orderBy: [{ usageCount: 'desc' }, { createdAt: 'desc' }],
});
res.json(templates);
});
// ── CREATE ────────────────────────────────────────────────────────────────
router.post('/', async (req, res) => {
const tenantId = req.tenantId;
const parse = templateSchema.safeParse(req.body);
if (!parse.success) {
res.status(400).json({ error: parse.error.errors });
return;
}
const { name, description, type, payload, tags } = parse.data;
const template = await prisma_1.prisma.messageTemplate.create({
data: { tenantId, name, description, type, payload: payload, tags },
});
res.status(201).json(template);
});
// ── GET ONE ───────────────────────────────────────────────────────────────
router.get('/:id', async (req, res) => {
const tenantId = req.tenantId;
const template = await prisma_1.prisma.messageTemplate.findFirst({
where: { id: getId(req), tenantId },
});
if (!template) {
res.status(404).json({ error: 'Template não encontrado' });
return;
}
res.json(template);
});
// ── UPDATE ────────────────────────────────────────────────────────────────
router.put('/:id', async (req, res) => {
const tenantId = req.tenantId;
const id = getId(req);
const exists = await prisma_1.prisma.messageTemplate.findFirst({
where: { id, tenantId },
});
if (!exists) {
res.status(404).json({ error: 'Template não encontrado' });
return;
}
const parse = templateSchema.partial().safeParse(req.body);
if (!parse.success) {
res.status(400).json({ error: parse.error.errors });
return;
}
const { payload, ...rest } = parse.data;
const updated = await prisma_1.prisma.messageTemplate.update({
where: { id },
data: { ...rest, ...(payload !== undefined ? { payload: payload } : {}) },
});
res.json(updated);
});
// ── DELETE ────────────────────────────────────────────────────────────────
router.delete('/:id', async (req, res) => {
const tenantId = req.tenantId;
const id = getId(req);
const exists = await prisma_1.prisma.messageTemplate.findFirst({
where: { id, tenantId },
});
if (!exists) {
res.status(404).json({ error: 'Template não encontrado' });
return;
}
await prisma_1.prisma.messageTemplate.delete({ where: { id } });
res.status(204).send();
});
// ── USE (IA incrementa uso) ────────────────────────────────────────────────
router.post('/:id/use', async (req, res) => {
const tenantId = req.tenantId;
const id = getId(req);
const exists = await prisma_1.prisma.messageTemplate.findFirst({
where: { id, tenantId },
});
if (!exists) {
res.status(404).json({ error: 'Template não encontrado' });
return;
}
await prisma_1.prisma.messageTemplate.update({
where: { id },
data: { usageCount: { increment: 1 } },
});
res.json({ ok: true });
});
return router;
}