66 lines
2.1 KiB
Python
66 lines
2.1 KiB
Python
"""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}
|