81 lines
3.0 KiB
Ruby
81 lines
3.0 KiB
Ruby
# 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
|