omnichannel-backend/src/modules/whatsapp/repositories/whatsapp-template.repository.ts

133 lines
3.7 KiB
TypeScript
Raw Normal View History

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'
`);
}
}