# planner/services.py import json from .base import user_base, team_base, project_board_base from .storage import FileStorage from .exceptions import ValidationError, NotFoundError, ConflictError from .utils import now_iso, new_id MAX_NAME = 64 MAX_DISPLAY = 128 USERS = FileStorage("users.json") TEAMS = FileStorage("teams.json") class UserService(user_base): def create_user(self, request: str) -> str: payload = json.loads(request) name = payload.get("name", "").strip() display_name = payload.get("display_name", "").strip() if not name: raise ValidationError("User name required") if len(name) > MAX_NAME: raise ValidationError("User name too long") if len(display_name) > MAX_NAME: raise ValidationError("Display name too long") users = USERS.read_all() if any(u["name"] == name for u in users): raise ConflictError("User name must be unique") user = { "id": new_id(), "name": name, "display_name": display_name, "creation_time": now_iso() } USERS.append(user) return json.dumps({"id": user["id"]}) def list_users(self) -> str: users = USERS.read_all() return json.dumps([{ "name": u["name"], "display_name": u["display_name"], "creation_time": u["creation_time"] } for u in users]) def describe_user(self, request: str) -> str: user_id = json.loads(request)["id"] users = USERS.read_all() for u in users: if u["id"] == user_id: return json.dumps(u) raise NotFoundError("User not found") def update_user(self, request: str) -> str: payload = json.loads(request) user_id = payload["id"] updates = payload.get("user", {}) if "name" in updates: raise ValidationError("User name cannot be updated") if "display_name" in updates and len(updates["display_name"]) > MAX_DISPLAY: raise ValidationError("Display name too long") users = USERS.read_all() for i, u in enumerate(users): if u["id"] == user_id: u.update(updates) users[i] = u USERS.replace(users) return json.dumps({}) raise NotFoundError("User not found") def get_user_teams(self, request: str) -> str: user_id = json.loads(request)["id"] teams = TEAMS.read_all() result = [] for t in teams: if user_id == t.get("admin") or user_id in t.get("users", []): result.append({ "name": t["name"], "description": t.get("description"), "creation_time": t.get("creation_time") }) return json.dumps(result)