"""Announcements — super admin creates, all users read.""" from datetime import datetime, timezone from typing import Optional from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from sqlalchemy.ext.asyncio import AsyncSession from sqlalchemy import select, desc, and_ from app.auth.dependencies import require_super_admin, get_current_user from app.database import get_db from app.models.user import HubUser from app.models.announcement import Announcement router = APIRouter(prefix="/api/announcements", tags=["announcements"]) class AnnouncementCreate(BaseModel): title: str body: str expires_at: Optional[datetime] = None @router.get("") async def list_announcements( current_user: HubUser = Depends(get_current_user), db: AsyncSession = Depends(get_db), ): stmt = select(Announcement).where( and_(Announcement.is_active == True, (Announcement.expires_at == None) | (Announcement.expires_at > datetime.now(timezone.utc))) ).order_by(desc(Announcement.created_at)).limit(10) items = (await db.execute(stmt)).scalars().all() return [{"id": a.id, "title": a.title, "body": a.body, "created_at": a.created_at.isoformat()} for a in items] @router.post("", status_code=201) async def create_announcement( body: AnnouncementCreate, admin: HubUser = Depends(require_super_admin), db: AsyncSession = Depends(get_db), ): ann = Announcement(title=body.title, body=body.body, created_by=admin.id, expires_at=body.expires_at) db.add(ann) await db.commit() return {"id": ann.id, "title": ann.title, "created_at": ann.created_at.isoformat()} @router.delete("/{ann_id}", status_code=204) async def delete_announcement( ann_id: str, _admin: HubUser = Depends(require_super_admin), db: AsyncSession = Depends(get_db), ): ann = (await db.execute(select(Announcement).where(Announcement.id == ann_id))).scalar_one_or_none() if not ann: raise HTTPException(404) ann.is_active = False await db.commit()