feat: handle unsubscribe
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user