from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from fansifter_common.utils import timezone from dmp.adapters.db import DefaultDB, transactional from dmp.adapters.features import AUDIENCE_SHOW_SMS_CAMPAIGNS_PAGE, Features from dmp.audiences.enums import AudienceTarget from dmp.audiences.exceptions import AudienceTargetNotSupportedError from dmp.audiences.models import Audience from dmp.audiences.services import AudienceService @dataclass class ArchiveAudienceRequest(AuthRequest): audience_id: str @singleton class ArchiveAudienceHandler: ad_target_permission = Permission("audience", "archive_ad_target") email_target_permission = Permission("audience", "archive_email_target") text_target_permission = Permission("audience", "archive_text_target") def __init__( self, db: DefaultDB, auth_service: AuthService, audience_service: AudienceService, features: Features, ) -> None: self.db = db self.auth_service = auth_service self.audience_service = audience_service self.features = features @transactional def handle(self, request: ArchiveAudienceRequest) -> Audience: audience = self.audience_service.get_audience(request.audience_id) match audience.target: case AudienceTarget.EMAIL: self.auth_service.check_account_resource( request.identity_id, account=audience.account, permission=self.email_target_permission, ) case AudienceTarget.ADS: self.auth_service.check_account_resource( request.identity_id, account=audience.account, permission=self.ad_target_permission, ) case AudienceTarget.TEXT if self.features.is_on_for_identity( feature_flag_name=AUDIENCE_SHOW_SMS_CAMPAIGNS_PAGE, identity_id=request.identity_id, ): self.auth_service.check_account_resource( request.identity_id, account=audience.account, permission=self.text_target_permission, ) case _: raise AudienceTargetNotSupportedError audience.archived_at = timezone.now() audience.archived_by = request.identity_id self.audience_service.save_audience(audience) return audience