""" Log de ações do painel (LOG_PAINEL) — uma linha por ação que muda estado (criar/editar/excluir cliente, adicionar/editar/excluir contato), sucesso ou erro. Escrita feita pelos routers via `registrar(...)`, nunca sobrescrita/editada depois — é histórico, não estado. A tabela já existe no banco de dev. Em qualquer outro ambiente (produção), crie-a primeiro com: CREATE TABLE LOG_PAINEL ( ID INT UNSIGNED NOT NULL AUTO_INCREMENT, CRIADO_EM DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, USUARIO VARCHAR(60) NOT NULL, ACAO VARCHAR(40) NOT NULL, ENTIDADE VARCHAR(20) NOT NULL, ENTIDADE_ID VARCHAR(20) DEFAULT NULL, SUCESSO TINYINT(1) NOT NULL, DETALHE VARCHAR(500) DEFAULT NULL, PRIMARY KEY (ID), KEY IDX_LOG_PAINEL_CRIADO_EM (CRIADO_EM) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; """ from .connection import get_connection def registrar( usuario: str, acao: str, entidade: str, entidade_id: str | None, sucesso: bool, detalhe: str | None = None, ) -> None: conn = get_connection() try: with conn.cursor() as cur: cur.execute( "INSERT INTO LOG_PAINEL (USUARIO, ACAO, ENTIDADE, ENTIDADE_ID, SUCESSO, DETALHE) " "VALUES (%s, %s, %s, %s, %s, %s)", (usuario, acao, entidade, entidade_id, 1 if sucesso else 0, detalhe), ) finally: conn.close() def listar(limite: int = 100, offset: int = 0) -> list[dict]: conn = get_connection() try: with conn.cursor() as cur: cur.execute( "SELECT ID, CRIADO_EM, USUARIO, ACAO, ENTIDADE, ENTIDADE_ID, SUCESSO, DETALHE " "FROM LOG_PAINEL ORDER BY CRIADO_EM DESC, ID DESC LIMIT %s OFFSET %s", (limite, offset), ) return cur.fetchall() finally: conn.close() def contar() -> int: conn = get_connection() try: with conn.cursor() as cur: cur.execute("SELECT COUNT(*) AS total FROM LOG_PAINEL") return cur.fetchone()["total"] finally: conn.close() def limpar() -> None: """Apaga todo o histórico de LOG_PAINEL. Quem chama (o router) grava uma entrada nova logo depois disso, registrando quem limpou — nunca chamar isso sem seguir com um registrar() depois, senão o rastro da própria limpeza se perde.""" conn = get_connection() try: with conn.cursor() as cur: cur.execute("DELETE FROM LOG_PAINEL") finally: conn.close()