You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
108 lines
2.2 KiB
108 lines
2.2 KiB
from http import HTTPStatus as _HTTPStatus |
|
from typing import Any |
|
|
|
|
|
def _make_error(http_status, code: str, message: str | None = None): |
|
try: |
|
http_status = http_status[0] |
|
except Exception: |
|
pass |
|
|
|
payload = { |
|
'status': 'error', |
|
'code': code, |
|
} |
|
|
|
if message is not None: |
|
payload['message'] = message |
|
|
|
return payload, http_status |
|
|
|
|
|
# General |
|
|
|
INVALID_REQUEST = _make_error( |
|
_HTTPStatus.BAD_REQUEST, |
|
'general/invalid_request', |
|
) |
|
|
|
NOT_FOUND = _make_error( |
|
_HTTPStatus.NOT_FOUND, |
|
'general/not_found', |
|
) |
|
|
|
def invalid_argument(argname: str) -> tuple[Any, int]: |
|
return _make_error( |
|
_HTTPStatus.UNPROCESSABLE_ENTITY, |
|
'general/invalid_argument', |
|
message=f'Invalid argument: {argname}', |
|
) |
|
|
|
# Login |
|
|
|
INVALID_DETAILS = _make_error( |
|
_HTTPStatus.UNAUTHORIZED, |
|
'login/invalid_details', |
|
) |
|
|
|
NO_AUTHORIZATION = _make_error( |
|
_HTTPStatus.UNAUTHORIZED, |
|
'login/no_authorization', |
|
) |
|
|
|
INVALID_AUTHORIZATION = _make_error( |
|
_HTTPStatus.UNAUTHORIZED, |
|
'login/invalid_authorization', |
|
) |
|
|
|
UNAUTHORIZED = _make_error( |
|
_HTTPStatus.UNAUTHORIZED, |
|
'login/unauthorized', |
|
"You are logged in but the resource you're trying to access isn't available to you", |
|
) |
|
|
|
# Transactions |
|
|
|
NO_BALANCE = _make_error( |
|
_HTTPStatus.BAD_REQUEST, |
|
'transaction/no_balance', |
|
'Not enough balance to make the transaction', |
|
) |
|
|
|
INVALID_IBAN = _make_error( |
|
_HTTPStatus.BAD_REQUEST, |
|
'transaction/invalid_iban', |
|
'Recipient IBAN is invalid', |
|
) |
|
|
|
|
|
# Success |
|
|
|
def success(http_status: Any = _HTTPStatus.OK, /, **kargs): |
|
try: |
|
http_status = http_status[0] |
|
except Exception: |
|
pass |
|
|
|
return dict(kargs, status='success'), http_status |
|
|
|
# Schemas |
|
|
|
from marshmallow import Schema, fields, validate |
|
|
|
class ErrorSchema(Schema): |
|
status = fields.Str(default='error', validate=validate.Equal('error')) |
|
code = fields.Str() |
|
message = fields.Str(required=False) |
|
|
|
class SuccessSchema(Schema): |
|
status = fields.Str(default='success', validate=validate.Equal('success')) |
|
|
|
# smorest |
|
|
|
def abort(result: tuple[Any, int]): |
|
try: |
|
from flask_smorest import abort as _abort |
|
_abort(result[1], response=result) |
|
except ImportError: |
|
return result
|
|
|