from fastapi.params import Depends from loguru import logger from typing_extensions import Annotated from fastapi import APIRouter, Request from dependency_injector.wiring import inject, Provide from app.dependencies.containers import Container from app.dto.request import DialogflowWebhookRequest from app.dto.response import DialogflowResponseBuilder from app.dto.user import UserDTO from app.services.user_service import UserService from app.ner.services.ner import NER router = APIRouter(prefix="/user", tags=["User"]) def get_ner_model(request: Request) -> NER: """ Dependency to get the NER model. This can be used to inject the NER model into the endpoint. """ return request.app.state.ner @router.post("/info") @inject async def get_user_info( request: Request, service: UserService = Depends(Provide[Container.user_service]) ): body = await request.json() body = DialogflowWebhookRequest(**body) params = body.get_parameters() user: UserDTO = await service.get_user() user_exists: bool = user is not None parameters = { "is_user_exist": user_exists, "user_name": user.user_name if user_exists else None, "phone_number": user.phone_number if user_exists else None, "email": user.email if user_exists else None, } return DialogflowResponseBuilder().set_parameters(parameters).build() @router.post("/extract-name") @inject async def extract_user_name( request: Request, service: UserService = Depends(Provide[Container.user_service]) ): body = await request.json() body = DialogflowWebhookRequest(**body) text = body.get_text() user_name = await service.extract_user_name(text) return DialogflowResponseBuilder().set_parameters({"user_name": user_name}).build()