let it go

Finished
1import json
2from typing import Dict, List, Optional, Any
3
14class RestAPI:
25 def __init__(self, database: dict | None = None):
3 pass
4
6 """
7 Initialize the REST API with a database of users.
8
9 Args:
10 database: A dictionary containing user data with the structure:
11 {"users": [{"name": str, "owes": dict, "owed_by": dict, "balance": float}]}
12 """
13 if database is None:
14 self.database = {"users": []}
15 else:
16 self.database = database
17
518 def get(self, url: str, payload: str | None = None) -> str:
6 pass
7
19 """
20 Handle GET requests to the API.
21
22 Args:
23 url: The endpoint URL (e.g., "/users")
24 payload: Optional JSON payload with request parameters
25
26 Returns:
27 JSON string response
28 """
29 if url == "/users":
30 if payload is None:
31 # Return all users sorted by name
32 sorted_users = sorted(self.database["users"], key=lambda x: x["name"])
33 return json.dumps({"users": sorted_users})
34 else:
35 # Return specific users
36 payload_data = json.loads(payload)
37 requested_users = payload_data.get("users", [])
38
39 # Edge Case: Handle when users list is empty
40 if not requested_users:
41 return json.dumps({"users": []})
42
43 # Filter users
44 result_users = [user for user in self.database["users"] if user["name"] in requested_users]
45
46 # Edge Case: Handle when requested users don't exist
47 # Sort by name
48 result_users.sort(key=lambda x: x["name"])
49 return json.dumps({"users": result_users})
50
51 # Edge Case: Handle unknown URL
52 return json.dumps({"error": "Not found"})
53
854 def post(self, url: str, payload: str | None = None) -> str:
9 pass
55 """
56 Handle POST requests to the API.
57
58 Args:
59 url: The endpoint URL (e.g., "/add", "/iou")
60 payload: JSON payload with request data
61
62 Returns:
63 JSON string response
64 """
65 if payload is None:
66 # Edge Case: Handle missing payload
67 return json.dumps({"error": "Payload required"})
68
69 try:
70 payload_data = json.loads(payload)
71 except json.JSONDecodeError:
72 # Edge Case: Handle invalid JSON
73 return json.dumps({"error": "Invalid JSON"})
74
75 if url == "/add":
76 user_name = payload_data.get("user")
77
78 # Edge Case: Handle missing user name
79 if not user_name:
80 return json.dumps({"error": "User name required"})
81
82 # Edge Case: Handle duplicate user
83 for user in self.database["users"]:
84 if user["name"] == user_name:
85 return json.dumps({"error": "User already exists"})
86
87 # Create new user
88 new_user = {
89 "name": user_name,
90 "owes": {},
91 "owed_by": {},
92 "balance": 0.0
93 }
94 self.database["users"].append(new_user)
95 return json.dumps(new_user)
96
97 elif url == "/iou":
98 lender_name = payload_data.get("lender")
99 borrower_name = payload_data.get("borrower")
100 amount = payload_data.get("amount")
101
102 # Edge Case: Handle missing fields
103 if not lender_name or not borrower_name or amount is None:
104 return json.dumps({"error": "Lender, borrower, and amount are required"})
105
106 # Edge Case: Handle invalid amount type
107 if not isinstance(amount, (int, float)):
108 return json.dumps({"error": "Amount must be a number"})
109
110 # Edge Case: Handle negative amount
111 if amount < 0:
112 return json.dumps({"error": "Amount must be positive"})
113
114 # Edge Case: Handle same lender and borrower
115 if lender_name == borrower_name:
116 return json.dumps({"error": "Lender and borrower cannot be the same"})
117
118 # Check if users exist
119 lender = None
120 borrower = None
121 for user in self.database["users"]:
122 if user["name"] == lender_name:
123 lender = user
124 elif user["name"] == borrower_name:
125 borrower = user
126
127 # Edge Case: Handle non-existent lender or borrower
128 if lender is None or borrower is None:
129 return json.dumps({"error": "Both lender and borrower must exist"})
130
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: Handle unknown URL
157 return json.dumps({"error": "Not found"})
158
159 # Handled Edge Cases: Missing payload, Invalid JSON, Missing user name, Duplicate user, Missing fields,
160 # Invalid amount type, Negative amount, Same lender and borrower, Non-existent lender or borrower, Unknown URL
161# Handled Edge Cases: Unknown URL, Missing 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.