import uuid from fastapi import APIRouter, Depends, HTTPException, status from sqlalchemy.ext.asyncio import AsyncSession from app.core.deps import get_db_session, require_roles, require_study_member from app.crud import audit as audit_crud from app.schemas.audit import AuditLogRead router = APIRouter() @router.get( "/", response_model=list[AuditLogRead], dependencies=[Depends(require_study_member())], ) async def list_audit_logs( study_id: uuid.UUID, entity_type: str | None = None, entity_id: uuid.UUID | None = None, action: str | None = None, operator_id: uuid.UUID | None = None, skip: int = 0, limit: int = 100, db: AsyncSession = Depends(get_db_session), ) -> list[AuditLogRead]: logs = await audit_crud.list_logs( db, study_id=study_id, entity_type=entity_type, entity_id=entity_id, action=action, operator_id=operator_id, skip=skip, limit=limit, ) return list(logs) @router.delete( "/{log_id}", status_code=status.HTTP_204_NO_CONTENT, dependencies=[Depends(require_roles(["ADMIN"]))], ) async def delete_audit_log( study_id: uuid.UUID, log_id: uuid.UUID, db: AsyncSession = Depends(get_db_session), ): log = await audit_crud.get_log(db, log_id) if not log or log.study_id != study_id: raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Audit log not found") await audit_crud.delete_log(db, log)