1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
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)
|