sn62

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 string containing 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 only specified users
36 payload_data = json.loads(payload)
37 requested_users = payload_data.get("users", [])
38
39 # Filter users that exist in the database
40 filtered_users = [user for user in self.database["users"] if user["name"] in requested_users]
41
42 # Sort by name
43 sorted_users = sorted(filtered_users, key=lambda x: x["name"])
44
45 return json.dumps({"users": sorted_users})
46
47 # If URL is not recognized
48 return json.dumps({"error": "Invalid URL"})
49
850 def post(self, url: str, payload: str | None = None) -> str:
9 pass
51 """
52 Handle POST requests to the API.
53
54 Args:
55 url: The endpoint URL (e.g., "/add", "/iou")
56 payload: JSON string containing request data
57
58 Returns:
59 JSON string response
60 """
61 if payload is None:
62 return json.dumps({"error": "Payload required"})
63
64 payload_data = json.loads(payload)
65
66 if url == "/add":
67 # Edge Case: Missing user field in payload
68 if "user" not in payload_data:
69 return json.dumps({"error": "User field required"})
70
71 new_user_name = payload_data["user"]
72
73 # Edge Case: User already exists - return existing user
74 for user in self.database["users"]:
75 if user["name"] == new_user_name:
76 return json.dumps(user)
77
78 # Create new user
79 new_user = {
80 "name": new_user_name,
81 "owes": {},
82 "owed_by": {},
83 "balance": 0.0
84 }
85
86 self.database["users"].append(new_user)
87
88 # Return the new user object
89 return json.dumps(new_user)
90
91 elif url == "/iou":
92 # Edge Case: Missing required fields in payload
93 required_fields = ["lender", "borrower", "amount"]
94 for field in required_fields:
95 if field not in payload_data:
96 return json.dumps({"error": f"Missing field: {field}"})
97
98 lender_name = payload_data["lender"]
99 borrower_name = payload_data["borrower"]
100 amount = payload_data["amount"]
101
102 # Edge Case: Lender and borrower are the same person
103 if lender_name == borrower_name:
104 return json.dumps({"error": "Lender and borrower cannot be the same"})
105
106 # Edge Case: Amount is negative
107 if amount < 0:
108 return json.dumps({"error": "Amount cannot be negative"})
109
110 # Find lender and borrower in database
111 lender = None
112 borrower = None
113
114 for user in self.database["users"]:
115 if user["name"] == lender_name:
116 lender = user
117 elif user["name"] == borrower_name:
118 borrower = user
119
120 # Edge Case: Lender or borrower does not exist
121 if lender is None or borrower is None:
122 raise ValueError("Lender or borrower does not exist")
123
124 # Update lender's owed_by and borrower's owes
125 # If borrower already owes lender, add to existing amount
126 if borrower_name in lender["owed_by"]:
127 lender["owed_by"][borrower_name] += amount
128 else:
129 lender["owed_by"][borrower_name] = amount
130
131 if lender_name in borrower["owes"]:
132 borrower["owes"][lender_name] += amount
133 else:
134 borrower["owes"][lender_name] = amount
135
136 # Update balances
137 lender["balance"] += amount
138 borrower["balance"] -= amount
139
140 # Return updated user objects sorted by name
141 updated_users = sorted([lender, borrower], key=lambda x: x["name"])
142 return json.dumps({"users": updated_users})
143
144 # If URL is not recognized
145 return json.dumps({"error": "Invalid URL"})
146
147 # Handled Edge Cases: Missing user field, user already exists, missing required fields,
148 # lender and borrower are the same, negative amount, lender or borrower does not exist
149
150 # Handled Edge Cases: Missing users in payload, invalid 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.