summaryrefslogtreecommitdiff
path: root/django/factwise-python/factwise_submission/plannerapp/services.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/factwise-python/factwise_submission/plannerapp/services.py')
-rw-r--r--django/factwise-python/factwise_submission/plannerapp/services.py88
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)
+