from collections.abc import Sequence
from decimal import Decimal
from uuid import UUID
from examples.aggregate7.immutablemodel import Immutable
from examples.shopvertical.common import Query, get_events
from examples.shopvertical.events import (
AddedItemToCart,
ClearedCart,
DomainEvents,
RemovedItemFromCart,
)
[docs]
class CartItem(Immutable):
product_id: UUID
name: str
description: str
price: Decimal
[docs]
class GetCartItems(Query):
cart_id: UUID
[docs]
@staticmethod
def projection(events: DomainEvents) -> Sequence[CartItem]:
cart_items: list[CartItem] = []
for event in events:
if isinstance(event, AddedItemToCart):
cart_items.append(
CartItem(
product_id=event.product_id,
name=event.name,
description=event.description,
price=event.price,
)
)
elif isinstance(event, RemovedItemFromCart):
for i, cart_item in enumerate(cart_items):
if cart_item.product_id == event.product_id:
cart_items.pop(i)
break
elif isinstance(event, ClearedCart):
cart_items.clear()
return tuple(cart_items)
[docs]
def execute(self) -> Sequence[CartItem]:
return self.projection(get_events(self.cart_id))