agent

Finished
1import json
2
13class RestAPI:
24 def __init__(self, database: dict | None = None):
3 pass
4
5 """
6 Initialize the REST API with an optional database.
7
8 Args:
9 database: A dictionary containing initial user data.
10 """
11 if database is None:
12 self.database = {"users": []}
13 else:
14 self.database = database
15
516 def get(self, url: str, payload: str | None = None) -> str:
6 pass
7
17 """
18 Handle GET requests to the API.
19
20 Args:
21 url: The endpoint URL.
22 payload: Optional JSON payload.
23
24 Returns:
25 A JSON string response.
26 """
27 if url == "/users":
28 if payload is None:
29 # Return all users
30 users = [self._create_user_object(user) for user in self.database["users"]]
31 return json.dumps({"users": users})
32 else:
33 # Return specific users
34 data = json.loads(payload)
35 user_names = data.get("users", [])
36
37 # Edge Case: Empty user list in payload
38 if not user_names:
39 return json.dumps({"users": []})
40
41 # Edge Case: Non-existent users in payload
42 result_users = []
43 for user_name in user_names:
44 user = self._find_user(user_name)
45 if user:
46 result_users.append(self._create_user_object(user))
47
48 # Sort by name
49 result_users.sort(key=lambda u: u["name"])
50 return json.dumps({"users": result_users})
51
52 # Edge Case: Invalid URL
53 return json.dumps({"error": "Invalid URL"})
54
855 def post(self, url: str, payload: str | None = None) -> str:
9 pass
56 """
57 Handle POST requests to the API.
58
59 Args:
60 url: The endpoint URL.
61 payload: JSON payload.
62
63 Returns:
64 A JSON string response.
65 """
66 if payload is None:
67 # Edge Case: Missing payload
68 return json.dumps({"error": "Payload required"})
69
70 data = json.loads(payload)
71
72 if url == "/add":
73 user_name = data.get("user")
74
75 # Edge Case: Missing user name
76 if not user_name:
77 return json.dumps({"error": "User name required"})
78
79 # Edge Case: User already exists
80 if self._find_user(user_name):
81 return json.dumps({"error": "User already exists"})
82
83 new_user = {
84 "name": user_name,
85 "owes": {},
86 "owed_by": {},
87 "balance": 0.0
88 }
89 self.database["users"].append(new_user)
90 return json.dumps(self._create_user_object(new_user))
91
92 elif url == "/iou":
93 lender_name = data.get("lender")
94 borrower_name = data.get("borrower")
95 amount = data.get("amount")
96
97 # Edge Case: Missing required fields
98 if not lender_name or not borrower_name or amount is None:
99 return json.dumps({"error": "Lender, borrower, and amount required"})
100
101 # Edge Case: Lender and borrower are the same
102 if lender_name == borrower_name:
103 return json.dumps({"error": "Lender and borrower cannot be the same"})
104
105 lender = self._find_user(lender_name)
106 borrower = self._find_user(borrower_name)
107
108 # Edge Case: Non-existent lender or borrower
109 if not lender or not borrower:
110 return json.dumps({"error": "Both lender and borrower must exist"})
111
112 # Edge Case: Invalid amount type or negative amount
113 if not isinstance(amount, (int, float)) or amount < 0:
114 return json.dumps({"error": "Amount must be a non-negative number"})
115
116 # Update lender's owed_by
117 if borrower_name in lender["owed_by"]:
118 lender["owed_by"][borrower_name] += amount
119 else:
120 lender["owed_by"][borrower_name] = amount
121
122 # Update borrower's owes
123 if lender_name in borrower["owes"]:
124 borrower["owes"][lender_name] += amount
125 else:
126 borrower["owes"][lender_name] = amount
127
128 # Update balances
129 lender["balance"] += amount
130 borrower["balance"] -= amount
131
132 # Return updated user objects
133 updated_users = [
134 self._create_user_object(lender),
135 self._create_user_object(borrower)
136 ]
137 updated_users.sort(key=lambda u: u["name"])
138 return json.dumps({"users": updated_users})
139
140 # Edge Case: Invalid URL
141 return json.dumps({"error": "Invalid URL"})
142
143 def _find_user(self, name: str):
144 """
145 Find a user by name in the database.
146
147 Args:
148 name: The name of the user to find.
149
150 Returns:
151 The user dictionary if found, None otherwise.
152 """
153 for user in self.database["users"]:
154 if user["name"] == name:
155 return user
156 return None
157
158 def _create_user_object(self, user: dict):
159 """
160 Create a user object for API responses.
161
162 Args:
163 user: The user dictionary from the database.
164
165 Returns:
166 A user object for API responses.
167 """
168 # Calculate balance as (total owed by others) - (total owed to others)
169 total_owed_by = sum(user["owed_by"].values())
170 total_owes = sum(user["owes"].values())
171 balance = round(total_owed_by - total_owes, 2)
172
173 return {
174 "name": user["name"],
175 "owes": user["owes"],
176 "owed_by": user["owed_by"],
177 "balance": balance
178 }
179 # Handled Edge Cases: Invalid URL, Missing payload, Missing user name, User already exists,
180 # Missing required fields, Lender and borrower are the same, Non-existent lender or borrower,
181 # Invalid amount type or negative amount, Empty user list in payload, Non-existent users in payload
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.