Source code for examples.shopvertical.slices.remove_item_from_cart.cmd

from __future__ import annotations

from uuid import UUID  # noqa: TC003

from examples.shopvertical.common import Command, get_events, put_events
from examples.shopvertical.events import (
    AddedItemToCart,
    ClearedCart,
    DomainEvents,
    RemovedItemFromCart,
    SubmittedCart,
)
from examples.shopvertical.exceptions import (
    CartAlreadySubmittedError,
    ProductNotInCartError,
)


[docs] class RemoveItemFromCart(Command): cart_id: UUID product_id: UUID
[docs] def handle(self, events: DomainEvents) -> DomainEvents: product_ids = [] is_submitted = False for event in events: if isinstance(event, AddedItemToCart): product_ids.append(event.product_id) elif isinstance(event, RemovedItemFromCart): product_ids.remove(event.product_id) elif isinstance(event, ClearedCart): product_ids.clear() elif isinstance(event, SubmittedCart): is_submitted = True if is_submitted: raise CartAlreadySubmittedError if self.product_id not in product_ids: raise ProductNotInCartError return ( RemovedItemFromCart( originator_id=self.cart_id, originator_version=len(events) + 1, product_id=self.product_id, ), )
[docs] def execute(self) -> int | None: return put_events(self.handle(get_events(self.cart_id)))