let it go

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 self.database = database if database is not None else {"users": []}
12 # Ensure all users have the required fields
13 for user in self.database["users"]:
14 if "owes" not in user:
15 user["owes"] = {}
16 if "owed_by" not in user:
17 user["owed_by"] = {}
18 if "balance" not in user:
19 user["balance"] = 0.0
20
521 def get(self, url: str, payload: str | None = None) -> str:
6 pass
7
22 """
23 Handle GET requests to the API.
24
25 Args:
26 url: The endpoint URL.
27 payload: Optional JSON payload.
28
29 Returns:
30 JSON string response.
31 """
32 if url == "/users":
33 if payload is None:
34 # Return all users sorted by name
35 users = sorted(self.database["users"], key=lambda x: x["name"])
36 return json.dumps({"users": users})
37 else:
38 # Return specific users
39 data = json.loads(payload)
40 user_names = data.get("users", [])
41
42 # Edge Case: Empty user list in payload
43 if not user_names:
44 return json.dumps({"users": []})
45
46 # Filter users by name
47 result_users = [user for user in self.database["users"] if user["name"] in user_names]
48 # Sort by name
49 result_users = sorted(result_users, key=lambda x: x["name"])
50
51 # Edge Case: Some requested users don't exist
52 if len(result_users) != len(user_names):
53 # Only return users that exist
54 pass # We'll return what we have
55
56 return json.dumps({"users": result_users})
57
58 # Edge Case: Invalid URL
59 return json.dumps({"error": "Invalid URL"})
60
861 def post(self, url: str, payload: str | None = None) -> str:
9 pass
62 """
63 Handle POST requests to the API.
64
65 Args:
66 url: The endpoint URL.
67 payload: JSON payload.
68
69 Returns:
70 JSON string response.
71 """
72 if payload is None:
73 # Edge Case: Missing payload
74 return json.dumps({"error": "Payload required"})
75
76 data = json.loads(payload)
77
78 if url == "/add":
79 user_name = data.get("user")
80
81 # Edge Case: Missing user name
82 if not user_name:
83 return json.dumps({"error": "User name required"})
84
85 # Edge Case: User already exists
86 for user in self.database["users"]:
87 if user["name"] == user_name:
88 return json.dumps({"error": "User already exists"})
89
90 # Create new user
91 new_user = {
92 "name": user_name,
93 "owes": {},
94 "owed_by": {},
95 "balance": 0.0
96 }
97 self.database["users"].append(new_user)
98 return json.dumps(new_user)
99
100 elif url == "/iou":
101 lender_name = data.get("lender")
102 borrower_name = data.get("borrower")
103 amount = data.get("amount")
104
105 # Edge Case: Missing required fields
106 if not lender_name or not borrower_name or amount is None:
107 return json.dumps({"error": "Lender, borrower, and amount required"})
108
109 # Edge Case: Lender and borrower are the same
110 if lender_name == borrower_name:
111 return json.dumps({"error": "Lender and borrower cannot be the same"})
112
113 # Edge Case: Negative amount
114 if amount < 0:
115 return json.dumps({"error": "Amount must be positive"})
116
117 # Find lender and borrower
118 lender = None
119 borrower = None
120 for user in self.database["users"]:
121 if user["name"] == lender_name:
122 lender = user
123 if user["name"] == borrower_name:
124 borrower = user
125
126 # Edge Case: Lender or borrower doesn't exist
127 if not lender or not borrower:
128 return json.dumps({"error": "Lender or borrower does not exist"})
129
130 # Update IOUs
131 # Update lender's owed_by
132 if borrower_name in lender["owed_by"]:
133 lender["owed_by"][borrower_name] += amount
134 else:
135 lender["owed_by"][borrower_name] = amount
136
137 # Update borrower's owes
138 if lender_name in borrower["owes"]:
139 borrower["owes"][lender_name] += amount
140 else:
141 borrower["owes"][lender_name] = amount
142
143 # Recalculate balances
144 lender_total_owed = sum(lender["owed_by"].values())
145 lender_total_owes = sum(lender["owes"].values())
146 lender["balance"] = lender_total_owed - lender_total_owes
147
148 borrower_total_owed = sum(borrower["owed_by"].values())
149 borrower_total_owes = sum(borrower["owes"].values())
150 borrower["balance"] = borrower_total_owed - borrower_total_owes
151
152 # Return updated users sorted by name
153 result_users = sorted([lender, borrower], key=lambda x: x["name"])
154 return json.dumps({"users": result_users})
155
156 # Edge Case: Invalid URL
157 return json.dumps({"error": "Invalid URL"})
158
159 # Handled Edge Cases: Invalid URL, Missing payload, Missing user name, User already exists, Missing required fields,
160 # Lender and borrower are the same, Negative amount, Lender or borrower doesn't exist, Empty user list in payload,
161 # Some requested users don't exist
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.