128 lines
5.8 KiB
JavaScript
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;
|
|
}
|