Adding bulletin support.

This commit is contained in:
Michael Woods
2025-12-21 22:44:08 -05:00
parent 7fb1a28506
commit 64b3d46586
2 changed files with 77 additions and 2 deletions

View File

@@ -0,0 +1,74 @@
# packetserver/http/routers/bulletins.py
from fastapi import APIRouter, Path, Query, Depends, HTTPException
from typing import Optional
from datetime import datetime
import transaction
from packetserver.http.dependencies import get_current_http_user
from packetserver.http.auth import HttpUser
from packetserver.server.bulletin import Bulletin # core class
router = APIRouter(prefix="/api/v1", tags=["bulletins"])
@router.get("/bulletins")
async def list_bulletins(
limit: Optional[int] = Query(20, le=100, description="Max bulletins to return"),
since: Optional[str] = Query(None, description="ISO UTC timestamp filter")
):
from packetserver.runners.http_server import get_db_connection
conn = get_db_connection()
root = conn.root()
bulletins_list = root.get('bulletins', [])
if not bulletins_list:
return {"bulletins": [], "total": 0}
since_dt = None
if since:
try:
since_dt = datetime.fromisoformat(since.replace("Z", "+00:00"))
except ValueError:
raise HTTPException(status_code=400, detail="Invalid 'since' format")
filtered = []
for bull in reversed(bulletins_list): # newest first (assuming appended order)
if since_dt and bull.created_at < since_dt:
continue
filtered.append({
"id": bull.id,
"author": bull.author,
"subject": bull.subject,
"body": bull.body,
"created_at": bull.created_at.isoformat() + "Z",
"updated_at": bull.updated_at.isoformat() + "Z",
})
return {
"bulletins": filtered[:limit],
"total": len(filtered)
}
@router.get("/bulletins/{bid}")
async def get_bulletin(
bid: int = Path(..., description="Bulletin ID"),
current_user: HttpUser = Depends(get_current_http_user) # require auth, but public read
):
from packetserver.runners.http_server import get_db_connection
conn = get_db_connection()
root = conn.root()
bulletins_list = root.get('bulletins', [])
for bull in bulletins_list:
if bull.id == bid:
return {
"id": bull.id,
"author": bull.author,
"subject": bull.subject,
"body": bull.body,
"created_at": bull.created_at.isoformat() + "Z",
"updated_at": bull.updated_at.isoformat() + "Z",
}
raise HTTPException(status_code=404, detail="Bulletin not found")

View File

@@ -4,7 +4,7 @@ from fastapi.staticfiles import StaticFiles
from fastapi.templating import Jinja2Templates
from pathlib import Path
from .routers import public, profile, messages, send # dashboard removed for now
from .routers import public, profile, messages, send, bulletins
BASE_DIR = Path(__file__).parent.resolve()
@@ -28,4 +28,5 @@ app.include_router(public.router)
app.include_router(profile.router)
app.include_router(messages.router)
app.include_router(send.router)
app.include_router(dashboard.router) # now works
app.include_router(dashboard.router)
app.include_router(bulletins.router)