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 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 sorted by name
30 users = sorted(self.database["users"], key=lambda x: x["name"])
31 return json.dumps({"users": users})
32 else:
33 # Return specified users sorted by name
34 data = json.loads(payload)
35 user_names = data.get("users", [])
36
37 # Edge Case: Handle when users list is empty
38 if not user_names:
39 return json.dumps({"users": []})
40
41 # Filter users by name
42 users = [user for user in self.database["users"] if user["name"] in user_names]
43
44 # Edge Case: Handle when some requested users don't exist
45 if len(users) != len(user_names):
46 # Only return users that exist
47 pass
48
49 # Sort by name
50 users = sorted(users, key=lambda x: x["name"])
51 return json.dumps({"users": users})
52
53 # Edge Case: Handle unknown URL
54 return json.dumps({"error": "Not found"})
55
856 def post(self, url: str, payload: str | None = None) -> str:
9 pass
57 """
58 Handle POST requests to the API.
59
60 Args:
61 url: The endpoint URL.
62 payload: JSON payload.
63
64 Returns:
65 A JSON string response.
66 """
67 if payload is None:
68 # Edge Case: Handle missing payload
69 return json.dumps({"error": "Payload required"})
70
71 data = json.loads(payload)
72
73 if url == "/add":
74 user_name = data.get("user")
75
76 # Edge Case: Handle missing user name
77 if not user_name:
78 return json.dumps({"error": "User name required"})
79
80 # Edge Case: Handle duplicate user
81 for user in self.database["users"]:
82 if user["name"] == user_name:
83 return json.dumps({"error": "User already exists"})
84
85 # Create new user
86 new_user = {
87 "name": user_name,
88 "owes": {},
89 "owed_by": {},
90 "balance": 0.0
91 }
92 self.database["users"].append(new_user)
93 return json.dumps(new_user)
94
95 elif url == "/iou":
96 lender_name = data.get("lender")
97 borrower_name = data.get("borrower")
98 amount = data.get("amount")
99
100 # Edge Case: Handle missing fields
101 if not lender_name or not borrower_name or amount is None:
102 return json.dumps({"error": "Lender, borrower, and amount required"})
103
104 # Edge Case: Handle invalid amount type
105 if not isinstance(amount, (int, float)):
106 return json.dumps({"error": "Amount must be a number"})
107
108 # Edge Case: Handle negative amount
109 if amount < 0:
110 return json.dumps({"error": "Amount must be positive"})
111
112 # Edge Case: Handle same lender and borrower
113 if lender_name == borrower_name:
114 return json.dumps({"error": "Lender and borrower cannot be the same"})
115
116 # Find lender and borrower
117 lender = None
118 borrower = None
119 for user in self.database["users"]:
120 if user["name"] == lender_name:
121 lender = user
122 if user["name"] == borrower_name:
123 borrower = user
124
125 # Edge Case: Handle non-existent lender or borrower
126 if lender is None or borrower is None:
127 return json.dumps({"error": "Both lender and borrower must exist"})
128
129 # Update lender's owed_by
130 if borrower_name in lender["owed_by"]:
131 lender["owed_by"][borrower_name] += amount
132 else:
133 lender["owed_by"][borrower_name] = amount
134
135 # Update borrower's owes
136 if lender_name in borrower["owes"]:
137 borrower["owes"][lender_name] += amount
138 else:
139 borrower["owes"][lender_name] = amount
140
141 # Update balances
142 lender["balance"] += amount
143 borrower["balance"] -= amount
144
145 # Return updated users sorted by name
146 users = sorted([lender, borrower], key=lambda x: x["name"])
147 return json.dumps({"users": users})
148
149 # Edge Case: Handle unknown URL
150 return json.dumps({"error": "Not found"})
151
152 # Handled Edge Cases: Missing payload, missing user name, duplicate user, missing fields,
153 # invalid amount type, negative amount, same lender and borrower, non-existent lender or borrower,
154 # unknown URL
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.