from __future__ import annotations import argparse import json from app.db.bootstrap import create_all_tables from app.db.models import AuditLog from app.db.session import SessionLocal from app.security.api_keys import authenticate_api_key from app.settings import settings def _row(item: AuditLog) -> dict: return { "id": item.id, "created_at": item.created_at.isoformat() if item.created_at else None, "tenant_id": item.tenant_id, "user_id": item.user_id, "api_key_id": item.api_key_id, "action": item.action, "object_type": item.object_type, "object_id": item.object_id, "details": item.details, } def main() -> None: parser = argparse.ArgumentParser(description="List audit log entries.") parser.add_argument("--api-key", default=settings.dev_bootstrap_api_key) parser.add_argument("--limit", type=int, default=50) parser.add_argument("--offset", type=int, default=0) parser.add_argument("--action") parser.add_argument("--object-type") parser.add_argument("--object-id") parser.add_argument("--json", action="store_true") args = parser.parse_args() create_all_tables() with SessionLocal() as session: api_key = authenticate_api_key(session, args.api_key) if not api_key: raise SystemExit("Invalid API key") query = session.query(AuditLog).filter(AuditLog.tenant_id == api_key.tenant_id) if args.action: query = query.filter(AuditLog.action == args.action) if args.object_type: query = query.filter(AuditLog.object_type == args.object_type) if args.object_id: query = query.filter(AuditLog.object_id == args.object_id) items = query.order_by(AuditLog.created_at.desc()).offset(args.offset).limit(args.limit).all() rows = [_row(item) for item in items] if args.json: print(json.dumps({"items": rows}, indent=2, ensure_ascii=False, default=str)) return for row in rows: print( f"{row['created_at']} | {row['action']} | " f"{row['object_type'] or '-'}:{row['object_id'] or '-'} | {row['details'] or {}}" ) if __name__ == "__main__": main()