From 35741a1bc1529960e2c558d0fc18dfa01d694421 Mon Sep 17 00:00:00 2001 From: lebaudantoine Date: Sat, 30 Nov 2024 00:17:12 +0100 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F(summary)=20reorganize=20API?= =?UTF-8?q?=20code?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit I totally reorganized the API code, to gain in clarity. --- src/helm/env.d/dev/values.meet.yaml.gotmpl | 2 +- .../env.d/staging/values.meet.yaml.gotmpl | 2 +- src/summary/compose.yaml | 2 +- src/summary/summary/api/__init__.py | 1 + src/summary/summary/api/health.py | 17 ++++++ src/summary/summary/api/main.py | 9 ++++ src/summary/summary/api/route/__init__.py | 1 + src/summary/summary/api/route/tasks.py | 34 ++++++++++++ src/summary/summary/core/__init__.py | 1 + .../summary/{ => core}/celery_worker.py | 7 ++- src/summary/summary/{ => core}/config.py | 4 +- src/summary/summary/{ => core}/prompt.py | 0 src/summary/summary/{ => core}/security.py | 0 src/summary/summary/main.py | 52 ++++--------------- 14 files changed, 83 insertions(+), 49 deletions(-) create mode 100644 src/summary/summary/api/__init__.py create mode 100644 src/summary/summary/api/health.py create mode 100644 src/summary/summary/api/main.py create mode 100644 src/summary/summary/api/route/__init__.py create mode 100644 src/summary/summary/api/route/tasks.py create mode 100644 src/summary/summary/core/__init__.py rename src/summary/summary/{ => core}/celery_worker.py (97%) rename src/summary/summary/{ => core}/config.py (95%) rename src/summary/summary/{ => core}/prompt.py (100%) rename src/summary/summary/{ => core}/security.py (100%) diff --git a/src/helm/env.d/dev/values.meet.yaml.gotmpl b/src/helm/env.d/dev/values.meet.yaml.gotmpl index b54973e5..8e171fff 100644 --- a/src/helm/env.d/dev/values.meet.yaml.gotmpl +++ b/src/helm/env.d/dev/values.meet.yaml.gotmpl @@ -167,7 +167,7 @@ celery: command: - "celery" - "-A" - - "summary.celery_worker" + - "summary.core.celery_worker" - "worker" - "--pool=solo" - "--loglevel=info" diff --git a/src/helm/env.d/staging/values.meet.yaml.gotmpl b/src/helm/env.d/staging/values.meet.yaml.gotmpl index fb699f15..95fd9679 100644 --- a/src/helm/env.d/staging/values.meet.yaml.gotmpl +++ b/src/helm/env.d/staging/values.meet.yaml.gotmpl @@ -280,7 +280,7 @@ celery: command: - "celery" - "-A" - - "summary.celery_worker" + - "summary.core.celery_worker" - "worker" - "--pool=solo" - "--loglevel=info" diff --git a/src/summary/compose.yaml b/src/summary/compose.yaml index fe529b9e..b8d6995d 100644 --- a/src/summary/compose.yaml +++ b/src/summary/compose.yaml @@ -19,7 +19,7 @@ services: celery_worker: container_name: celery_worker build: . - command: celery -A summary.celery_worker worker --pool=solo --loglevel=debug + command: celery -A summary.core.celery_worker worker --pool=solo --loglevel=debug volumes: - .:/app depends_on: diff --git a/src/summary/summary/api/__init__.py b/src/summary/summary/api/__init__.py new file mode 100644 index 00000000..f76ff746 --- /dev/null +++ b/src/summary/summary/api/__init__.py @@ -0,0 +1 @@ +"""Summary Api package.""" diff --git a/src/summary/summary/api/health.py b/src/summary/summary/api/health.py new file mode 100644 index 00000000..eb37a711 --- /dev/null +++ b/src/summary/summary/api/health.py @@ -0,0 +1,17 @@ +"""API routes related to application health checking.""" + +from fastapi import APIRouter + +router = APIRouter() + + +@router.get("/__heartbeat__") +async def heartbeat(): + """Health check endpoint for monitoring.""" + return + + +@router.get("/__lbheartbeat__") +async def lbheartbeat(): + """Health check endpoint for load balancer.""" + return diff --git a/src/summary/summary/api/main.py b/src/summary/summary/api/main.py new file mode 100644 index 00000000..4fb9cc90 --- /dev/null +++ b/src/summary/summary/api/main.py @@ -0,0 +1,9 @@ +"""API routes.""" + +from fastapi import APIRouter, Depends + +from summary.api.route import tasks +from summary.core.security import verify_token + +api_router = APIRouter(dependencies=[Depends(verify_token)]) +api_router.include_router(tasks.router, tags=["tasks"]) diff --git a/src/summary/summary/api/route/__init__.py b/src/summary/summary/api/route/__init__.py new file mode 100644 index 00000000..38b6cc13 --- /dev/null +++ b/src/summary/summary/api/route/__init__.py @@ -0,0 +1 @@ +"""Summary Api Route package.""" diff --git a/src/summary/summary/api/route/tasks.py b/src/summary/summary/api/route/tasks.py new file mode 100644 index 00000000..42b212bb --- /dev/null +++ b/src/summary/summary/api/route/tasks.py @@ -0,0 +1,34 @@ +"""API routes related to application tasks.""" + +from celery.result import AsyncResult +from fastapi import APIRouter +from pydantic import BaseModel + +from summary.core.celery_worker import process_audio_transcribe_summarize + + +class TaskCreation(BaseModel): + """Task data.""" + + filename: str + email: str + sub: str + + +router = APIRouter(prefix="/tasks") + + +@router.post("/") +async def create_task(request: TaskCreation): + """Create a task.""" + task = process_audio_transcribe_summarize.delay( + request.filename, request.email, request.sub + ) + return {"id": task.id, "message": "Task created"} + + +@router.get("/{task_id}") +async def get_task_status(task_id: str): + """Check task status by ID.""" + task = AsyncResult(task_id) + return {"id": task_id, "status": task.status} diff --git a/src/summary/summary/core/__init__.py b/src/summary/summary/core/__init__.py new file mode 100644 index 00000000..6978a850 --- /dev/null +++ b/src/summary/summary/core/__init__.py @@ -0,0 +1 @@ +"""Summary Core package.""" diff --git a/src/summary/summary/celery_worker.py b/src/summary/summary/core/celery_worker.py similarity index 97% rename from src/summary/summary/celery_worker.py rename to src/summary/summary/core/celery_worker.py index 768f34e6..1652e0e0 100644 --- a/src/summary/summary/celery_worker.py +++ b/src/summary/summary/core/celery_worker.py @@ -12,11 +12,10 @@ from requests import Session from requests.adapters import HTTPAdapter from urllib3.util import Retry -from .config import Settings -from .prompt import get_instructions - -settings = Settings() +from summary.core.config import get_settings +from summary.core.prompt import get_instructions +settings = get_settings() logger = get_task_logger(__name__) diff --git a/src/summary/summary/config.py b/src/summary/summary/core/config.py similarity index 95% rename from src/summary/summary/config.py rename to src/summary/summary/core/config.py index b3de263f..bc88bd07 100644 --- a/src/summary/summary/config.py +++ b/src/summary/summary/core/config.py @@ -10,8 +10,10 @@ from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): """Configuration settings loaded from environment variables and .env file.""" - app_name: str = "Awesome API" model_config = SettingsConfigDict(env_file=".env") + + app_name: str = "app" + app_api_v1_str: str = "/api/v1" app_api_token: str # Celery settings diff --git a/src/summary/summary/prompt.py b/src/summary/summary/core/prompt.py similarity index 100% rename from src/summary/summary/prompt.py rename to src/summary/summary/core/prompt.py diff --git a/src/summary/summary/security.py b/src/summary/summary/core/security.py similarity index 100% rename from src/summary/summary/security.py rename to src/summary/summary/core/security.py diff --git a/src/summary/summary/main.py b/src/summary/summary/main.py index 3673796e..e30b31f3 100644 --- a/src/summary/summary/main.py +++ b/src/summary/summary/main.py @@ -1,46 +1,16 @@ -"""Application endpoint.""" +"""Application.""" -from celery.result import AsyncResult -from fastapi import Depends, FastAPI -from pydantic import BaseModel +from fastapi import FastAPI -from .celery_worker import process_audio_transcribe_summarize -from .security import verify_token +from summary.api import health +from summary.api.main import api_router +from summary.core.config import get_settings -app = FastAPI() +settings = get_settings() +app = FastAPI( + title=settings.app_name, +) -@app.get("/__heartbeat__") -async def heartbeat(): - """Health check endpoint for monitoring.""" - return {"status": "ok"} - - -@app.get("/__lbheartbeat__") -async def lbheartbeat(): - """Health check endpoint for load balancer.""" - return {"status": "ok"} - - -class NotificationRequest(BaseModel): - """Notification data.""" - - filename: str - email: str - sub: str - - -@app.post("/push") -async def notify(request: NotificationRequest, token: str = Depends(verify_token)): - """Push a notification.""" - task = process_audio_transcribe_summarize.delay( - request.filename, request.email, request.sub - ) - return {"task_id": task.id, "message": "Notification sent"} - - -@app.get("/status/{task_id}") -async def get_status(task_id: str, token: str = Depends(verify_token)): - """Check task status by ID.""" - task = AsyncResult(task_id) - return {"task_id": task_id, "status": task.status} +app.include_router(api_router, prefix=settings.app_api_v1_str) +app.include_router(health.router)