Implantação da geração de mensagem de forma livre e mudança na engine de mensagem
This commit is contained in:
80
app/controllers/admin/whatsapp_sessoes_controller.rb
Normal file
80
app/controllers/admin/whatsapp_sessoes_controller.rb
Normal file
@@ -0,0 +1,80 @@
|
||||
# app/controllers/admin/whatsapp_sessoes_controller.rb
|
||||
#
|
||||
# Pareamento do WhatsApp por QR code (ponte Baileys, container `whatsapp`).
|
||||
#
|
||||
# ⚠️ Canal NÃO OFICIAL: parear liga o número da empresa a este servidor por uma
|
||||
# sessão do WhatsApp Web obtida por engenharia reversa. Está fora dos Termos
|
||||
# do WhatsApp e a Meta pode banir o número — use um chip dedicado. A tela
|
||||
# avisa isso em texto, não só no código.
|
||||
class Admin::WhatsappSessoesController < ApplicationController
|
||||
def show
|
||||
authorize :whatsapp_sessao, :show?
|
||||
@config = ConfiguracaoNotificacao.instancia
|
||||
@cliente = Notificacao::ClienteWhatsapp.padrao
|
||||
@estado = consultar
|
||||
end
|
||||
|
||||
# Polling da tela enquanto o QR não é lido — o QR expira em ~20s e a ponte
|
||||
# gera outro, então a página precisa buscar o novo sozinha.
|
||||
def status
|
||||
authorize :whatsapp_sessao, :show?
|
||||
render json: consultar
|
||||
end
|
||||
|
||||
def testar
|
||||
authorize :whatsapp_sessao, :testar?
|
||||
|
||||
destino = ConfiguracaoNotificacao.normalizar_telefone(params[:numero])
|
||||
if destino.blank?
|
||||
return redirect_to(admin_whatsapp_sessao_path, alert: 'Informe um número válido (DDD + número).')
|
||||
end
|
||||
|
||||
resposta = Notificacao::ClienteWhatsapp.padrao.enviar(
|
||||
para: destino,
|
||||
texto: "Teste do Reem Notas ✅\nSe você recebeu isto, o WhatsApp está conectado."
|
||||
)
|
||||
|
||||
if resposta.ok?
|
||||
redirect_to admin_whatsapp_sessao_path, notice: "Mensagem de teste enviada para #{destino}."
|
||||
else
|
||||
redirect_to admin_whatsapp_sessao_path, alert: "Falhou: #{resposta.erro}"
|
||||
end
|
||||
end
|
||||
|
||||
def desconectar
|
||||
authorize :whatsapp_sessao, :desconectar?
|
||||
|
||||
resposta = Notificacao::ClienteWhatsapp.padrao.desconectar
|
||||
AuditoriaLog.registrar(user: current_user, acao: 'whatsapp_desconectar',
|
||||
entidade: 'ConfiguracaoNotificacao',
|
||||
dados_novos: { detalhes: 'Desconectou a sessão do WhatsApp' },
|
||||
request: request)
|
||||
|
||||
if resposta.ok?
|
||||
ConfiguracaoNotificacao.instancia.update_columns(whatsapp_numero_conectado: nil,
|
||||
whatsapp_conectado_em: nil)
|
||||
redirect_to admin_whatsapp_sessao_path, notice: 'Sessão encerrada. Leia o QR para conectar de novo.'
|
||||
else
|
||||
redirect_to admin_whatsapp_sessao_path, alert: "Não foi possível desconectar: #{resposta.erro}"
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
# Consulta a ponte e memoriza o número conectado no banco — assim a tela de
|
||||
# configuração mostra quem está pareado mesmo com a ponte fora do ar.
|
||||
def consultar
|
||||
resposta = Notificacao::ClienteWhatsapp.padrao.status
|
||||
return { 'conectado' => false, 'erro' => resposta.erro } unless resposta.ok?
|
||||
|
||||
dados = resposta.dados || {}
|
||||
if dados['conectado'] && dados['numero'].present?
|
||||
config = ConfiguracaoNotificacao.instancia
|
||||
if config.whatsapp_numero_conectado != dados['numero']
|
||||
config.update_columns(whatsapp_numero_conectado: dados['numero'],
|
||||
whatsapp_conectado_em: Time.current)
|
||||
end
|
||||
end
|
||||
dados
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user