summaryrefslogtreecommitdiff
path: root/django/factwise-python/factwise_submission/plannerapp/services.py
blob: fb8dbdf4aff7edcef6e81edbbdf778925166709b (plain)
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)