82 lines
2.3 KiB
Python
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)
|