Implantação da geração de mensagem de forma livre e mudança na engine de mensagem
This commit is contained in:
75
app/controllers/admin/mensagem_templates_controller.rb
Normal file
75
app/controllers/admin/mensagem_templates_controller.rb
Normal file
@@ -0,0 +1,75 @@
|
||||
# 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::Variaveis.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
|
||||
Reference in New Issue
Block a user