# app/controllers/admin/configuracao_notificacoes_controller.rb # # Tela única (singleton) de SMTP + WhatsApp. Só admin — ver # ConfiguracaoNotificacaoPolicy. class Admin::ConfiguracaoNotificacoesController < ApplicationController before_action :set_config CAMPOS = %i[ smtp_ativo smtp_address smtp_port smtp_username smtp_password smtp_domain smtp_autenticacao remetente_email remetente_nome email_notificacoes_ativo email_admin whatsapp_ativo whatsapp_provedor whatsapp_intervalo_segundos whatsapp_admin twilio_account_sid twilio_auth_token twilio_from baileys_url baileys_token ].freeze def show authorize @config end # PATCH /admin/configuracao_notificacao # # Os botões "enviar teste" são submits DESTE MESMO form, diferenciados por # params[:acao]. Assim o teste sempre usa o que está na tela — evita o # clássico "digitei a senha nova, cliquei em testar, e ele testou a antiga". def update authorize @config antes = resumo unless @config.update(config_params) flash.now[:alert] = @config.errors.full_messages.to_sentence return render(:show, status: :unprocessable_entity) end auditar!(antes) case params[:acao] when 'testar_email' redirecionar(Notificacao::TesteEmail.new(@config, usuario: current_user).executar) when 'testar_whatsapp' redirecionar(Notificacao::TesteWhatsapp.new(@config).executar) else redirect_to admin_configuracao_notificacao_path, notice: 'Configurações de notificação salvas.' end end private def set_config @config = ConfiguracaoNotificacao.instancia end def redirecionar(resultado) redirect_to admin_configuracao_notificacao_path, **resultado.para_flash end def config_params permitidos = params.require(:configuracao_notificacao).permit(*CAMPOS) # Campo de senha em branco significa "mantenha a que já está gravada" — a # tela nunca exibe o valor, então salvar sem redigitar não pode apagá-lo. permitidos.delete(:smtp_password) if permitidos[:smtp_password].blank? permitidos.delete(:twilio_auth_token) if permitidos[:twilio_auth_token].blank? permitidos.delete(:baileys_token) if permitidos[:baileys_token].blank? permitidos end # ⚠️ NUNCA colocar senha ou token aqui: AuditoriaLog#dados_novos é exibido em # /admin/auditoria_logs, que gerente também acessa. Só o booleano de # "está definida ou não". def resumo { smtp_ativo: @config.smtp_ativo, smtp_address: @config.smtp_address, smtp_port: @config.smtp_port, smtp_username: @config.smtp_username, smtp_domain: @config.smtp_domain, smtp_autenticacao: @config.smtp_autenticacao, remetente_email: @config.remetente_email, remetente_nome: @config.remetente_nome, email_admin: @config.email_admin, email_notificacoes_ativo: @config.email_notificacoes_ativo, whatsapp_ativo: @config.whatsapp_ativo, whatsapp_provedor: @config.whatsapp_provedor, whatsapp_intervalo: @config.whatsapp_intervalo_segundos, twilio_account_sid: @config.twilio_account_sid, twilio_from: @config.twilio_from, whatsapp_admin: @config.whatsapp_admin, baileys_url: @config.baileys_url, smtp_password_definida: @config.smtp_password?, twilio_auth_token_definido: @config.twilio_auth_token?, baileys_token_definido: @config.baileys_token? } end def auditar!(antes) AuditoriaLog.registrar( user: current_user, acao: 'editar_notificacoes', entidade: 'ConfiguracaoNotificacao', entidade_id: @config.id, dados_anteriores: antes, dados_novos: resumo, request: request ) end end