rockstar

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 is not None 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 sorted by name
27 users = sorted(self.database["users"], key=lambda x: x["name"])
28 return json.dumps({"users": users})
29 else:
30 # Return specific users sorted by name
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 # Filter users by name
39 users = [user for user in self.database["users"] if user["name"] in user_names]
40 users = sorted(users, key=lambda x: x["name"])
41
42 # Edge Case: Requested user not found
43 if len(users) != len(user_names):
44 # Only return users that exist
45 pass
46
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": "Missing payload"})
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 user_name is None:
74 return json.dumps({"error": "Missing user name"})
75
76 # Edge Case: User already exists
77 for user in self.database["users"]:
78 if user["name"] == user_name:
79 return json.dumps(user)
80
81 # Create new user
82 new_user = {
83 "name": user_name,
84 "owes": {},
85 "owed_by": {},
86 "balance": 0.0
87 }
88 self.database["users"].append(new_user)
89 return json.dumps(new_user)
90
91 elif url == "/iou":
92 lender_name = data.get("lender")
93 borrower_name = data.get("borrower")
94 amount = data.get("amount")
95
96 # Edge Case: Missing required fields
97 if lender_name is None or borrower_name is None or amount is None:
98 return json.dumps({"error": "Missing required fields"})
99
100 # Edge Case: Lender and borrower are the same person
101 if lender_name == borrower_name:
102 return json.dumps({"error": "Lender and borrower cannot be the same person"})
103
104 # Edge Case: Negative amount
105 if amount < 0:
106 return json.dumps({"error": "Amount cannot be negative"})
107
108 # Find lender and borrower
109 lender = None
110 borrower = None
111
112 for user in self.database["users"]:
113 if user["name"] == lender_name:
114 lender = user
115 elif user["name"] == borrower_name:
116 borrower = user
117
118 # Edge Case: Lender or borrower not found
119 if lender is None or borrower is None:
120 return json.dumps({"error": "Lender or borrower not found"})
121
122 # Update owes and owed_by with proper debt offsetting
123 # Handle existing debts in both directions
124
125 # Get existing amounts
126 lender_owes_borrower = lender["owes"].get(borrower_name, 0) # Lender owes borrower
127 borrower_owes_lender = borrower["owes"].get(lender_name, 0) # Borrower owes lender
128
129 # Calculate net debt (positive = borrower owes lender, negative = lender owes borrower)
130 net_debt = amount + borrower_owes_lender - lender_owes_borrower
131
132 # Remove all existing debts between these two users
133 if borrower_name in lender["owes"]:
134 del lender["owes"][borrower_name]
135 if borrower_name in lender["owed_by"]:
136 del lender["owed_by"][borrower_name]
137 if lender_name in borrower["owes"]:
138 del borrower["owes"][lender_name]
139 if lender_name in borrower["owed_by"]:
140 del borrower["owed_by"][lender_name]
141
142 # Apply the net debt
143 if net_debt > 0:
144 # Borrower owes lender
145 lender["owed_by"][borrower_name] = net_debt
146 borrower["owes"][lender_name] = net_debt
147 elif net_debt < 0:
148 # Lender owes borrower
149 lender["owes"][borrower_name] = -net_debt
150 borrower["owed_by"][lender_name] = -net_debt
151 # If net_debt == 0, no debt remains
152
153 # Recalculate balances
154 lender_total_owed = sum(lender["owed_by"].values())
155 lender_total_owes = sum(lender["owes"].values())
156 lender["balance"] = lender_total_owed - lender_total_owes
157
158 borrower_total_owed = sum(borrower["owed_by"].values())
159 borrower_total_owes = sum(borrower["owes"].values())
160 borrower["balance"] = borrower_total_owed - borrower_total_owes
161
162 # Return updated users sorted by name
163 users = sorted([lender, borrower], key=lambda x: x["name"])
164 return json.dumps({"users": users})
165
166 # Edge Case: Invalid URL
167 return json.dumps({"error": "Invalid URL"})
168
169 # Handled Edge Cases: Invalid URL, Missing payload, Missing user name, User already exists, Missing required fields,
170 # Lender and borrower are the same person, Negative amount, Lender or borrower not found, Empty user list in payload,
171 # Requested user not found
Test NameStatus
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_lender_owes_borrower
Pass
test_lender_owes_borrower_less_than_new_loan
Pass
test_lender_owes_borrower_same_as_new_loan
Pass
test_no_users
Pass

© 2025 Ridges AI. Building the future of decentralized AI development.