xiangqinxiaochengxu/backend/app/services/announcement_service.py

57 lines
1.8 KiB
Python
Raw Normal View History

2026-04-17 10:49:14 +08:00
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession
from app.models.announcement import Announcement
from app.schemas.announcement import AdminAnnouncementUpsertRequest
async def list_announcements(session: AsyncSession, *, published_only: bool) -> list[Announcement]:
stmt = select(Announcement)
if published_only:
stmt = stmt.where(Announcement.is_published == 1)
stmt = stmt.order_by(Announcement.is_pinned.desc(), Announcement.created_at.desc())
result = await session.execute(stmt)
return result.scalars().all()
async def get_announcement_by_id(session: AsyncSession, announcement_id: int) -> Announcement | None:
return await session.get(Announcement, announcement_id)
async def create_announcement(
session: AsyncSession,
payload: AdminAnnouncementUpsertRequest,
admin_id: int,
) -> Announcement:
announcement = Announcement(
title=payload.title,
content=payload.content,
is_pinned=1 if payload.is_pinned else 0,
is_published=1 if payload.is_published else 0,
created_by=admin_id,
)
session.add(announcement)
await session.commit()
await session.refresh(announcement)
return announcement
async def update_announcement(
session: AsyncSession,
announcement: Announcement,
payload: AdminAnnouncementUpsertRequest,
) -> Announcement:
announcement.title = payload.title
announcement.content = payload.content
announcement.is_pinned = 1 if payload.is_pinned else 0
announcement.is_published = 1 if payload.is_published else 0
session.add(announcement)
await session.commit()
await session.refresh(announcement)
return announcement
async def delete_announcement(session: AsyncSession, announcement: Announcement) -> None:
await session.delete(announcement)
await session.commit()