116 lines
3.7 KiB
Python
116 lines
3.7 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from sqlalchemy.orm import Session
|
|
from app.api import deps
|
|
from app.crud.crud_journal import journal
|
|
from app.models.journal import EntityType
|
|
from app.schemas.journal import JournalEntryResponse, EntityJournalResponse
|
|
from typing import List, Optional
|
|
from datetime import datetime, date
|
|
|
|
router = APIRouter(tags=["journal"])
|
|
|
|
|
|
@router.get("/search/all", response_model=List[JournalEntryResponse])
|
|
async def search_journal(
|
|
date_from: Optional[date] = None,
|
|
date_to: Optional[date] = None,
|
|
entity_type: Optional[str] = None,
|
|
entity_id: Optional[int] = None,
|
|
user: Optional[str] = None,
|
|
limit: int = 500,
|
|
db: Session = Depends(deps.get_db),
|
|
current_user = Depends(deps.get_current_user)
|
|
):
|
|
"""
|
|
Search journal entries with optional filters.
|
|
|
|
Parameters:
|
|
- date_from: Filter entries from this date (YYYY-MM-DD)
|
|
- date_to: Filter entries until this date (YYYY-MM-DD)
|
|
- entity_type: Filter by entity type (PPR, LOCAL_FLIGHT, ARRIVAL, DEPARTURE, OVERFLIGHT, CIRCUIT, USER)
|
|
- entity_id: Filter by specific entity ID
|
|
- user: Filter by user who created the entry
|
|
- limit: Maximum number of entries to return (default 500, max 5000)
|
|
|
|
All filters are optional and can be combined.
|
|
Returns entries in reverse chronological order (newest first).
|
|
"""
|
|
if limit > 5000:
|
|
limit = 5000
|
|
|
|
# Validate entity_type if provided
|
|
if entity_type:
|
|
try:
|
|
EntityType[entity_type.upper()]
|
|
except KeyError:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail=f"Invalid entity_type. Must be one of: {', '.join([e.value for e in EntityType])}"
|
|
)
|
|
|
|
entries = journal.search_entries(
|
|
db,
|
|
date_from=date_from,
|
|
date_to=date_to,
|
|
entity_type=entity_type,
|
|
entity_id=entity_id,
|
|
user=user,
|
|
limit=limit
|
|
)
|
|
|
|
return entries
|
|
|
|
|
|
@router.get("/user/{username}", response_model=List[JournalEntryResponse])
|
|
async def get_user_journal(
|
|
username: str,
|
|
limit: int = 100,
|
|
db: Session = Depends(deps.get_db),
|
|
current_user = Depends(deps.get_current_user)
|
|
):
|
|
"""
|
|
Get all journal entries created by a specific user.
|
|
|
|
This endpoint is read-only and returns entries in reverse chronological order.
|
|
"""
|
|
entries = journal.get_user_journal(db, username, limit=limit)
|
|
return entries
|
|
|
|
|
|
@router.get("/{entity_type}/{entity_id}", response_model=EntityJournalResponse)
|
|
async def get_entity_journal(
|
|
entity_type: str,
|
|
entity_id: int,
|
|
limit: int = 100,
|
|
db: Session = Depends(deps.get_db),
|
|
current_user = Depends(deps.get_current_user)
|
|
):
|
|
"""
|
|
Get journal entries for a specific entity (PPR, LOCAL_FLIGHT, ARRIVAL, or DEPARTURE).
|
|
|
|
The journal is immutable - entries are created automatically by the backend
|
|
when changes are made. This endpoint is read-only.
|
|
|
|
Parameters:
|
|
- entity_type: One of 'PPR', 'LOCAL_FLIGHT', 'ARRIVAL', 'DEPARTURE'
|
|
- entity_id: The ID of the entity
|
|
- limit: Maximum number of entries to return (default 100)
|
|
"""
|
|
# Validate entity type
|
|
try:
|
|
entity = EntityType[entity_type.upper()]
|
|
except KeyError:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_400_BAD_REQUEST,
|
|
detail=f"Invalid entity_type. Must be one of: {', '.join([e.value for e in EntityType])}"
|
|
)
|
|
|
|
entries = journal.get_entity_journal(db, entity, entity_id, limit=limit)
|
|
|
|
return EntityJournalResponse(
|
|
entity_type=entity_type,
|
|
entity_id=entity_id,
|
|
entries=entries,
|
|
total_entries=len(entries)
|
|
)
|