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

@@ -361,6 +361,46 @@ class Postgres(DatabaseBase):
result = await self.session.execute(q)
return result.scalar_one_or_none()
async def update_subscription(self, subscription: domain.Subscription) -> domain.Subscription:
await self.session.flush()
await self.session.refresh(subscription, ['placement', 'subscriber'])
return subscription
async def get_active_subscriptions_by_subscriber_and_channel(
self, subscriber_id: uuid.UUID, channel_telegram_id: int
) -> list[domain.Subscription]:
q = (
select(domain.Subscription)
.join(domain.Placement, domain.Subscription.placement_id == domain.Placement.id)
.join(domain.TargetChannel, domain.Placement.target_channel_id == domain.TargetChannel.id)
.where(
domain.Subscription.subscriber_id == subscriber_id,
domain.TargetChannel.telegram_id == channel_telegram_id,
domain.Subscription.status == domain.SubscriptionStatus.ACTIVE,
)
.options(selectinload(domain.Subscription.placement), selectinload(domain.Subscription.subscriber))
)
result = await self.session.execute(q)
return list(result.scalars().all())
async def get_active_subscription_by_subscriber_and_channel(
self, subscriber_id: uuid.UUID, channel_telegram_id: int
) -> domain.Subscription | None:
"""Получить активную подписку пользователя на канал (должна быть только одна благодаря UNIQUE constraint)."""
q = (
select(domain.Subscription)
.join(domain.Placement, domain.Subscription.placement_id == domain.Placement.id)
.join(domain.TargetChannel, domain.Placement.target_channel_id == domain.TargetChannel.id)
.where(
domain.Subscription.subscriber_id == subscriber_id,
domain.TargetChannel.telegram_id == channel_telegram_id,
domain.Subscription.status == domain.SubscriptionStatus.ACTIVE,
)
.options(selectinload(domain.Subscription.placement), selectinload(domain.Subscription.subscriber))
)
result = await self.session.execute(q)
return result.scalar_one_or_none()
async def create_placement_views_history(
self, history: domain.PlacementViewsHistory
) -> domain.PlacementViewsHistory: