57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
|
|
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()
|