"""Group assignment management endpoints.""" from pathlib import Path from fastapi import APIRouter, HTTPException from models import AssignMemberRequest, RemoveAssignmentRequest from services.server_state import STATE from utils import sync_state_from_file router = APIRouter(prefix="/api", tags=["assignments"]) @router.get("/assignments") async def api_get_assignments(): """ Return assignments snapshot: { "1": { "friendly": [...], "enemy": [...] }, "2": {...}, ... } """ snap = await STATE.get_assignments_snapshot() return snap @router.post("/assign_member") async def api_assign_member(req: AssignMemberRequest): group_id = req.group_id kind = req.kind member_id = req.member_id # Validate group if group_id not in STATE.groups: raise HTTPException(status_code=400, detail="invalid group_id") # Validate member exists in STATE (if not present, attempt to load from file) if kind not in ("friendly", "enemy"): raise HTTPException(status_code=400, detail="invalid kind") coll = STATE.friendly if kind == "friendly" else STATE.enemy if member_id not in coll: # Try to load members from file into STATE and re-check file_path = Path("data/friendly_members.json") if kind == "friendly" else Path("data/enemy_members.json") await sync_state_from_file(file_path, kind) if member_id not in coll: raise HTTPException(status_code=404, detail="member not found") await STATE.assign_member(member_id, kind, group_id) return {"status": "ok", "group": group_id, "kind": kind, "member_id": member_id} @router.post("/remove_member_assignment") async def api_remove_member_assignment(req: RemoveAssignmentRequest): member_id = req.member_id await STATE.remove_member_assignment(member_id) return {"status": "ok", "member_id": member_id} @router.post("/clear_assignments") async def api_clear_assignments(): await STATE.clear_all_assignments() return {"status": "ok"} @router.post("/reset_groups") async def reset_groups(): # Clear all assignments in server state await STATE.clear_all_assignments() return {"success": True}