diff options
Diffstat (limited to 'django/factwise-python/factwise_submission/plannerapp/services.py')
| -rw-r--r-- | django/factwise-python/factwise_submission/plannerapp/services.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/django/factwise-python/factwise_submission/plannerapp/services.py b/django/factwise-python/factwise_submission/plannerapp/services.py new file mode 100644 index 0000000..fb8dbdf --- /dev/null +++ b/django/factwise-python/factwise_submission/plannerapp/services.py @@ -0,0 +1,88 @@ +# 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) + |
