from fastapi import APIRouter, HTTPException, Query, Depends, Form from typing import List from app.services.auth import AuthService from app.services.news import NewsService from app.models.news import NewsCreate, NewsUpdate, NewsInDB router = APIRouter(tags=["News"]) news_service = NewsService() # --- Публичные эндпоинты для лаунчера --- @router.get("/news", response_model=List[NewsInDB]) async def list_news( limit: int = Query(20, ge=1, le=100), skip: int = Query(0, ge=0), ): """ Список опубликованных новостей (для лаунчера). """ return await news_service.list_news(limit=limit, skip=skip, include_unpublished=False) @router.get("/news/{news_id}", response_model=NewsInDB) async def get_news(news_id: str): """ Получить одну новость по id (для лаунчера). """ return await news_service.get_news(news_id) # --- Админские эндпоинты (создание/редактирование) --- async def validate_admin(accessToken: str, clientToken: str): auth = AuthService() if not await auth.is_admin(accessToken, clientToken): raise HTTPException(status_code=403, detail="Admin privileges required") @router.post("/news", response_model=NewsInDB) async def create_news( accessToken: str = Form(...), clientToken: str = Form(...), title: str = Form(...), markdown: str = Form(...), preview: str = Form(""), is_published: bool = Form(True), ): await validate_admin(accessToken, clientToken) payload = NewsCreate( title=title, markdown=markdown, preview=preview or None, is_published=is_published, tags=[], ) return await news_service.create_news(payload) @router.put("/news/{news_id}", response_model=NewsInDB) async def update_news( news_id: str, accessToken: str = Form(...), clientToken: str = Form(...), title: str | None = Form(None), markdown: str | None = Form(None), preview: str | None = Form(None), is_published: bool | None = Form(None), ): await validate_admin(accessToken, clientToken) payload = NewsUpdate( title=title, markdown=markdown, preview=preview, is_published=is_published, ) return await news_service.update_news(news_id, payload) @router.delete("/news/{news_id}") async def delete_news( news_id: str, accessToken: str, clientToken: str, ): await validate_admin(accessToken, clientToken) return await news_service.delete_news(news_id)