A.2.1

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 self.database = database if database is not None else {"users": []}
12
513 def get(self, url: str, payload: str | None = None) -> str:
6 pass
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
27 return json.dumps({"users": sorted(self.database["users"], key=lambda x: x["name"])})
28 else:
29 # Return specific users
30 data = json.loads(payload)
31 user_names = data.get("users", [])
32
33 # Edge Case: Empty users list in payload
34 if not user_names:
35 return json.dumps({"users": []})
36
37 # Filter users by name
38 users = [user for user in self.database["users"] if user["name"] in user_names]
39
40 # Edge Case: Some requested users don't exist
41 # Non-existent users are simply not included in the response
42
43 return json.dumps({"users": sorted(users, key=lambda x: x["name"])})
44
45 # Edge Case: Invalid URL
46 return json.dumps({"error": "Invalid URL"})
47 # Handled Edge Cases: Empty users list in payload, Some requested users don't exist, Invalid URL
748
849 def post(self, url: str, payload: str | None = None) -> str:
9 pass
50 """
51 Handle POST requests to the API.
52
53 Args:
54 url: The endpoint URL.
55 payload: JSON payload.
56
57 Returns:
58 A JSON string response.
59 """
60 if payload is None:
61 # Edge Case: Missing payload
62 return json.dumps({"error": "Payload required"})
63
64 data = json.loads(payload)
65
66 if url == "/add":
67 user_name = data.get("user")
68
69 # Edge Case: Missing user name
70 if user_name is None:
71 return json.dumps({"error": "User name required"})
72
73 # Edge Case: User already exists
74 if any(user["name"] == user_name for user in self.database["users"]):
75 return json.dumps({"error": "User already exists"})
76
77 # Create new user
78 new_user = {
79 "name": user_name,
80 "owes": {},
81 "owed_by": {},
82 "balance": 0.0
83 }
84 self.database["users"].append(new_user)
85
86 return json.dumps(new_user)
87
88 elif url == "/iou":
89 lender_name = data.get("lender")
90 borrower_name = data.get("borrower")
91 amount = data.get("amount")
92
93 # Edge Case: Missing required fields
94 if lender_name is None or borrower_name is None or amount is None:
95 return json.dumps({"error": "Lender, borrower, and amount are required"})
96
97 # Edge Case: Lender and borrower are the same person
98 if lender_name == borrower_name:
99 return json.dumps({"error": "Lender and borrower cannot be the same person"})
100
101 # Edge Case: Negative amount
102 if amount < 0:
103 return json.dumps({"error": "Amount must be positive"})
104
105 # Find users
106 lender = next((user for user in self.database["users"] if user["name"] == lender_name), None)
107 borrower = next((user for user in self.database["users"] if user["name"] == borrower_name), None)
108
109 # Edge Case: Lender or borrower doesn't exist
110 if lender is None or borrower is None:
111 return json.dumps({"error": "Lender or borrower does not exist"})
112
113 # Update owes and owed_by
114 # Update lender's owed_by
115 if borrower_name in lender["owed_by"]:
116 lender["owed_by"][borrower_name] += amount
117 else:
118 lender["owed_by"][borrower_name] = amount
119
120 # Update borrower's owes
121 if lender_name in borrower["owes"]:
122 borrower["owes"][lender_name] += amount
123 else:
124 borrower["owes"][lender_name] = amount
125
126 # Recalculate balances
127 lender_balance = sum(lender["owed_by"].values()) - sum(lender["owes"].values())
128 borrower_balance = sum(borrower["owed_by"].values()) - sum(borrower["owes"].values())
129
130 lender["balance"] = lender_balance
131 borrower["balance"] = borrower_balance
132
133 # Return updated users
134 users = sorted([lender, borrower], key=lambda x: x["name"])
135 return json.dumps({"users": users})
136
137 # Edge Case: Invalid URL
138 return json.dumps({"error": "Invalid URL"})
139 # Handled Edge Cases: Missing payload, Missing user name, User already exists, Missing required fields,
140 # Lender and borrower are the same person, Negative amount, Lender or borrower doesn't exist, 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.