feat: handle unsubscribe
This commit is contained in:
49
src/usecase/subscription/handle_unsubscription.py
Normal file
49
src/usecase/subscription/handle_unsubscription.py
Normal file
@@ -0,0 +1,49 @@
|
||||
import datetime
|
||||
import logging
|
||||
from typing import TYPE_CHECKING
|
||||
|
||||
from src import domain
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from .. import Usecase
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
|
||||
async def handle_unsubscription(self: 'Usecase', user_telegram_id: int, channel_telegram_id: int) -> None:
|
||||
async with self.database.transaction():
|
||||
subscriber = await self.database.get_subscriber(user_telegram_id)
|
||||
if not subscriber:
|
||||
log.warning('Subscriber not found for telegram_id: %s', user_telegram_id)
|
||||
return
|
||||
|
||||
subscriptions = await self.database.get_active_subscriptions_by_subscriber_and_channel(
|
||||
subscriber.id, channel_telegram_id
|
||||
)
|
||||
|
||||
if not subscriptions:
|
||||
log.info(
|
||||
'No active subscriptions found for subscriber %s (telegram_id: %s) in channel %s',
|
||||
subscriber.id,
|
||||
user_telegram_id,
|
||||
channel_telegram_id,
|
||||
)
|
||||
return
|
||||
|
||||
for subscription in subscriptions:
|
||||
subscription.status = domain.SubscriptionStatus.UNSUBSCRIBED
|
||||
subscription.unsubscribed_at = datetime.datetime.now(datetime.UTC)
|
||||
await self.database.update_subscription(subscription)
|
||||
|
||||
# Декрементируем счётчик подписок у закупа
|
||||
placement = subscription.placement
|
||||
if placement.subscriptions_count > 0:
|
||||
placement.subscriptions_count -= 1
|
||||
await self.database.update_placement(placement)
|
||||
|
||||
log.info(
|
||||
'Subscription marked as unsubscribed: subscriber %s (telegram_id: %s) unsubscribed from placement %s',
|
||||
subscriber.id,
|
||||
user_telegram_id,
|
||||
placement.id,
|
||||
)
|
||||
Reference in New Issue
Block a user