From cf644cc040862907411f640e61f57d1c0050123d Mon Sep 17 00:00:00 2001 From: michael Date: Mon, 25 Nov 2024 16:48:11 +0100 Subject: [PATCH 1/2] fix wrong dependency in use cases --- src/use_cases/view_cart.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/use_cases/view_cart.py b/src/use_cases/view_cart.py index 5618362..62b8e2f 100644 --- a/src/use_cases/view_cart.py +++ b/src/use_cases/view_cart.py @@ -3,10 +3,10 @@ from typing import Optional #dependency imports from entities.cart import Cart, CartItem -from interface_adapters.cart_repository import CartRepository +from use_cases.cart_repository_interface import CartRepositoryInterface class ViewCart: - def __init__(self, cart_repository: CartRepository): + def __init__(self, cart_repository: CartRepositoryInterface): self.cart_repository = cart_repository def execute(self, user_id: int) -> Optional[Cart]: From 8c8b4ccbc53dfe3c0a0fde94ed79f44aec8b782e Mon Sep 17 00:00:00 2001 From: michael Date: Sun, 1 Dec 2024 21:20:29 +0100 Subject: [PATCH 2/2] organize interface_adapters. add cart_controller --- .../controllers/cart_controller.py | 32 +++++++++++++++++++ .../dtos/view_cart_request.py | 6 ++++ .../dtos/view_cart_response.py | 12 +++++++ src/interface_adapters/mocks/cart_db.py | 21 ++++++++++++ .../cart_database_interface.py | 1 + .../{ => repositories}/cart_repository.py | 2 +- src/main.py | 11 +++++++ 7 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 src/interface_adapters/controllers/cart_controller.py create mode 100644 src/interface_adapters/dtos/view_cart_request.py create mode 100644 src/interface_adapters/dtos/view_cart_response.py create mode 100644 src/interface_adapters/mocks/cart_db.py rename src/interface_adapters/{ => repositories}/cart_database_interface.py (88%) rename src/interface_adapters/{ => repositories}/cart_repository.py (71%) create mode 100644 src/main.py diff --git a/src/interface_adapters/controllers/cart_controller.py b/src/interface_adapters/controllers/cart_controller.py new file mode 100644 index 0000000..49c5440 --- /dev/null +++ b/src/interface_adapters/controllers/cart_controller.py @@ -0,0 +1,32 @@ +#python imports +from fastapi import APIRouter, HTTPException +from fastapi.responses import JSONResponse + +#dependency imports +from use_cases.view_cart import ViewCart +from interface_adapters.dtos.view_cart_response import ViewCartResponseDTO, CartItemDTO +from interface_adapters.dtos.view_cart_request import ViewCartRequestDTO +from interface_adapters.repositories.cart_repository import CartRepository +from interface_adapters.mocks.cart_db import CartDatabase + +# Initialize components +cart_database = CartDatabase() # Concrete database implementation +cart_repository = CartRepository(cart_database) # Repository depends on gateway +view_cart_use_case = ViewCart(cart_repository) # Use case depends on repository + +router = APIRouter() + +@router.post("/view_cart", response_model=ViewCartResponseDTO) +async def view_cart(request_dto: ViewCartRequestDTO): + + cart = view_cart_use_case.execute(request_dto.user_id) + + if not cart: + raise HTTPException(status_code=404, detail="Cart not found") + + response_dto = ViewCartResponseDTO( + items=[CartItemDTO(product_id=item.product_id, quantity=item.quantity, price=item.price) for item in cart.items], + total_price=sum(item.price * item.quantity for item in cart.items) + ) + + return response_dto \ No newline at end of file diff --git a/src/interface_adapters/dtos/view_cart_request.py b/src/interface_adapters/dtos/view_cart_request.py new file mode 100644 index 0000000..ac951e5 --- /dev/null +++ b/src/interface_adapters/dtos/view_cart_request.py @@ -0,0 +1,6 @@ +#python imports +from pydantic import BaseModel +from typing import List, Optional + +class ViewCartRequestDTO(BaseModel): + user_id: int \ No newline at end of file diff --git a/src/interface_adapters/dtos/view_cart_response.py b/src/interface_adapters/dtos/view_cart_response.py new file mode 100644 index 0000000..87b6af0 --- /dev/null +++ b/src/interface_adapters/dtos/view_cart_response.py @@ -0,0 +1,12 @@ +#python imports +from pydantic import BaseModel +from typing import List, Optional + +class CartItemDTO(BaseModel): + product_id: int + quantity: int + price: float + +class ViewCartResponseDTO(BaseModel): + items: List[CartItemDTO] = [] + total_price: float = 0.0 \ No newline at end of file diff --git a/src/interface_adapters/mocks/cart_db.py b/src/interface_adapters/mocks/cart_db.py new file mode 100644 index 0000000..f57c667 --- /dev/null +++ b/src/interface_adapters/mocks/cart_db.py @@ -0,0 +1,21 @@ +#python imports +from typing import Optional, List + +#dependency imports +from interface_adapters.repositories.cart_database_interface import CartDatabaseInterface + +class CartDatabase(CartDatabaseInterface): + def __init__(self): + # Mock database setup + self.mock_db = { + 1: [ + {"product_id": 101, "name": "Apple", "quantity": 2, "price": 0.5}, + {"product_id": 102, "name": "Milk", "quantity": 1, "price": 1.5}, + ], + 2: [ + {"product_id": 201, "name": "Bread", "quantity": 1, "price": 2.0}, + ], + } + + def fetch_cart_items(self, user_id: int) -> Optional[List[dict]]: + return self.mock_db.get(user_id) \ No newline at end of file diff --git a/src/interface_adapters/cart_database_interface.py b/src/interface_adapters/repositories/cart_database_interface.py similarity index 88% rename from src/interface_adapters/cart_database_interface.py rename to src/interface_adapters/repositories/cart_database_interface.py index 1c9964f..e5a95cd 100644 --- a/src/interface_adapters/cart_database_interface.py +++ b/src/interface_adapters/repositories/cart_database_interface.py @@ -1,3 +1,4 @@ +#python imports from typing import Optional, List class CartDatabaseInterface: diff --git a/src/interface_adapters/cart_repository.py b/src/interface_adapters/repositories/cart_repository.py similarity index 71% rename from src/interface_adapters/cart_repository.py rename to src/interface_adapters/repositories/cart_repository.py index 25663b6..e5b9f34 100644 --- a/src/interface_adapters/cart_repository.py +++ b/src/interface_adapters/repositories/cart_repository.py @@ -3,7 +3,7 @@ from typing import Optional, List #dependency imports from use_cases.cart_repository_interface import CartRepositoryInterface -from interface_adapters.cart_database_interface import CartDatabaseInterface +from interface_adapters.repositories.cart_database_interface import CartDatabaseInterface class CartRepository(CartRepositoryInterface): def __init__(self, database_gateway: CartDatabaseInterface): diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..df10211 --- /dev/null +++ b/src/main.py @@ -0,0 +1,11 @@ +from interface_adapters.controllers.cart_controller import router as cart_router + +from fastapi import FastAPI + +app = FastAPI() +app.include_router(cart_router) + +@app.get("/") +async def root(): + return {"message": "Hello World"} +