76 lines
2.5 KiB
Python
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}}
|