TorbatYar/backend/services/experience/app/policies/integrations.py
Mortezakoohjani 203671a7bf feat(experience): ship Experience Platform phases 11.0-11.10
Add the experience service with sites through analytics/AI hooks, migrations through 0011, and phase docs/manifests marking the track complete.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-27 11:43:10 +03:30

67 lines
2.2 KiB
Python

"""Lifecycle policies for Phase 11.9 aggregates."""
from app.models.types import (
ConnectorDispatchStatus as D,
ConsumerConnectorStatus as C,
NotifyDispatchStatus as N,
WidgetDefinitionStatus as WD,
WidgetInstanceStatus as WI,
)
from app.validators.integrations import ensure_transition
_TRANSITIONS = {
C: {
C.DRAFT: frozenset({C.ACTIVE, C.RETIRED}),
C.ACTIVE: frozenset({C.SUSPENDED, C.RETIRED}),
C.SUSPENDED: frozenset({C.ACTIVE, C.RETIRED}),
C.RETIRED: frozenset(),
},
D: {
D.PENDING: frozenset({D.ACKNOWLEDGED, D.FAILED, D.CANCELLED}),
D.ACKNOWLEDGED: frozenset(),
D.FAILED: frozenset({D.PENDING, D.CANCELLED}),
D.CANCELLED: frozenset(),
},
WD: {
WD.DRAFT: frozenset({WD.AVAILABLE, WD.RETIRED}),
WD.AVAILABLE: frozenset({WD.RETIRED}),
WD.RETIRED: frozenset(),
},
WI: {
WI.DRAFT: frozenset({WI.ACTIVE, WI.ARCHIVED}),
WI.ACTIVE: frozenset({WI.SUSPENDED, WI.ARCHIVED}),
WI.SUSPENDED: frozenset({WI.ACTIVE, WI.ARCHIVED}),
WI.ARCHIVED: frozenset(),
},
N: {
N.PENDING: frozenset({N.SENT, N.FAILED, N.CANCELLED}),
N.SENT: frozenset(),
N.FAILED: frozenset({N.PENDING, N.CANCELLED}),
N.CANCELLED: frozenset(),
},
}
class ConsumerConnectorRegistrationPolicy:
def assert_status_change(self, *, current, target):
ensure_transition(current, target, _TRANSITIONS[C], "consumer_connector_registration")
class ConsumerConnectorDispatchPolicy:
def assert_status_change(self, *, current, target):
ensure_transition(current, target, _TRANSITIONS[D], "consumer_connector_dispatch")
class WidgetDefinitionPolicy:
def assert_status_change(self, *, current, target):
ensure_transition(current, target, _TRANSITIONS[WD], "widget_definition")
class WidgetInstancePolicy:
def assert_status_change(self, *, current, target):
ensure_transition(current, target, _TRANSITIONS[WI], "widget_instance")
class NotifyDispatchPolicy:
def assert_status_change(self, *, current, target):
ensure_transition(current, target, _TRANSITIONS[N], "notify_dispatch")