amarillo-grfs-export/amarillo/plugins/grfs_export/router.py
2024-04-22 14:41:54 +02:00

93 lines
3.5 KiB
Python

import logging
from fastapi import APIRouter, HTTPException, status, Depends
from amarillo.models.Carpool import Region
from amarillo.services.regions import RegionService
from amarillo.services.oauth2 import get_current_user, verify_permission
from amarillo.models.User import User
from amarillo.utils.container import container
from fastapi.responses import FileResponse
logger = logging.getLogger(__name__)
router = APIRouter()
@router.post("/export")
async def trigger_export(requesting_user: User = Depends(get_current_user)):
verify_permission("gtfs-generate", requesting_user)
#import is here to avoid circular import
from amarillo.plugins.grfs_export.gtfs_generator import generate_gtfs
generate_gtfs()
#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/{region_id}/grfs/",
summary="Return GRFS Feed for this region",
response_description="GRFS-Feed (zip-file)",
response_class=FileResponse,
responses={
status.HTTP_404_NOT_FOUND: {"description": "Region not found"},
}
)
async def get_file(region_id: str, requesting_user: User = Depends(get_current_user)):
verify_permission("gtfs", requesting_user)
_assert_region_exists(region_id)
try:
from amarillo.plugins.metrics import increment_grfs_download_counter
increment_grfs_download_counter()
except ImportError:
pass
return FileResponse(f'data/grfs/amarillo.{region_id}.gtfs.zip')
@router.get("/region/{region_id}/grfs-geojson",
summary="Return GRFS Feed for this region in GeoJSON",
response_description="GRFS-Feed (zip-file)",
response_class=FileResponse,
responses={
status.HTTP_404_NOT_FOUND: {"description": "Region not found"},
}
)
async def get_file(region_id: str, requesting_user: User = Depends(get_current_user)):
verify_permission("gtfs", requesting_user)
_assert_region_exists(region_id)
try:
from amarillo.plugins.metrics import increment_grfs_download_counter
increment_grfs_download_counter()
except ImportError:
pass
return FileResponse(f'data/grfs/amarillo.{region_id}.geojson.zip')
@router.get("/region/{region_id}/grfs-rt/",
summary="Return GRFS-RT Feed for this region",
response_description="GRFS-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', requesting_user: User = Depends(get_current_user)):
verify_permission("gtfs", requesting_user)
_assert_region_exists(region_id)
if format == 'json':
return FileResponse(f'data/grfs/amarillo.{region_id}.gtfsrt.json')
elif format == 'protobuf':
return FileResponse(f'data/grfs/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)