diff --git a/domain/marketplace/classified_ad.py b/domain/marketplace/classified_ad.py index 1e817d5..8aaaae1 100644 --- a/domain/marketplace/classified_ad.py +++ b/domain/marketplace/classified_ad.py @@ -2,6 +2,7 @@ from __future__ import annotations from dataclasses import dataclass, field, replace from decimal import Decimal +from typing import Self from domain.framework.entity import Entity from domain.marketplace.classified_ad_id import ClassifiedAdId @@ -53,31 +54,26 @@ class ClassifiedAd(Entity): f"Cannot publish classified ad with missing or invalid: {', '.join(errors)}" ) - def request_to_publish(self): - self._ensure_valid_state() + def when(self, event: DomainEvent) -> Self: + match event: + case ClassifiedAdTitleChanged(): + return replace(self, title=ClassifiedAdTitle(title=event.title)) + case ClassifiedAdTextUpdated(): + return replace(self, text=ClassifiedAdText(text=event.ad_text)) + case ClassifiedAdPriceUpdated(): + return replace(self, price=Price(amount=event.price)) + case ClassifiedAdSentForReview(): + return replace(self, state=ClassifiedAdState.PendingReview) + return self - updated = replace(self, state=ClassifiedAdState.PendingReview) - return updated.apply( - ClassifiedAdSentForReview(id=self.id.value) - ) + def request_to_publish(self): + return self.apply(ClassifiedAdSentForReview(id=self.id.value)) def set_title(self, title: ClassifiedAdTitle) -> ClassifiedAd: - updated = replace(self, title=title) - updated._ensure_valid_state() - return updated.apply( - ClassifiedAdTitleChanged(id=self.id.value, title=title.title) - ) + return self.apply(ClassifiedAdTitleChanged(id=self.id.value, title=title.title)) def update_text(self, text: ClassifiedAdText) -> ClassifiedAd: - updated = replace(self, text=text) - updated._ensure_valid_state() - return updated.apply( - ClassifiedAdTextUpdated(id=self.id.value, ad_text=text.text) - ) + return self.apply(ClassifiedAdTextUpdated(id=self.id.value, ad_text=text.text)) def update_price(self, price: Price) -> ClassifiedAd: - updated = replace(self, price=price) - updated._ensure_valid_state() - return updated.apply( - ClassifiedAdPriceUpdated(id=self.id.value, price=price.amount) - ) + return self.apply(ClassifiedAdPriceUpdated(id=self.id.value, price=price.amount))