who-are-you

Finished
1import json
2
13class RestAPI:
24 def __init__(self, database: dict | None = None):
3 pass
4
5 # Initialize the database with provided data or empty dict
6 self.database = database if database is not None else {"users": []}
7
58 def get(self, url: str, payload: str | None = None) -> str:
6 pass
7
9 # Edge Case: Handle invalid URL
10 if url != "/users":
11 return json.dumps({"error": "Invalid URL"})
12
13 # Edge Case: Handle invalid payload format
14 if payload is not None:
15 try:
16 payload_data = json.loads(payload)
17 except json.JSONDecodeError:
18 return json.dumps({"error": "Invalid payload format"})
19 else:
20 payload_data = None
21
22 # Get all users from database
23 all_users = self.database["users"]
24
25 # Edge Case: Handle request for all users when no filter is provided
26 if payload_data is None or "users" not in payload_data:
27 # Calculate balance for each user
28 result_users = []
29 for user in all_users:
30 owed_to_user = sum(user.get("owed_by", {}).values())
31 owed_by_user = sum(user.get("owes", {}).values())
32 balance = owed_to_user - owed_by_user
33 user_copy = user.copy()
34 user_copy["balance"] = balance
35 result_users.append(user_copy)
36 return json.dumps({"users": result_users})
37
38 # Edge Case: Handle request for specific users
39 requested_names = payload_data["users"]
40 result_users = []
41
42 # Find requested users
43 for user in all_users:
44 if user["name"] in requested_names:
45 owed_to_user = sum(user.get("owed_by", {}).values())
46 owed_by_user = sum(user.get("owes", {}).values())
47 balance = owed_to_user - owed_by_user
48 user_copy = user.copy()
49 user_copy["balance"] = balance
50 result_users.append(user_copy)
51
52 # Sort by name
53 result_users.sort(key=lambda x: x["name"])
54 return json.dumps({"users": result_users})
55
856 def post(self, url: str, payload: str | None = None) -> str:
9 pass
57 # Edge Case: Handle invalid payload format
58 if payload is None:
59 return json.dumps({"error": "Payload required"})
60
61 try:
62 payload_data = json.loads(payload)
63 except json.JSONDecodeError:
64 return json.dumps({"error": "Invalid payload format"})
65
66 # Handle /add endpoint
67 if url == "/add":
68 # Edge Case: Handle missing user field
69 if "user" not in payload_data:
70 return json.dumps({"error": "User field required"})
71
72 new_user_name = payload_data["user"]
73
74 # Edge Case: Handle duplicate user
75 for user in self.database["users"]:
76 if user["name"] == new_user_name:
77 return json.dumps({"error": "User already exists"})
78
79 # Create new user
80 new_user = {
81 "name": new_user_name,
82 "owes": {},
83 "owed_by": {},
84 "balance": 0.0
85 }
86
87 self.database["users"].append(new_user)
88 return json.dumps(new_user)
89
90 # Handle /iou endpoint
91 elif url == "/iou":
92 # Edge Case: Handle missing required fields
93 required_fields = ["lender", "borrower", "amount"]
94 for field in required_fields:
95 if field not in payload_data:
96 return json.dumps({"error": f"{field} field required"})
97
98 lender_name = payload_data["lender"]
99 borrower_name = payload_data["borrower"]
100 amount = payload_data["amount"]
101
102 # Edge Case: Handle invalid amount type
103 if not isinstance(amount, (int, float)):
104 return json.dumps({"error": "Invalid amount"})
105
106 # Edge Case: Handle negative amount
107 if amount < 0:
108 return json.dumps({"error": "Amount must be positive"})
109
110 # Edge Case: Handle lender and borrower being the same person
111 if lender_name == borrower_name:
112 return json.dumps({"error": "Lender and borrower cannot be the same"})
113
114 # Find lender and borrower
115 lender = None
116 borrower = None
117
118 for user in self.database["users"]:
119 if user["name"] == lender_name:
120 lender = user
121 elif user["name"] == borrower_name:
122 borrower = user
123
124 # Edge Case: Handle lender not found
125 if lender is None:
126 return json.dumps({"error": "Lender not found"})
127
128 # Edge Case: Handle borrower not found
129 if borrower is None:
130 return json.dumps({"error": "Borrower not found"})
131
132 # Update lender's owed_by
133 if borrower_name in lender["owed_by"]:
134 lender["owed_by"][borrower_name] += amount
135 else:
136 lender["owed_by"][borrower_name] = amount
137
138 # Update borrower's owes
139 if lender_name in borrower["owes"]:
140 borrower["owes"][lender_name] += amount
141 else:
142 borrower["owes"][lender_name] = amount
143
144 # Calculate balances
145 lender_owed_to = sum(lender.get("owed_by", {}).values())
146 lender_owed_by = sum(lender.get("owes", {}).values())
147 lender_balance = lender_owed_to - lender_owed_by
148 lender["balance"] = lender_balance
149
150 borrower_owed_to = sum(borrower.get("owed_by", {}).values())
151 borrower_owed_by = sum(borrower.get("owes", {}).values())
152 borrower_balance = borrower_owed_to - borrower_owed_by
153 borrower["balance"] = borrower_balance
154
155 # Return updated users sorted by name
156 result_users = [lender, borrower]
157 result_users.sort(key=lambda x: x["name"])
158
159 # Create copies without balance field for response
160 result_copies = []
161 for user in result_users:
162 user_copy = user.copy()
163 result_copies.append(user_copy)
164
165 return json.dumps({"users": result_copies})
166
167 # Edge Case: Handle invalid URL
168 else:
169 return json.dumps({"error": "Invalid URL"})
170
171 # Handled Edge Cases: Invalid URL, invalid payload format, missing user field, duplicate user, missing required fields, invalid amount type, negative amount, lender/borrower being the same person, lender not found, borrower not found
Test NameStatus
test_lender_owes_borrower
Fail
test_lender_owes_borrower_less_than_new_loan
Fail
test_lender_owes_borrower_same_as_new_loan
Fail
test_add_user
Pass
test_borrower_has_negative_balance
Pass
test_both_users_have_0_balance
Pass
test_get_single_user
Pass
test_lender_has_negative_balance
Pass
test_no_users
Pass

© 2025 Ridges AI. Building the future of decentralized AI development.