diff --git a/python/rest-api/rest_api.py b/python/rest-api/rest_api.py index 08d4176..d8f2744 100644 --- a/python/rest-api/rest_api.py +++ b/python/rest-api/rest_api.py @@ -1,9 +1,12 @@ import json from collections import defaultdict from functools import wraps +from operator import attrgetter VALID_HTTP_METHODS = ['GET', 'POST'] +def dump(obj): + return obj.__dict__ class User: def __init__(self, name): @@ -12,18 +15,32 @@ class User: self.owed_by = defaultdict(float) self.balance = 0.0 - def lend(self, lender_name, amount): - self.owed_by[lender_name] += amount - if not self.owed_by[lender_name]: - del self.owed_by[lender_name] + def lend(self, borrower, amount): - def borrow(self, borrower_name, amount): - self.owes[borrower_name] += amount - if not self.owed_by[borrower_name]: - del self.owed_by[borrower_name] + total_owed = self.owed_by[borrower] - self.owes[borrower] + amount + if total_owed > 0: + self.owed_by[borrower] = total_owed + self.owes.pop(borrower, None) + elif total_owed < 0: + self.owes[borrower] = -total_owed + self.owed_by.pop(borrower, None) + else: + self.owed_by.pop(borrower, None) + self.owes.pop(borrower, None) + + self.balance += amount + + def borrow(self, lender, amount): + self.lend(lender, -amount) + + @classmethod + def from_dict(cls, d): + user = cls(d['name']) + user.owed_by.update(d['owed_by']) + user.owes.update(d['owes']) + user.balance = d['balance'] + return user - def to_json(self): - return json.dumps(self.__dict__) class Registry: def __init__(self): @@ -45,39 +62,45 @@ class RestAPI: registry = Registry() def __init__(self, database=None): - self._database = database if database else {} - self._users = {} + self._users = {user['name'] : User.from_dict(user) for user in database['users']} if database else {} @registry.register_url('/users', 'GET') def users(self, payload=None): - pass + if payload: + requested_users = json.loads(payload)['users'] + response = [user for user in self._users.values() if user.name in requested_users] + else: + response = [user for user in self._users.values()] + + return json.dumps({'users': response}, default=dump, sort_keys=True) @registry.register_url('/add', 'POST') def add(self, payload=None): - try: - payload = json.loads(payload) - user = User(payload['user']) - self._users[user.name] = user - return user.to_json() - except: - pass + payload = json.loads(payload) + user = User(payload['user']) + self._users[user.name] = user + return json.dumps(user, default=dump) @registry.register_url('/iou', 'POST') def iou(self, payload=None): - pass + payload = json.loads(payload) + lender = payload['lender'] + borrower = payload['borrower'] + amount = payload['amount'] + self._users[lender].lend(borrower, amount) + self._users[borrower].borrow(lender, amount) + return json.dumps({'users': sorted([self._users[lender], self._users[borrower]], key=attrgetter('name'))}, default=dump, sort_keys=True) def get(self, url, payload=None): methods = self.registry.methods['GET'] if url in methods.keys(): return methods[url](self, payload) - return '' -# else: -# raise Exception('Error 404') + else: + raise Exception('Error 404') def post(self, url, payload=None): methods = self.registry.methods['POST'] if url in methods.keys(): return methods[url](self, payload) - return '' -# else: -# raise Exception('Error 404') + else: + raise Exception('Error 404')