From 84fff38d94ec85d5acc50553098436b45dbb000d Mon Sep 17 00:00:00 2001 From: Rodrigo Borba Date: Sun, 1 Mar 2026 22:17:27 -0300 Subject: [PATCH] refactor: move notification templates de units para inboxes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Arquitetura corrigida: templates agora pertencem à inbox (WhatsApp), não à unidade PIX (que é uma config financeira, não de mensagens) - Migration: troca FK captain_unit_id -> inbox_id (up/down explícito) - Model: belongs_to :inbox; scope for_inbox - Controller: escopo via account.inboxes.find(inbox_id) - Rotas: move de captain/units/:id → inboxes/:id/notification_templates - Scanner job: joins(:conversation).where(conversations: {inbox_id:}) - UI: página /captain/notifications com seletor de inbox no topo (chips clicáveis, templates carregam por watch no selectedInboxId) - i18n PT/EN: novas keys INBOX_LABEL, SELECT_INBOX_HINT, EMPTY --- .../api/captain/notificationTemplates.js | 23 +- .../dashboard/i18n/locale/en/captain.json | 7 + .../dashboard/i18n/locale/pt_BR/captain.json | 7 + .../settings/captain/captain.routes.js | 2 +- .../settings/captain/notifications/Index.vue | 404 +++++++++++------- .../store/captain/notificationTemplates.js | 104 ++--- config/routes.rb | 6 +- ..._change_notification_templates_to_inbox.rb | 26 ++ db/schema.rb | 9 +- .../notification_templates_controller.rb | 43 +- .../notifications/notification_scanner_job.rb | 5 +- .../models/captain/notification_template.rb | 13 +- enterprise/app/models/captain/unit.rb | 2 - 13 files changed, 372 insertions(+), 279 deletions(-) create mode 100644 db/migrate/20260301200000_change_notification_templates_to_inbox.rb diff --git a/app/javascript/dashboard/api/captain/notificationTemplates.js b/app/javascript/dashboard/api/captain/notificationTemplates.js index 2a5fbac48..b98bd0173 100644 --- a/app/javascript/dashboard/api/captain/notificationTemplates.js +++ b/app/javascript/dashboard/api/captain/notificationTemplates.js @@ -1,30 +1,29 @@ -/* global axios */ import ApiClient from '../ApiClient'; -class CaptainNotificationTemplatesAPI extends ApiClient { +class NotificationTemplatesAPI extends ApiClient { constructor() { - super('captain/units', { accountScoped: true }); + super('inboxes', { accountScoped: true }); } - getTemplates(unitId) { - return axios.get(`${this.url}/${unitId}/notification_templates`); + getAll(inboxId) { + return this.get(`${inboxId}/notification_templates`); } - createTemplate(unitId, data) { - return axios.post(`${this.url}/${unitId}/notification_templates`, { + create(inboxId, data) { + return this.post(`${inboxId}/notification_templates`, { notification_template: data, }); } - updateTemplate(unitId, id, data) { - return axios.patch(`${this.url}/${unitId}/notification_templates/${id}`, { + update(inboxId, id, data) { + return this.patch(`${inboxId}/notification_templates/${id}`, { notification_template: data, }); } - deleteTemplate(unitId, id) { - return axios.delete(`${this.url}/${unitId}/notification_templates/${id}`); + delete(inboxId, id) { + return this.delete(`${inboxId}/notification_templates/${id}`); } } -export default new CaptainNotificationTemplatesAPI(); +export default new NotificationTemplatesAPI(); diff --git a/app/javascript/dashboard/i18n/locale/en/captain.json b/app/javascript/dashboard/i18n/locale/en/captain.json index c70a4c2d8..85fce456a 100644 --- a/app/javascript/dashboard/i18n/locale/en/captain.json +++ b/app/javascript/dashboard/i18n/locale/en/captain.json @@ -476,6 +476,13 @@ "DELETE": { "SUCCESS": "Notification removed.", "ERROR": "Error removing notification." + }, + "INBOX_LABEL": "Select inbox", + "NO_CAPTAIN_INBOXES": "No inboxes with Captain configured.", + "SELECT_INBOX_HINT": "Click an inbox above to view and configure its templates.", + "EMPTY": { + "TITLE": "No templates configured", + "DESC": "Create automatic message templates for this inbox." } } } diff --git a/app/javascript/dashboard/i18n/locale/pt_BR/captain.json b/app/javascript/dashboard/i18n/locale/pt_BR/captain.json index 4d0f2c60b..d3b3806dd 100644 --- a/app/javascript/dashboard/i18n/locale/pt_BR/captain.json +++ b/app/javascript/dashboard/i18n/locale/pt_BR/captain.json @@ -477,6 +477,13 @@ "DELETE": { "SUCCESS": "Notificação removida.", "ERROR": "Erro ao remover notificação." + }, + "INBOX_LABEL": "Selecione a caixa de entrada", + "NO_CAPTAIN_INBOXES": "Nenhuma caixa de entrada com Captain configurado.", + "SELECT_INBOX_HINT": "Clique em uma caixa de entrada acima para ver e configurar os templates.", + "EMPTY": { + "TITLE": "Nenhum template configurado", + "DESC": "Crie templates de mensagem automática para esta caixa de entrada." } } } diff --git a/app/javascript/dashboard/routes/dashboard/settings/captain/captain.routes.js b/app/javascript/dashboard/routes/dashboard/settings/captain/captain.routes.js index 5a89b37bd..91f75deb3 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/captain/captain.routes.js +++ b/app/javascript/dashboard/routes/dashboard/settings/captain/captain.routes.js @@ -79,7 +79,7 @@ export default { }, }, { - path: 'units/:unitId/notifications', + path: 'notifications', name: 'captain_settings_notifications', component: NotificationsIndex, meta: { diff --git a/app/javascript/dashboard/routes/dashboard/settings/captain/notifications/Index.vue b/app/javascript/dashboard/routes/dashboard/settings/captain/notifications/Index.vue index 7bf2184a9..10123e2f8 100644 --- a/app/javascript/dashboard/routes/dashboard/settings/captain/notifications/Index.vue +++ b/app/javascript/dashboard/routes/dashboard/settings/captain/notifications/Index.vue @@ -1,6 +1,5 @@