TorbatYar/backend/shared-lib/shared/events.py
Mortezakoohjani 800b0ba2c5 Deploy TorbatYar for torbatyar.ir with nginx multi-tenant routing.
Wire production domain, CORS for tenant subdomains, celery volume mounts, and nginx reverse proxy configs for apex, API, identity, auth, and wildcard tenants.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-21 21:43:33 +03:30

58 lines
1.9 KiB
Python

"""قرارداد مشترک رویدادها (Async Events) برای الگوی Outbox/Inbox.
همه سرویس‌ها رویدادها را با این ساختار منتشر و مصرف می‌کنند تا
ارتباط بدون اتصال مستقیم دیتابیس ممکن شود.
"""
from __future__ import annotations
import enum
from datetime import datetime, timezone
from typing import Any
from uuid import UUID, uuid4
from pydantic import BaseModel, Field
class EventStatus(str, enum.Enum):
"""وضعیت پردازش یک رویداد در Outbox."""
PENDING = "pending"
PROCESSED = "processed"
FAILED = "failed"
# نمونه انواع رویدادهای شناخته‌شده پلتفرم (قابل توسعه).
class CoreEventType(str, enum.Enum):
TENANT_CREATED = "tenant.created"
TENANT_SUSPENDED = "tenant.suspended"
TENANT_ACTIVATED = "tenant.activated"
SUBSCRIPTION_CREATED = "subscription.created"
SUBSCRIPTION_UPDATED = "subscription.updated"
DOMAIN_CREATED = "domain.created"
FEATURE_ACCESS_CHANGED = "feature_access.changed"
class IdentityEventType(str, enum.Enum):
USER_REGISTERED = "user.registered"
USER_UPDATED = "user.updated"
USER_DISABLED = "user.disabled"
TENANT_MEMBER_ADDED = "tenant_member.added"
TENANT_MEMBER_REMOVED = "tenant_member.removed"
TENANT_MEMBER_ROLE_CHANGED = "tenant_member.role_changed"
class EventEnvelope(BaseModel):
"""پاکت استاندارد یک رویداد که بین سرویس‌ها منتقل می‌شود."""
event_id: UUID = Field(default_factory=uuid4)
event_type: str
aggregate_type: str
aggregate_id: str | None = None
tenant_id: UUID | None = None
source_service: str
payload: dict[str, Any] = Field(default_factory=dict)
occurred_at: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
def to_dict(self) -> dict[str, Any]:
return self.model_dump(mode="json")