Skip to content

Commit

Permalink
add usecase
Browse files Browse the repository at this point in the history
  • Loading branch information
maany committed Sep 19, 2023
1 parent 93035b7 commit 3a53f30
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 3 deletions.
12 changes: 12 additions & 0 deletions lib/dto.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from typing import TypeVar
from pydantic import BaseModel


class BaseDTO(BaseModel):
status: bool
errorCode: int
errorName: str
errorMessage: str


TBaseDTO = TypeVar("TBaseDTO", bound=BaseDTO)
2 changes: 1 addition & 1 deletion lib/presenter.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ class BasePresenter(
"""
Abstract base class for presenters.
:param response: The presenter response object to use.
@param response: The presenter response object to use.
:type response: TPresenterResponse
"""

Expand Down
17 changes: 15 additions & 2 deletions lib/primary_ports.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ class BaseInputPort(BaseAbstractClass, Generic[TBaseRequestModel]):
"""
Abstract base class for input ports.
:param requestModel: The request model to use.
:type requestModel: TBaseRequestModel
@param requestModel: The request model to use.
@type requestModel: TBaseRequestModel
"""

def __init__(self) -> None:
Expand All @@ -25,6 +25,19 @@ def execute(self, requestModel: TBaseRequestModel) -> None:


class BaseOutputPort(BaseAbstractClass, Generic[TBaseResponseModel, TBaseErrorResponseModel]):
"""
Abstract base class for output ports.
@type-arg TBaseResponseModel: The response model to use.
@type-arg TBaseErrorResponseModel: The error response model to use.
@method presentSuccess: Present the success response.
@param responseModel: The response model to use.
@type responseModel: TBaseResponseModel
@method presentError: Present the error response.
@param errorModel: The error model to use.
@type errorModel: TBaseErrorResponseModel
"""

def __init__(self) -> None:
super().__init__()

Expand Down
61 changes: 61 additions & 0 deletions lib/usecase.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
from abc import abstractmethod
from typing import Generic
from lib.dto import TBaseDTO
from lib.primary_ports import BaseInputPort, BaseOutputPort
from lib.usecase_models import (
BaseErrorResponseModel,
TBaseAuthenticatedRequestModel,
TBaseErrorResponseModel,
TBaseRequestModel,
TBaseResponseModel,
)


class BaseUseCase(
BaseInputPort[TBaseRequestModel | TBaseAuthenticatedRequestModel],
Generic[TBaseRequestModel, TBaseAuthenticatedRequestModel, TBaseResponseModel, TBaseErrorResponseModel],
):
def __init__(self, presenter: BaseOutputPort[TBaseResponseModel, TBaseErrorResponseModel]) -> None:
super().__init__()
self.presenter: BaseOutputPort[TBaseResponseModel, TBaseErrorResponseModel] = presenter

@abstractmethod
def validate_request_model(self, requestModel: TBaseRequestModel | TBaseAuthenticatedRequestModel) -> None:
raise NotImplementedError

@abstractmethod
def execute(self, requestModel: TBaseRequestModel | TBaseAuthenticatedRequestModel) -> None:
raise NotImplementedError


class BaseSingleDTOUseCase(
BaseUseCase[TBaseRequestModel, TBaseAuthenticatedRequestModel, TBaseResponseModel, TBaseErrorResponseModel],
Generic[TBaseRequestModel, TBaseAuthenticatedRequestModel, TBaseResponseModel, TBaseErrorResponseModel, TBaseDTO],
):
def __init__(self, presenter: BaseOutputPort[TBaseResponseModel, TBaseErrorResponseModel]) -> None:
super().__init__(presenter)

@abstractmethod
def make_dto_request(self, requestModel: TBaseRequestModel | TBaseAuthenticatedRequestModel) -> TBaseDTO:
raise NotImplementedError

@abstractmethod
def handle_dto_error(self, dto: TBaseDTO) -> TBaseErrorResponseModel:
raise NotImplementedError

@abstractmethod
def processDTO(self, dto: TBaseDTO) -> TBaseResponseModel | TBaseErrorResponseModel:
raise NotImplementedError

def execute(self, requestModel: TBaseRequestModel | TBaseAuthenticatedRequestModel) -> None:
self.validate_request_model(requestModel)
dto: TBaseDTO = self.make_dto_request(requestModel)
if dto.status == False:
errorModel: TBaseErrorResponseModel = self.handle_dto_error(dto)
self.presenter.presentError(errorModel)
else:
responseModel: TBaseResponseModel | TBaseErrorResponseModel = self.processDTO(dto)
if responseModel.status == False:
self.presenter.presentError(responseModel) # type: ignore # TODO: try to fix this, line 46 cannot change
else:
self.presenter.presentSuccess(responseModel) # type: ignore # TODO: try to fix this, line 46 cannot change
1 change: 1 addition & 0 deletions lib/usecase_models.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,6 @@ class BaseErrorResponseModel(BaseModel):


TBaseRequestModel = TypeVar("TBaseRequestModel", bound=BaseRequestModel)
TBaseAuthenticatedRequestModel = TypeVar("TBaseAuthenticatedRequestModel", bound=BaseAuthenticatedRequestModel)
TBaseResponseModel = TypeVar("TBaseResponseModel", bound=BaseResponseModel)
TBaseErrorResponseModel = TypeVar("TBaseErrorResponseModel", bound=BaseErrorResponseModel)

0 comments on commit 3a53f30

Please sign in to comment.