From 69f1ffe661c3c137239bdac7cb172c5383afbc56 Mon Sep 17 00:00:00 2001 From: Dmitry Kokorin Date: Tue, 29 Jun 2021 19:23:21 +0300 Subject: [PATCH] [WIP] Python: rest_api --- python/rest-api/rest_api.py | 100 ++++++++++++++++++++++++------------ 1 file changed, 66 insertions(+), 34 deletions(-) diff --git a/python/rest-api/rest_api.py b/python/rest-api/rest_api.py index 5cdc776..08d4176 100644 --- a/python/rest-api/rest_api.py +++ b/python/rest-api/rest_api.py @@ -1,51 +1,83 @@ import json -from enum import Enum +from collections import defaultdict from functools import wraps VALID_HTTP_METHODS = ['GET', 'POST'] -def register_url(url, http_method): - def actual_decorator(f): - @wraps(f) - def _impl(self, *f_args, **f_kwargs): - RestAPI._register_url(self, f, url, http_method) - return f(self, *f_args, **f_kwargs) - return actual_decorator + +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._rest_methods = {} self._database = database if database else {} + self._users = {} - def get(self, url, payload=None): - methods = self._rest_methods['GET'] - if url in methods.keys(): - return methods[url](payload) - else: - raise Exception('Error 404') - - def post(self, url, payload=None): - methods = self._rest_methods['POST'] - if url in methods.keys(): - return methods[url](payload) - else: - raise Exception('Error 404') - - def _register_url(self, f, url, http_method): - - if http_method not in VALID_HTTP_METHODS: - raise Exception('Invalid Http method') - - self._rest_methods[http_method][url] = f - - @register_url('/users', 'GET') + @registry.register_url('/users', 'GET') def users(self, payload=None): pass - @register_url('/add', 'POST') + @registry.register_url('/add', 'POST') def add(self, payload=None): - pass + try: + payload = json.loads(payload) + user = User(payload['user']) + self._users[user.name] = user + return user.to_json() + except: + pass - @register_url('/iou', 'POST') + @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')