133 lines
3.7 KiB
TypeScript
133 lines
3.7 KiB
TypeScript
|
|
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'
|
||
|
|
`);
|
||
|
|
}
|
||
|
|
}
|