Merge branch 'layer_interface_adapters' into layer_framework_driver_db

merged branch layer_interface_adapters into layer_framework_driver_db
uebung_entities
Felix Jan Michael Mucha 2024-11-30 17:31:26 +01:00
commit 84b3e9ff95
8 changed files with 112 additions and 0 deletions

4
.gitignore vendored 100644
View File

@ -0,0 +1,4 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

View File

@ -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]

View File

@ -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

View File

@ -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.")

View File

@ -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")

View File

@ -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)

View File

@ -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")

View File

@ -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)