import { Injectable } from '@nestjs/common'; import { DatabaseService } from '../../../infra/database/database.service'; @Injectable() export class WhatsappTemplateRepository { constructor(private readonly database: DatabaseService) {} listTemplates() { return this.database.query(` SELECT wt.*, a.nome AS area_nome FROM whatsapp_templates wt LEFT JOIN areas a ON a.id = wt.area_id ORDER BY wt.id ASC `); } getTemplateById(id: number) { return this.database.query('SELECT * FROM whatsapp_templates WHERE id = $1 LIMIT 1', [id]); } saveTemplate(input: { name: string; content: string; category: string; areaId?: number | null; status: string; requestedByRole: string; adminApprovedAtSql: 'NULL' | 'CURRENT_TIMESTAMP'; metaSubmittedAtSql: 'NULL' | 'CURRENT_TIMESTAMP'; }) { return this.database.query( ` INSERT INTO whatsapp_templates ( name, content, category, area_id, status, requested_by_role, admin_approved_at, meta_submitted_at, meta_approved_at, updated_at ) VALUES ($1, $2, $3, $4, $5, $6, ${input.adminApprovedAtSql}, ${input.metaSubmittedAtSql}, NULL, CURRENT_TIMESTAMP) ON CONFLICT (name) DO UPDATE SET content = EXCLUDED.content, category = EXCLUDED.category, area_id = EXCLUDED.area_id, status = EXCLUDED.status, requested_by_role = EXCLUDED.requested_by_role, admin_approved_at = EXCLUDED.admin_approved_at, meta_submitted_at = EXCLUDED.meta_submitted_at, meta_approved_at = NULL, updated_at = CURRENT_TIMESTAMP RETURNING * `, [input.name, input.content, input.category, input.areaId || null, input.status, input.requestedByRole], ); } updateTemplate(id: number, input: { name: string; content: string; category: string; areaId?: number | null }) { return this.database.query( ` UPDATE whatsapp_templates SET name = $1, content = $2, category = $3, area_id = $4, status = 'meta_review', admin_approved_at = CURRENT_TIMESTAMP, meta_submitted_at = CURRENT_TIMESTAMP, meta_approved_at = NULL, updated_at = CURRENT_TIMESTAMP WHERE id = $5 RETURNING * `, [input.name, input.content, input.category, input.areaId || null, id], ); } approveTemplateByAdmin(id: number) { return this.database.query( ` UPDATE whatsapp_templates SET status = 'meta_review', admin_approved_at = CURRENT_TIMESTAMP, meta_submitted_at = CURRENT_TIMESTAMP, meta_approved_at = NULL, updated_at = CURRENT_TIMESTAMP WHERE id = $1 RETURNING * `, [id], ); } rejectTemplateByAdmin(id: number) { return this.database.query( ` UPDATE whatsapp_templates SET status = 'rejected', updated_at = CURRENT_TIMESTAMP WHERE id = $1 RETURNING * `, [id], ); } deleteTemplate(id: number) { return this.database.query('DELETE FROM whatsapp_templates WHERE id = $1', [id]); } refreshMetaApprovals() { return this.database.query(` UPDATE whatsapp_templates SET status = 'approved', meta_approved_at = COALESCE(meta_approved_at, meta_submitted_at + INTERVAL '15 minutes'), updated_at = CURRENT_TIMESTAMP WHERE status = 'meta_review' AND meta_submitted_at IS NOT NULL AND meta_submitted_at <= CURRENT_TIMESTAMP - INTERVAL '15 minutes' `); } }