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()