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>
60 lines
1.8 KiB
Python
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,
|
|
}
|