from .api_errors import * from .models import UserToken api_methods_dict = {} def __make_invalid_argument_type_error(name, value, except_type): related = {"param_name": name, "excepted_type": "int", "value": value} raise Exception(API_ERROR_INVALID_ARGUMENT_TYPE, related) def api_make_response(response): return API_OK_OBJ | {"response": response} def api_get_param_int(params: dict, name: str, required=True, default=None): if name in params: try: return int(params[name]) except: __make_invalid_argument_type_error(name, params[name], "int") if required: raise Exception(API_ERROR_MISSING_ARGUMENT, name) return default def api_get_param_str(params: dict, name: str, required=True, default=""): if name in params: return params[name] if required: raise Exception(API_ERROR_MISSING_ARGUMENT, name) return None def api_get_access_token(params: dict, unused_name, required=True): token = api_get_param_str(params, "access_token", required)[0] print(f"checking token '{token}'") return UserToken.get_by_token(token) def api_make_param(name, arg_class, description, required=True): return { "name": name, "type": arg_class, "description": description, "required": required } API_PARAM_ACCESS_TOKEN = api_make_param( "access_token", UserToken, "Токен, выданный методом account.auth" ) def api_method(func_name, doc="", params: list or None = None, returns=""): """ Декоратор для методов API, автоматически передает параметры методам """ def actual_decorator(func): def wrapper(**kwargs): print(f"> call method {func_name} with params {kwargs}. method params: {params}") errors = [] func_args = {} for p in params: parser_funcs = { str: api_get_param_str, int: api_get_param_int, UserToken: api_get_access_token } try: if p["type"] not in parser_funcs: raise Exception(API_ERROR_INTERNAL_ERROR, f"param type {p['type']} is unsupported") func_args[p["name"]] = parser_funcs[p["type"]](kwargs, p["name"], p["required"]) except Exception as ex: errors.append(ex) print(f"errors: {errors}, args: {func_args}") if len(errors) > 0: return make_error_object(errors) else: out = func(**func_args) if out is None: raise Exception(API_ERROR_INTERNAL_ERROR, "method returned null object") return out api_methods_dict[func_name] = { "doc": doc, "params": params, "func": wrapper, "return": returns } return wrapper return actual_decorator