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}