Files
FarmaFinder/pip-platform/src/api/v1/endpoints/audit.py
T
Antoni Nuñez Romeu c5df0ec0b2
Run Tests on Branches / Backend Tests (push) Successful in 3m32s
Run Tests on Branches / Frontend Tests (push) Successful in 3m27s
First implementation API for PIP (Proyecto: Pharmacy Integration Platform)
2026-07-01 16:46:52 +02:00

71 lines
2.2 KiB
Python

from datetime import datetime
from uuid import UUID
from fastapi import APIRouter, Depends, Query
from pydantic import BaseModel
from sqlalchemy.ext.asyncio import AsyncSession
from src.api.v1.dependencies.auth import get_current_user, require_role
from src.domain.entities import UserRole
from src.infrastructure.database.repositories import AuditLogRepository
from src.infrastructure.database.session import get_db_session
from src.services.auth.security import TokenData
from src.services.audit.audit_service import AuditService
router = APIRouter(prefix="/audit", tags=["Audit"])
class AuditLogResponse(BaseModel):
id: UUID
actor_id: UUID | None
actor_type: str | None
action: str
resource_type: str
resource_id: str | None
old_value: dict | None
new_value: dict | None
ip_address: str | None
user_agent: str | None
request_id: str | None
created_at: datetime | None
class AuditLogListResponse(BaseModel):
items: list[AuditLogResponse]
total: int
offset: int
limit: int
def _get_service(session: AsyncSession) -> AuditService:
return AuditService(AuditLogRepository(session))
@router.get("/logs", response_model=AuditLogListResponse)
async def list_audit_logs(
actor_id: UUID | None = None,
action: str | None = None,
resource_type: str | None = None,
offset: int = Query(0, ge=0),
limit: int = Query(50, ge=1, le=200),
session: AsyncSession = Depends(get_db_session),
current_user: TokenData = Depends(require_role(UserRole.ADMIN)),
):
service = _get_service(session)
entities, total = await service.list_logs(
actor_id=actor_id, action=action, resource_type=resource_type,
offset=offset, limit=limit,
)
items = [
AuditLogResponse(
id=e.id, actor_id=e.actor_id, actor_type=e.actor_type,
action=e.action, resource_type=e.resource_type,
resource_id=e.resource_id, old_value=e.old_value,
new_value=e.new_value, ip_address=e.ip_address,
user_agent=e.user_agent, request_id=e.request_id,
created_at=e.created_at,
)
for e in entities
]
return AuditLogListResponse(items=items, total=total, offset=offset, limit=limit)