amazon-transcreation/backend/app/api/v1/audit.py
DJP 98fa16bfc3 feat: complete Phase 1-2 scaffold — backend, frontend, pipeline skeleton
Full-stack Amazon AI Transcreation Platform with:
- FastAPI backend (async, PostgreSQL, Redis, Celery) with 11 DB tables
- JWT auth (SSO-ready abstract provider pattern)
- 6-agent pipeline orchestrator with deterministic modules
- Next.js 14 frontend with Amazon branding (Ember fonts, orange/dark theme)
- Job wizard, monitoring HUD, output review, admin screens
- 154 TM/reference files imported, 12 locales configured
- Docker Compose for all services

Agents 2-5 (TM retrieval, ranker, transcreator, compliance) are stubs
pending Phase 3 LLM integration.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 12:31:43 -04:00

60 lines
1.8 KiB
Python

from datetime import datetime
from typing import Any
from uuid import UUID
from fastapi import APIRouter, Depends, Query
from sqlalchemy.ext.asyncio import AsyncSession
from app.dependencies import get_db, require_role
from app.services.audit_service import AuditService
router = APIRouter(prefix="/audit", tags=["audit"])
audit_service = AuditService()
@router.get("/logs")
async def list_audit_logs(
user_id: UUID | None = Query(None),
action: str | None = Query(None),
entity_type: str | None = Query(None),
entity_id: str | None = Query(None),
date_from: datetime | None = Query(None),
date_to: datetime | None = Query(None),
page: int = Query(1, ge=1),
page_size: int = Query(50, ge=1, le=200),
db: AsyncSession = Depends(get_db),
current_user: dict = Depends(require_role(["admin"])),
) -> dict[str, Any]:
"""List audit logs with filters (admin only)."""
logs, total = await audit_service.list_logs(
db,
user_id=user_id,
action=action,
entity_type=entity_type,
entity_id=entity_id,
date_from=date_from,
date_to=date_to,
page=page,
page_size=page_size,
)
pages = (total + page_size - 1) // page_size if total > 0 else 1
return {
"items": [
{
"id": str(log.id),
"user_id": str(log.user_id) if log.user_id else None,
"action": log.action,
"entity_type": log.entity_type,
"entity_id": log.entity_id,
"details": log.details,
"timestamp": log.timestamp.isoformat(),
"ip_address": log.ip_address,
}
for log in logs
],
"total": total,
"page": page,
"page_size": page_size,
"pages": pages,
}