51 lines
1.7 KiB
Python
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}
|