Files
popa_minecraft_launcher_api/app/api/news.py
2025-12-06 00:14:04 +05:00

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)