File size: 2,443 Bytes
0f0ef8d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64

from datetime import datetime
import logging
from banco import SessionLocal
from models import LogAcesso

# Configuração mínima de logger (opcional; mantenha neutro)
logger = logging.getLogger(__name__)

def registrar_log(usuario, acao, tabela, registro_id=None):
    """

    Registra um log de acesso/ação na tabela LogAcesso.

    Mantém assinatura e padrão original, mas com tratamento de exceções e normalização.



    :param usuario: str | usuário responsável pela ação (fallback para 'sistema' se None/vazio)

    :param acao: str | ação realizada (ex.: 'CRIAR', 'DESATIVAR', 'EXCLUIR')

    :param tabela: str | nome da tabela/entidade relacionada (ex.: 'eventos_calendario')

    :param registro_id: int | id do registro afetado (opcional)

    """
    # Normalização defensiva (mantendo comportamento atual)
    usuario = (usuario or "sistema")
    acao = (acao or "").strip() or "DESCONHECIDA"
    tabela = (tabela or "").strip() or "desconhecida"

    db = SessionLocal()
    try:
        log = LogAcesso(
            usuario=usuario,
            acao=acao,
            tabela=tabela,
            registro_id=registro_id,
            data_hora=datetime.now()
        )
        db.add(log)
        db.commit()
    except Exception as e:
        # Em caso de falha, desfazer transação e registrar o problema no logger
        try:
            db.rollback()
        except Exception:
            # Se rollback também falhar, seguimos fechando a sessão
            pass
        logger.exception(
            "Falha ao registrar log: usuario=%r, acao=%r, tabela=%r, registro_id=%r. Erro: %s",
            usuario, acao, tabela, registro_id, e
        )
        # Não propaga exceção: evita quebrar o fluxo da aplicação
    finally:
        db.close()


# ✅ Opcional: uma versão 'safe' que nunca lança erro para o chamador.
# Mantém o padrão existente; use quando o log não pode interromper a operação.
def registrar_log_safe(usuario, acao, tabela, registro_id=None):
    try:
        registrar_log(usuario, acao, tabela, registro_id)
    except Exception:
        # Defesa adicional: se algo escapar do registrar_log, não quebra o chamador
        logger.exception(
            "registrar_log_safe: erro inesperado ao registrar log (usuario=%r, acao=%r, tabela=%r, registro_id=%r)",
            usuario, acao, tabela, registro_id
        )