From 05229910cd3c5345ff4d86b45a816a26980ef3c6 Mon Sep 17 00:00:00 2001 From: Paul de Raaij Date: Wed, 29 Jul 2026 10:47:33 -0400 Subject: [PATCH] refactor: move state mutation logic to when method, simplify set/update methods --- domain/marketplace/classified_ad.py | 38 +++++++++++++---------------- 1 file changed, 17 insertions(+), 21 deletions(-) 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))