File size: 2,110 Bytes
df37f6e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from loguru import logger
from fastapi import APIRouter, Depends, HTTPException, Request
from dependency_injector.wiring import inject, Provide


from app.dependencies.containers import Container
from app.dto.request import LocationRequest
from app.dto.response import DialogFlowResponseAPI
from app.services.location_service import LocationService


router = APIRouter(prefix="/location", tags=["Location"])


@router.post("/origin-city-from-office")
@inject
async def get_origin_city_from_office(
    request: Request,
    service: LocationService = Depends(Provide[Container.location_service]),
):
    body = await request.json()
    params = body.get("sessionInfo", {}).get("parameters", {})
    try:
        data = LocationRequest(**params)
    except Exception:
        logger.error("Invalid location parameters", exc_info=True)
        raise HTTPException(status_code=400, detail="Invalid location parameters")

    if data.origin_office and not data.departure_city:
        _, _, city = await service.get_city_by_office(
            office_name=data.origin_office, role="origin"
        )
        return DialogFlowResponseAPI(parameters={"departure_city": city})

    return DialogFlowResponseAPI(parameters={"departure_city": data.departure_city})


@router.post("/dest-city-from-office")
@inject
async def get_dest_city_from_office(
    request: Request,
    service: LocationService = Depends(Provide[Container.location_service]),
):
    body = await request.json()
    params = body.get("sessionInfo", {}).get("parameters", {})
    try:
        data = LocationRequest.model_validate(params)
    except Exception:
        logger.error("Invalid location parameters", exc_info=True)
        raise HTTPException(status_code=400, detail="Invalid location parameters")

    if data.dest_office and not data.destination_city:
        city = await service.get_city_by_office(
            office_name=data.dest_office, role="dest"
        )
        return DialogFlowResponseAPI(parameters={"destination_city": city})

    return DialogFlowResponseAPI(parameters={"destination_city": data.destination_city})