Phase 4: API Endpoint

- Add RandomNumberOutcomeResponse schema to schemas.py
- Add GET /api/audit/random-jobs endpoint to routes/audit.py
- Returns list of outcomes (newest first, no pagination)
- Requires VIEW_AUDIT permission
- Add tests: admin can access, regular user forbidden, unauthenticated 401
This commit is contained in:
counterweight 2025-12-21 22:53:54 +01:00
parent 7beb213cf5
commit b3ed81e8fd
Signed by: counterweight
GPG key ID: 883EDBAA726BD96C
3 changed files with 71 additions and 1 deletions

View file

@ -10,11 +10,12 @@ from sqlalchemy.ext.asyncio import AsyncSession
from auth import require_permission
from database import get_db
from models import CounterRecord, Permission, SumRecord, User
from models import CounterRecord, Permission, RandomNumberOutcome, SumRecord, User
from schemas import (
CounterRecordResponse,
PaginatedCounterRecords,
PaginatedSumRecords,
RandomNumberOutcomeResponse,
SumRecordResponse,
)
@ -115,3 +116,28 @@ async def get_sum_records(
per_page=per_page,
total_pages=total_pages,
)
@router.get("/random-jobs", response_model=list[RandomNumberOutcomeResponse])
async def get_random_job_outcomes(
db: AsyncSession = Depends(get_db),
_current_user: User = Depends(require_permission(Permission.VIEW_AUDIT)),
) -> list[RandomNumberOutcomeResponse]:
"""Get all random number job outcomes, newest first."""
query = select(RandomNumberOutcome).order_by(desc(RandomNumberOutcome.created_at))
result = await db.execute(query)
outcomes = result.scalars().all()
return [
RandomNumberOutcomeResponse(
id=outcome.id,
job_id=outcome.job_id,
triggered_by_user_id=outcome.triggered_by_user_id,
triggered_by_email=outcome.triggered_by.email,
value=outcome.value,
duration_ms=outcome.duration_ms,
status=outcome.status,
created_at=outcome.created_at,
)
for outcome in outcomes
]