language-learning-app/api/app/routers/api/articles.py
2026-06-02 21:02:50 +01:00

82 lines
2.3 KiB
Python

import uuid
from enum import Enum
from fastapi import APIRouter, Depends
from pydantic import BaseModel
from sqlalchemy.ext.asyncio.session import AsyncSession
from starlette.status import HTTP_201_CREATED
from app.auth import verify_token
from app.domain.models.article import Article, ArticleTypeEnum
from app.domain.services.article_service import ArticleService
from app.outbound.postgres.database import get_db
from app.outbound.postgres.repositories.article_repository import (
PostgresArticleOwnershipRepository,
PostgresArticleRepository,
)
from app.tasks.create_summary_article import create_summary_article
router = APIRouter(prefix="/articles", tags=["adventures"])
def _make_article_service(db) -> ArticleService:
return ArticleService(
article_repository=PostgresArticleRepository(db),
article_ownership_repository=PostgresArticleOwnershipRepository(db),
)
class CreateArticleBody(BaseModel):
article_type: ArticleTypeEnum
language: str
target_complexity: str
text: str
class CreateArticleResponse(BaseModel):
id: str
class ArticleItem(BaseModel):
id: str
def _to_article_item(article: Article) -> ArticleItem:
return ArticleItem(id=str(article.id))
@router.post("", response_model=CreateArticleResponse, status_code=HTTP_201_CREATED)
async def create_article(
body: CreateArticleBody,
db: AsyncSession = Depends(get_db),
token_data: dict = Depends(verify_token),
) -> CreateArticleResponse:
service = _make_article_service(db)
article = await service.create_article_as_user(
article_type=body.article_type,
language=body.language,
target_complexity=body.target_complexity,
text=body.text,
title="",
user_id=token_data["sub"],
)
await create_summary_article.defer_async(
article_id=article.id,
target_language=body.language,
complexity_level=body.target_complexity,
input_text=body.text,
)
return CreateArticleResponse(id=str(uuid.uuid4()))
@router.get("/{article_id}", response_model=ArticleItem, status_code=200)
async def get_article(
article_id: str,
db: AsyncSession = Depends(get_db),
token_data: dict = Depends(verify_token),
) -> ArticleItem:
return ArticleItem(id=article_id)