feat: handle unsubscribe

This commit is contained in:
Artem Tsyrulnikov
2025-12-01 10:30:31 +03:00
parent c32635839a
commit ca3805eec3
14 changed files with 447 additions and 164 deletions

View File

@@ -11,6 +11,7 @@ __all__ = (
'TargetChannelStatus',
'CreativeStatus',
'PlacementStatus',
'SubscriptionStatus',
'InviteLinkType',
'PostViewsAvailability',
'LoginToken',
@@ -49,6 +50,6 @@ from .login_token import LoginToken
from .placement import InviteLinkType, Placement, PlacementStatus, PostViewsAvailability
from .placement_views_history import PlacementViewsHistory
from .subscriber import Subscriber
from .subscription import Subscription
from .subscription import Subscription, SubscriptionStatus
from .target_channel import TargetChannel, TargetChannelStatus
from .user import User

View File

@@ -8,7 +8,6 @@ from sqlalchemy.types import DateTime
def _camel_to_snake(name: str) -> str:
"""Convert CamelCase to snake_case."""
name = re.sub('(.)([A-Z][a-z]+)', r'\1_\2', name)
return re.sub('([a-z0-9])([A-Z])', r'\1_\2', name).lower()

View File

@@ -1,4 +1,6 @@
import datetime
import uuid
from enum import StrEnum
from typing import TYPE_CHECKING
from sqlalchemy import ForeignKey
@@ -11,10 +13,18 @@ if TYPE_CHECKING:
from .subscriber import Subscriber
class SubscriptionStatus(StrEnum):
ACTIVE = 'active'
UNSUBSCRIBED = 'unsubscribed'
class Subscription(domain.Base):
placement_id: Mapped[uuid.UUID] = mapped_column(ForeignKey('placement.id'), index=True)
subscriber_id: Mapped[uuid.UUID] = mapped_column(ForeignKey('subscriber.id'), index=True)
target_channel_id: Mapped[uuid.UUID] = mapped_column(ForeignKey('target_channel.id'), index=True)
invite_link: Mapped[str] = mapped_column(index=True) # По которой пришёл пользователь
status: Mapped[SubscriptionStatus] = mapped_column(default=SubscriptionStatus.ACTIVE)
unsubscribed_at: Mapped[datetime.datetime | None]
# Relationships
placement: Mapped['Placement'] = relationship(back_populates='subscriptions')