from dataclasses import dataclass from typing import ClassVar from fansifter_common.adapters.stripo import StripoClient, StripoV2Client from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from email_campaigns.adapters.db import Repository from email_campaigns.adapters.features import ( AUDIENCE_ENABLE_STRIPO_PLUGIN_V2, Features, ) from email_campaigns.emails.exceptions import EmailNotFoundError from email_campaigns.emails.models import BaseEmail @dataclass(kw_only=True) class GetEmailStripoAuthTokenRequest(AuthRequest): email_id: str @dataclass class GetEmailStripoAuthTokenResponse: token: str class GetEmailStripoAuthTokenHandler[T: BaseEmail]: permission: ClassVar[Permission] def __init__( self, auth_service: AuthService, stripo_client: StripoClient, email_repository: Repository[T], features: Features, stripo_client_v2: StripoV2Client, ) -> None: self.auth_service = auth_service self.stripo_client = stripo_client self.email_repository = email_repository self.features = features self.stripo_client_v2 = stripo_client_v2 def handle( self, request: GetEmailStripoAuthTokenRequest ) -> GetEmailStripoAuthTokenResponse: email = self.email_repository.get(request.email_id) if email is None: raise EmailNotFoundError self.auth_service.authorize_account( request.identity_id, account=email.account, permission=self.permission, ) if self.features.is_on_for_identity( AUDIENCE_ENABLE_STRIPO_PLUGIN_V2, identity_id=request.identity_id, ): token = self.stripo_client_v2.generate_auth_token( user_id=request.identity_id, ) else: token = self.stripo_client.generate_auth_token() return GetEmailStripoAuthTokenResponse(token=token)