xiangqinxiaochengxu/backend/app/routers/announcements.py
2026-04-17 10:49:14 +08:00

51 lines
1.7 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlalchemy.ext.asyncio import AsyncSession
from app.database import get_db
from app.schemas.announcement import AnnouncementDetailResponse, AnnouncementListItem
from app.services.announcement_service import get_announcement_by_id, list_announcements
router = APIRouter()
@router.get("")
async def get_announcements(
page: int = Query(default=1, ge=1),
page_size: int = Query(default=10, ge=1, le=50),
session: AsyncSession = Depends(get_db),
) -> dict:
items = await list_announcements(session, published_only=True)
start = (page - 1) * page_size
end = start + page_size
data = [
AnnouncementListItem(
id=item.id,
title=item.title,
is_pinned=item.is_pinned,
is_published=item.is_published,
created_at=item.created_at.isoformat() if item.created_at else None,
).model_dump()
for item in items[start:end]
]
return {"code": 0, "message": "ok", "data": data}
@router.get("/{announcement_id}")
async def get_announcement(
announcement_id: int,
session: AsyncSession = Depends(get_db),
) -> dict:
item = await get_announcement_by_id(session, announcement_id)
if item is None or item.is_published != 1:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Announcement not found")
data = AnnouncementDetailResponse(
id=item.id,
title=item.title,
content=item.content,
is_pinned=item.is_pinned,
is_published=item.is_published,
created_at=item.created_at.isoformat() if item.created_at else None,
).model_dump()
return {"code": 0, "message": "ok", "data": data}