src/lambdas/modular_api_handler/processors/abstract_processor.py (46 lines of code) (raw):
from abc import abstractmethod
from http import HTTPStatus
from typing import Callable
from routes.route import Route
from commons.constants import Endpoint, HTTPMethod, Permission
from commons.log_helper import get_logger
from pydantic import BaseModel
_LOG = get_logger(__name__)
class AbstractCommandProcessor:
Resp = tuple[HTTPStatus, type[BaseModel] | None, str | None]
@classmethod
def controller_name(cls) -> str:
return cls.__name__
@classmethod
@abstractmethod
def routes(cls) -> tuple[Route, ...]:
"""
Must return a list of routes. See how it's built in some controller
:return: List[Route]
"""
def get_action_handler(self, action: str) -> Callable | None:
"""
By default, returns class method with the same name as action.
:return: Callable
"""
return getattr(self, action, None)
@classmethod
def build(cls) -> 'AbstractCommandProcessor':
_LOG.info(f'Building {cls.__name__} controller')
return cls()
@classmethod
def route(cls, path: Endpoint, method: tuple[HTTPMethod, ...] | HTTPMethod,
action: str, permission: Permission | None,
summary: str | None = None,
description: str | None = None,
response: list[Resp] | Resp = (HTTPStatus.OK, None, None),
require_auth: bool = True
) -> Route:
"""
Just auxiliary method
:param path:
:param method:
:param action: name of method to be executed for this route
:param permission: target permission for this route, should be
explicitly set to None in case we want this endpoint to be
require no permissions
:param summary:
:param description:
:param response: list of tuples with three elements: code, optional
model and optional response description
:param require_auth:
:return:
"""
if isinstance(method, HTTPMethod):
method = (method,)
if isinstance(response, tuple):
response = [response]
return Route(
name=None,
routepath=path.value,
controller=cls.controller_name(),
action=action,
conditions={'method': method},
# custom kwargs
_summary=summary,
_description=description,
_responses=response,
_require_auth=require_auth,
_permission=permission
)