[WIP] Python: rest_api

This commit is contained in:
Dmitry Kokorin 2021-06-29 19:23:21 +03:00
parent f5e841e110
commit 69f1ffe661

View file

@ -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):
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(self, *f_args, **f_kwargs):
RestAPI._register_url(self, f, url, http_method)
return f(self, *f_args, **f_kwargs)
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):
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')