setup function and router

This commit is contained in:
Csaba 2024-02-08 13:07:51 +01:00 committed by Holger Bruch
parent 8148df41e8
commit 94a51a7a7f
3 changed files with 70 additions and 2 deletions

View file

@ -0,0 +1 @@
from .gtfs_generator import setup

View file

@ -1,14 +1,16 @@
from fastapi import FastAPI
from amarillo.models.Carpool import Region from amarillo.models.Carpool import Region
from amarillo.plugins.gtfs_export.gtfs_export import GtfsExport, GtfsFeedInfo, GtfsAgency from amarillo.plugins.gtfs_export.gtfs_export import GtfsExport, GtfsFeedInfo, GtfsAgency
from amarillo.plugins.gtfs_export.gtfs import GtfsRtProducer from amarillo.plugins.gtfs_export.gtfs import GtfsRtProducer
from amarillo.utils.container import container from amarillo.utils.container import container
from amarillo.plugins.gtfs_export.router import router
from glob import glob from glob import glob
import json import json
import schedule import schedule
import threading import threading
import time import time
import logging import logging
from datetime import date, timedelta
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
@ -68,4 +70,8 @@ def start_schedule():
# Create all feeds once at startup # Create all feeds once at startup
schedule.run_all() schedule.run_all()
job_thread = threading.Thread(target=run_schedule, daemon=True) job_thread = threading.Thread(target=run_schedule, daemon=True)
job_thread.start() job_thread.start()
def setup(app : FastAPI):
app.include_router(router)
start_schedule()

View file

@ -0,0 +1,61 @@
import logging
from fastapi import APIRouter, HTTPException, status, Depends
from amarillo.models.Carpool import Region
from amarillo.routers.agencyconf import verify_admin_api_key
from amarillo.services.regions import RegionService
from amarillo.utils.container import container
from fastapi.responses import FileResponse
logger = logging.getLogger(__name__)
router = APIRouter(
prefix="/region",
tags=["region"]
)
#TODO: move to amarillo/utils?
def _assert_region_exists(region_id: str) -> Region:
regions: RegionService = container['regions']
region = regions.get_region(region_id)
region_exists = region is not None
if not region_exists:
message = f"Region with id {region_id} does not exist."
logger.error(message)
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=message)
return region
@router.get("/{region_id}/gtfs",
summary="Return GTFS Feed for this region",
response_description="GTFS-Feed (zip-file)",
response_class=FileResponse,
responses={
status.HTTP_404_NOT_FOUND: {"description": "Region not found"},
}
)
async def get_file(region_id: str, user: str = Depends(verify_admin_api_key)):
_assert_region_exists(region_id)
return FileResponse(f'data/gtfs/amarillo.{region_id}.gtfs.zip')
@router.get("/{region_id}/gtfs-rt",
summary="Return GTFS-RT Feed for this region",
response_description="GTFS-RT-Feed",
response_class=FileResponse,
responses={
status.HTTP_404_NOT_FOUND: {"description": "Region not found"},
status.HTTP_400_BAD_REQUEST: {"description": "Bad request, e.g. because format is not supported, i.e. neither protobuf nor json."}
}
)
async def get_file(region_id: str, format: str = 'protobuf', user: str = Depends(verify_admin_api_key)):
_assert_region_exists(region_id)
if format == 'json':
return FileResponse(f'data/gtfs/amarillo.{region_id}.gtfsrt.json')
elif format == 'protobuf':
return FileResponse(f'data/gtfs/amarillo.{region_id}.gtfsrt.pbf')
else:
message = "Specified format is not supported, i.e. neither protobuf nor json."
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail=message)