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