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