from collections.abc import Sequence from anydi import singleton from preference_center.adapters.kafka import KafkaProducer from preference_center.config import Settings from preference_center.profile.events import ( ProfileDeletedV1, ProfileSubscriptionsUpdatedV1, ProfileUpdatedV1, ) from preference_center.profile.models import Profile, Subscription ProfileEvent = ProfileUpdatedV1 | ProfileDeletedV1 | ProfileSubscriptionsUpdatedV1 @singleton class ProfileDispatcher: def __init__( self, producer: KafkaProducer, settings: Settings, ) -> None: self.producer = producer self._event_to_producer_topic: dict[type[ProfileEvent], str] = { ProfileUpdatedV1: settings.kafka_topic_fan_update, ProfileDeletedV1: settings.kafka_topic_fan_delete, ProfileSubscriptionsUpdatedV1: settings.kafka_topic_fan_subscriptions_update, } def dispatch_event(self, event: ProfileEvent) -> None: """Dispatch an event.""" self.producer.publish( topic=self._event_to_producer_topic[type(event)], value=event.model_dump_json(by_alias=True), key=event.id, ) def dispatch_profile_updated(self, profile: Profile) -> None: """Dispatch a profile update.""" self.dispatch_event(ProfileUpdatedV1.from_profile(profile)) def dispatch_profile_deleted( self, profile: Profile, *, origin_id: str | None, origin_type: str | None, automated_email_trigger_id: str | None = None, ) -> None: """Dispatch a profile delete.""" self.dispatch_event( ProfileDeletedV1.from_profile( profile, origin_id=origin_id, origin_type=origin_type, automated_email_trigger_id=automated_email_trigger_id, ) ) def dispatch_subscriptions_updated( self, profile: Profile, subscriptions: Sequence[Subscription], *, origin_id: str | None, origin_type: str | None, automated_email_trigger_id: str | None = None, ) -> None: """Dispatch a subscription update.""" if isinstance(profile, Profile): self.dispatch_event( ProfileSubscriptionsUpdatedV1.from_profile_subscriptions( profile, subscriptions=[ subscription for subscription in subscriptions if isinstance(subscription, Subscription) ], origin_id=origin_id, origin_type=origin_type, automated_email_trigger_id=automated_email_trigger_id, ) )