test news

This commit is contained in:
2025-12-06 00:14:04 +05:00
parent 730ee97666
commit 93fbd14cc4
5 changed files with 225 additions and 1 deletions

86
app/api/news.py Normal file
View File

@ -0,0 +1,86 @@
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)