test news
This commit is contained in:
86
app/api/news.py
Normal file
86
app/api/news.py
Normal 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)
|
||||
Reference in New Issue
Block a user