83 lines
2.2 KiB
Python
83 lines
2.2 KiB
Python
import json
|
|
from collections import defaultdict
|
|
from functools import wraps
|
|
|
|
VALID_HTTP_METHODS = ['GET', 'POST']
|
|
|
|
|
|
class User:
|
|
def __init__(self, name):
|
|
self.name = name
|
|
self.owes = defaultdict(float)
|
|
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 borrow(self, borrower_name, amount):
|
|
self.owes[borrower_name] += amount
|
|
if not self.owed_by[borrower_name]:
|
|
del self.owed_by[borrower_name]
|
|
|
|
def to_json(self):
|
|
return json.dumps(self.__dict__)
|
|
|
|
class Registry:
|
|
def __init__(self):
|
|
self.methods = {k: {} for k in VALID_HTTP_METHODS }
|
|
|
|
def register_url(self, url, http_method):
|
|
|
|
def actual_decorator(f):
|
|
|
|
self.methods[http_method][url] = f
|
|
|
|
@wraps(f)
|
|
def _impl(f_self, *f_args, **f_kwargs):
|
|
return f(f_self, *f_args, **f_kwargs)
|
|
return actual_decorator
|
|
|
|
class RestAPI:
|
|
|
|
registry = Registry()
|
|
|
|
def __init__(self, database=None):
|
|
self._database = database if database else {}
|
|
self._users = {}
|
|
|
|
@registry.register_url('/users', 'GET')
|
|
def users(self, payload=None):
|
|
pass
|
|
|
|
@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
|
|
|
|
@registry.register_url('/iou', 'POST')
|
|
def iou(self, payload=None):
|
|
pass
|
|
|
|
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')
|
|
|
|
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')
|