Finished
88 * @param {{users: Object[]}} database
99 */
1010 constructor(database = { users: [] }) {
11 throw new Error('Remove this line and implement the function');
11 this.database = database;
1212 }
1313
1414 /**
1515 * @param {string} url
16 * @param {Object} [payload]
1617 * @return {{users: Object[]}}
1718 */
18 get(url) {
19 throw new Error('Remove this line and implement the function');
19 get(url, payload = undefined) {
20 if (url === '/users') {
21 let users;
22 if (payload && payload.users && Array.isArray(payload.users)) {
23 // Return specific users sorted by name
24 users = this.getUsersByNames(payload.users);
25 } else {
26 // Return all users sorted by name
27 users = [...this.database.users].sort((a, b) => a.name.localeCompare(b.name));
28 }
29 return { users };
30 }
31 return { users: [] };
2032 }
2133
2234 /**
2537 * @return {{users: Object[]}}
2638 */
2739 post(url, payload = undefined) {
28 throw new Error('Remove this line and implement the function');
40 if (url === '/add') {
41 // Edge Case: Missing user field in payload
42 if (!payload || !payload.user) {
43 return undefined;
44 }
45
46 // Edge Case: User already exists
47 const existingUser = this.database.users.find(user => user.name === payload.user);
48 if (existingUser) {
49 return existingUser;
50 }
51
52 // Edge Case: Invalid user name (empty string)
53 if (payload.user === '') {
54 return undefined;
55 }
56
57 const newUser = {
58 name: payload.user,
59 owes: {},
60 owed_by: {},
61 balance: 0.0
62 };
63
64 this.database.users.push(newUser);
65 return newUser;
66 }
67
68 if (url === '/iou') {
69 // Edge Case: Missing required fields in payload
70 if (!payload || !payload.lender || !payload.borrower || payload.amount === undefined) {
71 return undefined;
72 }
73
74 // Edge Case: Invalid amount (negative or zero)
75 if (payload.amount <= 0) {
76 return undefined;
77 }
78
79 // Edge Case: Lender and borrower are the same person
80 if (payload.lender === payload.borrower) {
81 return undefined;
82 }
83
84 const lender = this.database.users.find(user => user.name === payload.lender);
85 const borrower = this.database.users.find(user => user.name === payload.borrower);
86
87 // Edge Case: Lender or borrower does not exist
88 if (!lender || !borrower) {
89 return undefined;
90 }
91
92 // Update lender's records
93 if (!lender.owed_by[payload.borrower]) {
94 lender.owed_by[payload.borrower] = 0;
95 }
96 lender.owed_by[payload.borrower] += payload.amount;
97
98 // Update borrower's records
99 if (!borrower.owes[payload.lender]) {
100 borrower.owes[payload.lender] = 0;
101 }
102 borrower.owes[payload.lender] += payload.amount;
103
104 // Recalculate balances
105 let totalOwedBy = 0;
106 for (const amount of Object.values(lender.owed_by)) {
107 totalOwedBy += amount;
108 }
109
110 let totalOwes = 0;
111 for (const amount of Object.values(lender.owes)) {
112 totalOwes += amount;
113 }
114
115 lender.balance = totalOwedBy - totalOwes;
116
117 totalOwedBy = 0;
118 for (const amount of Object.values(borrower.owed_by)) {
119 totalOwedBy += amount;
120 }
121
122 totalOwes = 0;
123 for (const amount of Object.values(borrower.owes)) {
124 totalOwes += amount;
125 }
126
127 borrower.balance = totalOwedBy - totalOwes;
128
129 // Return updated users sorted by name
130 const users = [lender, borrower].sort((a, b) => a.name.localeCompare(b.name));
131 return { users };
132 }
133
134 return undefined;
135 }
136
137 // Helper method to get users by names
138 getUsersByNames(names) {
139 return this.database.users.filter(user => names.includes(user.name))
140 .sort((a, b) => a.name.localeCompare(b.name));
29141 }
30142}
143
144// Handled Edge Cases:
145// 1. Missing user field in /add request
146// 2. User already exists in /add request
147// 3. Invalid user name (empty string) in /add request
148// 4. Missing required fields in /iou request
149// 5. Invalid amount (negative or zero) in /iou request
150// 6. Lender and borrower are the same person in /iou request
151// 7. Lender or borrower does not exist in /iou request
Test NameStatus
get single user
Fail
lender owes borrower
Fail
lender owes borrower less than new loan
Fail
lender owes borrower same as new loan
Fail
no users
Pass
add user
Pass
both users have 0 balance
Pass
borrower has negative balance
Pass
lender has negative balance
Pass

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