Merge branch 'layer_interface_adapters' into layer_framework_driver_db
merged branch layer_interface_adapters into layer_framework_driver_dbuebung_entities
commit
84b3e9ff95
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Byte-compiled / optimized / DLL files
|
||||||
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
*$py.class
|
||||||
|
|
@ -0,0 +1,27 @@
|
||||||
|
#python imports
|
||||||
|
from typing import List
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
#dependency imports
|
||||||
|
from entities.cart_item import CartItem
|
||||||
|
from entities.product import Product
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Cart:
|
||||||
|
items: List[CartItem]
|
||||||
|
|
||||||
|
def add_item(self, product: Product, quantity: int):
|
||||||
|
for item in self.items:
|
||||||
|
if item.product.id == product.id:
|
||||||
|
item.quantity += quantity
|
||||||
|
return
|
||||||
|
self.items.append(CartItem(product=product, quantity=quantity))
|
||||||
|
|
||||||
|
def remove_item(self, product_id: str):
|
||||||
|
self.items = [item for item in self.items if item.product.id != product_id]
|
||||||
|
|
||||||
|
def calculate_total_price(self) -> float:
|
||||||
|
return sum(item.calculate_total_price() for item in self.items)
|
||||||
|
|
||||||
|
def list_items(self) -> List[str]:
|
||||||
|
return [f"{item.quantity} x {item.product.name} - {item.calculate_total_price()} EUR" for item in self.items]
|
||||||
|
|
@ -0,0 +1,17 @@
|
||||||
|
#python imports
|
||||||
|
from typing import List
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class CartItem:
|
||||||
|
product_id: int
|
||||||
|
name: str
|
||||||
|
quantity: int
|
||||||
|
price: float
|
||||||
|
|
||||||
|
def post_init(self):
|
||||||
|
if self.quantity <= 0:
|
||||||
|
raise ValueError("Quantity has to be atleast 1")
|
||||||
|
|
||||||
|
def calculate_total_price(self) -> float:
|
||||||
|
return self.quantity * self.price
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
#python imports
|
||||||
|
from dataclasses import dataclass
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Product:
|
||||||
|
id: str
|
||||||
|
name: str
|
||||||
|
description: str
|
||||||
|
price: float
|
||||||
|
|
||||||
|
def post_init(self):
|
||||||
|
if self.price < 0:
|
||||||
|
raise ValueError("Der Preis darf nicht negativ sein.")
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
from typing import Optional, List
|
||||||
|
|
||||||
|
class CartDatabaseInterface:
|
||||||
|
def fetch_cart_items(self, user_id: int) -> Optional[List[dict]]:
|
||||||
|
"""
|
||||||
|
Abstract method to fetch cart items from the database for a given user ID.
|
||||||
|
"""
|
||||||
|
raise NotImplementedError("fetch_cart_items must be implemented by a subclass")
|
||||||
|
|
@ -0,0 +1,13 @@
|
||||||
|
#python imports
|
||||||
|
from typing import Optional, List
|
||||||
|
|
||||||
|
#dependency imports
|
||||||
|
from use_cases.cart_repository_interface import CartRepositoryInterface
|
||||||
|
from interface_adapters.cart_database_interface import CartDatabaseInterface
|
||||||
|
|
||||||
|
class CartRepository(CartRepositoryInterface):
|
||||||
|
def __init__(self, database_gateway: CartDatabaseInterface):
|
||||||
|
self.database_gateway = database_gateway
|
||||||
|
|
||||||
|
def fetch_cart_by_user_id(self, user_id: int) -> Optional[List[dict]]:
|
||||||
|
return self.database_gateway.fetch_cart_items(user_id)
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
from typing import Optional, List
|
||||||
|
|
||||||
|
class CartRepositoryInterface:
|
||||||
|
def fetch_cart_by_user_id(self, user_id: int) -> Optional[List[dict]]:
|
||||||
|
"""
|
||||||
|
Abstract method to fetch cart data by user ID.
|
||||||
|
"""
|
||||||
|
raise NotImplementedError("fetch_cart_by_user_id must be implemented by a subclass")
|
||||||
|
|
@ -0,0 +1,22 @@
|
||||||
|
#python imports
|
||||||
|
from typing import Optional
|
||||||
|
|
||||||
|
#dependency imports
|
||||||
|
from entities.cart import Cart, CartItem
|
||||||
|
from interface_adapters.cart_repository import CartRepository
|
||||||
|
|
||||||
|
class ViewCart:
|
||||||
|
def __init__(self, cart_repository: CartRepository):
|
||||||
|
self.cart_repository = cart_repository
|
||||||
|
|
||||||
|
def execute(self, user_id: int) -> Optional[Cart]:
|
||||||
|
"""
|
||||||
|
Fetches the cart data from the repository, converts it to Cart entity.
|
||||||
|
"""
|
||||||
|
cart_data = self.cart_repository.fetch_cart_by_user_id(user_id)
|
||||||
|
if not cart_data:
|
||||||
|
return None
|
||||||
|
|
||||||
|
# Convert raw data to domain entities
|
||||||
|
items = [CartItem(**item) for item in cart_data]
|
||||||
|
return Cart(items)
|
||||||
Loading…
Reference in New Issue