from fastapi import APIRouter, HTTPException, Query from typing import Optional from app.services.article_service import ArticleService from app.models.article import ArticleList, Article, ArticleSummary from typing import List router = APIRouter() @router.get("/{language}/articles", response_model=ArticleList) async def get_articles( language: str, page: int = Query(1, ge=1, description="Page number"), page_size: int = Query(20, ge=1, le=100, description="Items per page"), category: Optional[str] = Query(None, description="Filter by category") ): """기사 목록 조회""" if not ArticleService.validate_language(language): raise HTTPException(status_code=400, detail=f"Unsupported language: {language}") return await ArticleService.get_articles(language, page, page_size, category) @router.get("/{language}/articles/latest", response_model=List[ArticleSummary]) async def get_latest_articles( language: str, limit: int = Query(10, ge=1, le=50, description="Number of articles") ): """최신 기사 조회""" if not ArticleService.validate_language(language): raise HTTPException(status_code=400, detail=f"Unsupported language: {language}") return await ArticleService.get_latest_articles(language, limit) @router.get("/{language}/articles/search", response_model=ArticleList) async def search_articles( language: str, q: str = Query(..., min_length=1, description="Search keyword"), page: int = Query(1, ge=1, description="Page number"), page_size: int = Query(20, ge=1, le=100, description="Items per page") ): """기사 검색""" if not ArticleService.validate_language(language): raise HTTPException(status_code=400, detail=f"Unsupported language: {language}") return await ArticleService.search_articles(language, q, page, page_size) @router.get("/{language}/articles/{article_id}", response_model=Article) async def get_article_by_id( language: str, article_id: str ): """ID로 기사 조회""" if not ArticleService.validate_language(language): raise HTTPException(status_code=400, detail=f"Unsupported language: {language}") article = await ArticleService.get_article_by_id(language, article_id) if not article: raise HTTPException(status_code=404, detail="Article not found") return article @router.get("/{language}/categories", response_model=List[str]) async def get_categories(language: str): """카테고리 목록 조회""" if not ArticleService.validate_language(language): raise HTTPException(status_code=400, detail=f"Unsupported language: {language}") return await ArticleService.get_categories(language)