refactor: move state mutation logic to when method, simplify set/update methods

This commit is contained in:
2026-07-29 10:47:33 -04:00
parent fa65782059
commit 05229910cd

View File

@@ -2,6 +2,7 @@ from __future__ import annotations
from dataclasses import dataclass, field, replace from dataclasses import dataclass, field, replace
from decimal import Decimal from decimal import Decimal
from typing import Self
from domain.framework.entity import Entity from domain.framework.entity import Entity
from domain.marketplace.classified_ad_id import ClassifiedAdId 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)}" f"Cannot publish classified ad with missing or invalid: {', '.join(errors)}"
) )
def request_to_publish(self): def when(self, event: DomainEvent) -> Self:
self._ensure_valid_state() 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) def request_to_publish(self):
return updated.apply( return self.apply(ClassifiedAdSentForReview(id=self.id.value))
ClassifiedAdSentForReview(id=self.id.value)
)
def set_title(self, title: ClassifiedAdTitle) -> ClassifiedAd: def set_title(self, title: ClassifiedAdTitle) -> ClassifiedAd:
updated = replace(self, title=title) return self.apply(ClassifiedAdTitleChanged(id=self.id.value, title=title.title))
updated._ensure_valid_state()
return updated.apply(
ClassifiedAdTitleChanged(id=self.id.value, title=title.title)
)
def update_text(self, text: ClassifiedAdText) -> ClassifiedAd: def update_text(self, text: ClassifiedAdText) -> ClassifiedAd:
updated = replace(self, text=text) return self.apply(ClassifiedAdTextUpdated(id=self.id.value, ad_text=text.text))
updated._ensure_valid_state()
return updated.apply(
ClassifiedAdTextUpdated(id=self.id.value, ad_text=text.text)
)
def update_price(self, price: Price) -> ClassifiedAd: def update_price(self, price: Price) -> ClassifiedAd:
updated = replace(self, price=price) return self.apply(ClassifiedAdPriceUpdated(id=self.id.value, price=price.amount))
updated._ensure_valid_state()
return updated.apply(
ClassifiedAdPriceUpdated(id=self.id.value, price=price.amount)
)