|
|
|
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
|