87 lines
2.6 KiB
Python
87 lines
2.6 KiB
Python
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)
|