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

76 lines
2.5 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
from app.database import get_db
from app.dependencies import get_current_admin
from app.schemas.announcement import AdminAnnouncementUpsertRequest
from app.services.announcement_service import (
create_announcement,
delete_announcement,
get_announcement_by_id,
list_announcements,
update_announcement,
)
router = APIRouter()
@router.get("")
async def get_all_announcements(
admin_payload: dict = Depends(get_current_admin),
session: AsyncSession = Depends(get_db),
) -> dict:
_ = admin_payload
items = await list_announcements(session, published_only=False)
data = [
{
"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,
}
for item in items
]
return {"code": 0, "message": "ok", "data": data}
@router.post("")
async def create(
payload: AdminAnnouncementUpsertRequest,
admin_payload: dict = Depends(get_current_admin),
session: AsyncSession = Depends(get_db),
) -> dict:
item = await create_announcement(session, payload, int(admin_payload["admin_id"]))
return {"code": 0, "message": "ok", "data": {"id": item.id}}
@router.put("/{announcement_id}")
async def update(
announcement_id: int,
payload: AdminAnnouncementUpsertRequest,
admin_payload: dict = Depends(get_current_admin),
session: AsyncSession = Depends(get_db),
) -> dict:
_ = admin_payload
item = await get_announcement_by_id(session, announcement_id)
if item is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Announcement not found")
updated = await update_announcement(session, item, payload)
return {"code": 0, "message": "ok", "data": {"id": updated.id}}
@router.delete("/{announcement_id}")
async def delete(
announcement_id: int,
admin_payload: dict = Depends(get_current_admin),
session: AsyncSession = Depends(get_db),
) -> dict:
_ = admin_payload
item = await get_announcement_by_id(session, announcement_id)
if item is None:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Announcement not found")
await delete_announcement(session, item)
return {"code": 0, "message": "ok", "data": {"id": announcement_id}}