""" Rota /log: histórico de ações do painel (LOG_PAINEL, app/db/log.py) e, quando configurado, os últimos envios automáticos de chave via WhatsApp (Data Table pagamentos_processados do n8n, app/n8n_client.py). Mostra só os 20 registros de LOG_PAINEL mais recentes — sem paginação. Administradores têm um botão para limpar o histórico inteiro (POST /log/limpar); db_log.limpar() apaga tudo e o router grava, logo em seguida, uma única entrada de auditoria registrando quem limpou e quando — por isso o histórico nunca fica sem nenhuma explicação do que aconteceu com ele. """ from typing import Optional from urllib.parse import urlencode from fastapi import APIRouter, Depends, Request from fastapi.responses import HTMLResponse, RedirectResponse from fastapi.templating import Jinja2Templates from .. import n8n_client from ..auth import UsuarioLogado, exigir_admin, exigir_login from ..csrf import exigir_csrf, token_do_contexto from ..db import log as db_log router = APIRouter() templates = Jinja2Templates(directory="app/templates") LIMITE_ACOES = 20 def _redirect_com_mensagem(mensagem: str, tipo: str = "success") -> RedirectResponse: return RedirectResponse(f"/log?{urlencode({'mensagem': mensagem, 'mensagem_tipo': tipo})}", status_code=303) @router.get("/log", response_class=HTMLResponse) def pagina( request: Request, mensagem: Optional[str] = None, mensagem_tipo: Optional[str] = None, usuario: UsuarioLogado = Depends(exigir_login), ): acoes = db_log.listar(limite=LIMITE_ACOES) envios = n8n_client.listar_envios(limite=50) return templates.TemplateResponse( request, "log.html", { "acoes": acoes, "envios": envios, "envios_configurado": n8n_client.configurado(), "eh_admin": usuario.eh_admin, "csrf_token": token_do_contexto(request), "mensagem": mensagem, "mensagem_tipo": mensagem_tipo, }, ) @router.post("/log/limpar", dependencies=[Depends(exigir_csrf)]) def limpar(usuario: UsuarioLogado = Depends(exigir_admin)): db_log.limpar() db_log.registrar(str(usuario), "limpar", "log", None, True) return _redirect_com_mensagem("Log limpo.")