diff options
| author | zwlucas <lucas.fariamo08@gmail.com> | 2026-07-25 21:23:29 +0000 |
|---|---|---|
| committer | zwlucas <lucas.fariamo08@gmail.com> | 2026-07-25 21:23:29 +0000 |
| commit | ef55d9bb24430610b60c1b77821307cd72c08c55 (patch) | |
| tree | e6935a810b34370b0a4c821e55f6397aac50c832 /api/src/modules/interactions/interactions.schema.ts | |
| download | helpdesk-master.tar.gz helpdesk-master.zip | |
Signed-off-by: zwlucas <lucas.fariamo08@gmail.com>
Diffstat (limited to 'api/src/modules/interactions/interactions.schema.ts')
| -rw-r--r-- | api/src/modules/interactions/interactions.schema.ts | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/api/src/modules/interactions/interactions.schema.ts b/api/src/modules/interactions/interactions.schema.ts new file mode 100644 index 0000000..59eec29 --- /dev/null +++ b/api/src/modules/interactions/interactions.schema.ts @@ -0,0 +1,101 @@ +/** + * interactions.schema.ts + * + * Schemas Zod para o módulo de interações: + * - Atualização de status de um ticket + * - Atribuição de agente + * - Adição de comentários / notas internas + */ + +import { z } from 'zod'; +import { TICKET_STATUSES, TICKET_PRIORITIES } from '@/db/schema.js'; + +// ─── Parâmetros de rota compartilhados ─────────────────────────────────────── + +export const ticketIdParamsSchema = z.object({ + ticketId: z.coerce.number().int().positive(), +}); + +export const commentIdParamsSchema = z.object({ + ticketId: z.coerce.number().int().positive(), + commentId: z.coerce.number().int().positive(), +}); + +export type TicketIdParams = z.infer<typeof ticketIdParamsSchema>; +export type CommentIdParams = z.infer<typeof commentIdParamsSchema>; + +// ─── Atualização de status ──────────────────────────────────────────────────── + +export const updateTicketStatusBodySchema = z.object({ + status: z.enum(TICKET_STATUSES, { + errorMap: () => ({ + message: `Status deve ser um de: ${TICKET_STATUSES.join(', ')}`, + }), + }), + + // Motivo da mudança — obrigatório ao fechar ou resolver um chamado + reason: z.string().trim().max(500).optional(), +}); + +export type UpdateTicketStatusBody = z.infer<typeof updateTicketStatusBodySchema>; + +// ─── Atribuição de agente ───────────────────────────────────────────────────── + +export const assignTicketBodySchema = z.object({ + assigneeId: z + .number({ required_error: 'assigneeId é obrigatório' }) + .int() + .positive(), +}); + +export type AssignTicketBody = z.infer<typeof assignTicketBodySchema>; + +// ─── Atualização de prioridade ──────────────────────────────────────────────── + +export const updateTicketPriorityBodySchema = z.object({ + priority: z.enum(TICKET_PRIORITIES, { + errorMap: () => ({ + message: `Prioridade deve ser uma de: ${TICKET_PRIORITIES.join(', ')}`, + }), + }), +}); + +export type UpdateTicketPriorityBody = z.infer<typeof updateTicketPriorityBodySchema>; + +// ─── Adição de comentário / nota interna ───────────────────────────────────── + +export const addCommentBodySchema = z.object({ + content: z + .string({ required_error: 'Conteúdo é obrigatório' }) + .min(1, 'Comentário não pode ser vazio') + .max(5000, 'Comentário muito longo') + .trim(), + + /** + * true → nota interna (só agentes/admins veem) + * false → resposta pública (solicitante recebe notificação) + */ + isInternal: z.boolean().default(false), + + // Em produção viria do JWT; por ora, aceito no body + authorId: z + .number({ required_error: 'authorId é obrigatório' }) + .int() + .positive(), +}); + +export type AddCommentBody = z.infer<typeof addCommentBodySchema>; + +// ─── Shape de resposta dos comentários ─────────────────────────────────────── + +export const commentResponseSchema = z.object({ + id: z.number(), + content: z.string(), + isInternal: z.boolean(), + ticketId: z.number(), + authorId: z.number(), + createdAt: z.string(), + updatedAt: z.string(), +}); + +export type CommentResponse = z.infer<typeof commentResponseSchema>; |