# app/controllers/admin/mensagem_templates_controller.rb # # Editor de blocos: monta o corpo de UM evento em UM canal. # # O preview roda no SERVIDOR, chamando o mesmo Notificacao::Renderizador do # envio. Uma segunda implementação em JavaScript ficaria mais rápida e # inevitavelmente divergiria do que é enviado de verdade — e o preview existe # justamente para prometer o contrário. class Admin::MensagemTemplatesController < ApplicationController before_action :carregar def edit authorize @evento, :update? end def update authorize @evento, :update? @template.assign_attributes(atributos) if @template.save AuditoriaLog.registrar(user: current_user, acao: 'mensagem_template', entidade: 'MensagemTemplate', dados_novos: { detalhes: "Editou a mensagem de #{@evento.nome} (#{@canal})" }, request: request) redirect_to template_admin_evento_path(@evento, canal: @canal), notice: 'Mensagem salva.' else render :edit, status: :unprocessable_entity end end # Renderiza o que está NA TELA (ainda não salvo) com os valores de amostra. def preview authorize @evento, :update? provisorio = MensagemTemplate.new(evento_notificacao: @evento, canal: @canal, assunto: params[:assunto], blocos: blocos_do_form, ativo: true) provisorio.validate # dispara a limpeza dos blocos antes de renderizar dados = Notificacao::CatalogoVariaveis.amostra(@evento.gatilho) render json: { html: corpo_do_preview(provisorio, dados), assunto: provisorio.renderizador(dados).interpolar(provisorio.assunto) } end private def carregar @evento = EventoNotificacao.find(params[:id]) @canal = MensagemTemplate::CANAIS.include?(params[:canal]) ? params[:canal] : 'whatsapp' @template = @evento.template(@canal) @variaveis = @evento.variaveis end def atributos { assunto: params[:assunto].to_s.strip, blocos: blocos_do_form, ativo: params[:ativo] == '1' } end # O editor serializa o estado num campo hidden. JSON inválido vira lista # vazia: salvar lixo seria pior do que salvar nada, e o model ainda descarta # bloco fora do catálogo. def blocos_do_form JSON.parse(params[:blocos].to_s) rescue JSON::ParserError [] end # E-mail: HTML já montado e escapado pelo renderizador — vai para a tela como # está, dentro de um iframe sandbox na view. WhatsApp: texto puro, que a view # escapa. def corpo_do_preview(template, dados) r = template.renderizador(dados) template.email? ? r.html : r.texto end end