Test-API / src /handlers.py
lpetrl's picture
feat(API): Implemented basic functionality.
94e8fb8 verified
import random
from fastapi import APIRouter, Depends
from fastapi.responses import JSONResponse
from src.api_models import (
ResponseGuessWord, ResponseSemanticCalculation,
RequestSemanticCalculation, ResponseMessage,
SemanticCalculation
)
from src.setting import AVAILABLE_WORDS, CFG
from src.vector_db import VectorDatabaseHandler
router = APIRouter()
DEFAULT_RESPONSES = {
500: {"description": "Internal Server Error", "model": ResponseMessage},
}
@router.get(
"/v1/service/status",
response_model=ResponseMessage,
responses={**DEFAULT_RESPONSES},
description="Description: The endpoint is used to check the service status.",
tags=["Service Status"]
)
async def status() -> ResponseMessage:
"""Health endpoint."""
return ResponseMessage(message="Success.")
@router.get(
"/v1/service/get_guess_word",
response_model=ResponseGuessWord,
responses={**DEFAULT_RESPONSES},
description="Description: The endpoint is used to get a random word from the list of available words.",
tags=["Get Word"]
)
async def get_guess_word() -> ResponseGuessWord:
try:
guess_word = random.choices(AVAILABLE_WORDS, k=1)[0]
except Exception as e:
return JSONResponse(status_code=500, content={"message": str(e)})
return ResponseGuessWord(word=guess_word)
@router.get(
"/v1/service/semantic_calculation",
response_model=ResponseSemanticCalculation,
responses={**DEFAULT_RESPONSES},
description="Description: The endpoint is used to calculate the semantic similarity between the guessed word \
and the supposed word.",
tags=["Semantic Analysis"]
)
async def semantic_calculation(
request: RequestSemanticCalculation = Depends(RequestSemanticCalculation)
) -> ResponseGuessWord:
supposed_word = request.supposed_word
guessed_word = request.guessed_word
if supposed_word not in AVAILABLE_WORDS:
return ResponseSemanticCalculation(
word_exist=False,
metadata=None
)
vector_db = VectorDatabaseHandler(
db_path=CFG.db.folder_path,
table_name=CFG.db.table_name,
metrics_cfg=CFG.db.metrics
)
try:
result = vector_db(guessed_word, supposed_word)
except Exception as e:
return JSONResponse(status_code=500, content={"message": str(e)})
return ResponseSemanticCalculation(
word_exist=True,
metadata=SemanticCalculation(**result)
)