amarillo-core/amarillo/routers/agency.py
2024-02-13 10:47:03 +01:00

86 lines
3.2 KiB
Python

import logging
import time
from typing import List
from fastapi import APIRouter, HTTPException, status, Depends
from amarillo.models.Carpool import Carpool, Agency
from amarillo.routers.agencyconf import verify_api_key, verify_admin_api_key, verify_permission_for_same_agency_or_admin
# TODO should move this to service
from amarillo.routers.carpool import store_carpool, delete_agency_carpools_older_than
from amarillo.services.agencies import AgencyService
from amarillo.services.importing.ride2go import import_ride2go
from amarillo.utils.container import container
from fastapi.responses import FileResponse
logger = logging.getLogger(__name__)
router = APIRouter(
prefix="/agency",
tags=["agency"]
)
@router.get("/{agency_id}",
operation_id="getAgencyById",
summary="Find agency by ID",
response_model=Agency,
description="Find agency by ID",
# TODO next to the status codes are "Links". There is nothing shown now.
# Either show something there, or hide the Links, or do nothing.
responses={
status.HTTP_404_NOT_FOUND: {"description": "Agency not found"},
},
)
async def get_agency(agency_id: str, admin_api_key: str = Depends(verify_api_key)) -> Agency:
agencies: AgencyService = container['agencies']
agency = agencies.get_agency(agency_id)
agency_exists = agency is not None
if not agency_exists:
message = f"Agency with id {agency_id} does not exist."
logger.error(message)
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=message)
logger.info(f"Get agency {agency_id}.")
return agency
# TODO add push batch endpoint
@router.post("/{agency_id}/sync",
operation_id="sync",
summary="Synchronizes all carpool offers",
response_model=List[Carpool],
response_model_exclude_none=True,
responses={
status.HTTP_200_OK: {
"description": "Carpool created"},
status.HTTP_404_NOT_FOUND: {
"description": "Agency does not exist"},
status.HTTP_500_INTERNAL_SERVER_ERROR: {
"description": "Import error"}
})
async def sync(agency_id: str, requesting_agency_id: str = Depends(verify_api_key)) -> List[Carpool]:
await verify_permission_for_same_agency_or_admin(agency_id, requesting_agency_id)
if agency_id == "ride2go":
import_function = import_ride2go
else:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Agency does not exist or does not support sync.")
try:
carpools = import_function()
# Reduce current time by a minute to avoid inter process timestamp issues
synced_files_older_than = time.time() - 60
result = [await store_carpool(cp) for cp in carpools]
await delete_agency_carpools_older_than(agency_id, synced_files_older_than)
return result
except BaseException as e:
logger.exception("Error on sync for agency %s", agency_id)
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"Something went wrong during import.")