# Configuração de SMTP e WhatsApp (Twilio) gravada no BANCO, editável pelo ADM # em /admin/configuracao_notificacao — antes disso tudo vinha só do .env e mudar # um servidor de e-mail exigia editar o arquivo no servidor e reiniciar. # # Tabela SINGLETON: uma linha só. `singleton_guard` com índice único é o que # impede dois workers Puma criarem linhas concorrentes no primeiro acesso. # # As credenciais NÃO são importadas do ENV aqui de propósito: os campos nascem # vazios e `smtp_ativo`/`whatsapp_ativo` respeitam as flags antigas, então # `smtp_pronto?`/`whatsapp_pronto?` dão false e o app segue usando o .env # exatamente como hoje até o admin preencher a tela. class CreateConfiguracaoNotificacoes < ActiveRecord::Migration[7.1] def up create_table :configuracao_notificacoes do |t| t.integer :singleton_guard, null: false, default: 0 # ── E-mail / SMTP ─────────────────────────────────────── t.boolean :smtp_ativo, null: false, default: false t.string :smtp_address t.integer :smtp_port, null: false, default: 587 t.string :smtp_username t.text :smtp_password_cifrado # AES-256-GCM (concern AtributoCifrado) t.string :smtp_domain t.string :smtp_autenticacao, null: false, default: 'plain' t.string :remetente_email t.string :remetente_nome # ── Destinatários administrativos ─────────────────────── t.string :email_admin t.string :whatsapp_admin # ── Notificação aos motoristas ────────────────────────── t.boolean :email_notificacoes_ativo, null: false, default: false # ── WhatsApp / Twilio ─────────────────────────────────── t.boolean :whatsapp_ativo, null: false, default: false t.string :twilio_account_sid t.text :twilio_auth_token_cifrado # AES-256-GCM t.string :twilio_from t.timestamps end add_index :configuracao_notificacoes, :singleton_guard, unique: true # Herda as flags que hoje moram em `configuracoes` (chave/valor) e que nunca # tiveram UI. SQL cru de propósito: migration não deve depender de model. whats = select_value("SELECT valor FROM configuracoes WHERE chave = 'notificacao_whatsapp'") email = select_value("SELECT valor FROM configuracoes WHERE chave = 'notificacao_email'") execute(<<~SQL.squish) INSERT INTO configuracao_notificacoes (singleton_guard, whatsapp_ativo, email_notificacoes_ativo, smtp_ativo, smtp_port, smtp_autenticacao, created_at, updated_at) VALUES (0, #{whats == 'true'}, #{email == 'true'}, false, 587, 'plain', NOW(), NOW()) SQL end def down drop_table :configuracao_notificacoes end end