"""Card logs and audit logs router.""" from typing import Optional from fastapi import APIRouter, Depends, Query from sqlalchemy.orm import Session from app.auth import get_current_user, AdminUser from app.database import get_db from app.models.db_models import CardLog, AuditLog router = APIRouter(prefix="/api", tags=["logs"]) @router.get("/card-logs") def list_card_logs( page_num: int = Query(0, ge=0), page_size: int = Query(20, ge=1, le=100), card_id: Optional[str] = None, action: Optional[str] = None, db: Session = Depends(get_db), user: AdminUser = Depends(get_current_user), ): """List card operation logs.""" query = db.query(CardLog).order_by(CardLog.created_at.desc()) if card_id: query = query.filter(CardLog.card_id == card_id) if action: query = query.filter(CardLog.action == action) total = query.count() logs = query.offset(page_num * page_size).limit(page_size).all() return { "items": [ { "id": log.id, "card_id": log.card_id, "cardholder_id": log.cardholder_id, "action": log.action, "status": log.status, "operator": log.operator, "request_data": log.request_data, "response_data": log.response_data, "created_at": log.created_at.isoformat() if log.created_at else None, } for log in logs ], "page_num": page_num, "page_size": page_size, "total": total, "has_more": (page_num + 1) * page_size < total, } @router.get("/audit-logs") def list_audit_logs( page_num: int = Query(0, ge=0), page_size: int = Query(20, ge=1, le=100), action: Optional[str] = None, resource_type: Optional[str] = None, from_date: Optional[str] = None, to_date: Optional[str] = None, db: Session = Depends(get_db), user: AdminUser = Depends(get_current_user), ): """List audit logs.""" query = db.query(AuditLog).order_by(AuditLog.created_at.desc()) if action: query = query.filter(AuditLog.action == action) if resource_type: query = query.filter(AuditLog.resource_type == resource_type) if from_date: query = query.filter(AuditLog.created_at >= from_date) if to_date: query = query.filter(AuditLog.created_at <= to_date) total = query.count() logs = query.offset(page_num * page_size).limit(page_size).all() return { "items": [ { "id": log.id, "action": log.action, "resource_type": log.resource_type, "resource_id": log.resource_id, "operator": log.operator, "ip_address": log.ip_address, "details": log.details, "created_at": log.created_at.isoformat() if log.created_at else None, } for log in logs ], "page_num": page_num, "page_size": page_size, "total": total, "has_more": (page_num + 1) * page_size < total, }