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"} +