from dataclasses import dataclass from typing import ClassVar from fansifter_common.adapters.ows_account import OwsAccountClient from fansifter_common.adapters.ows_users import OwsUsersClient from fansifter_common.adapters.sendgrid import SendGridClient from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from fansifter_common.core.enums import Brand from fansifter_common.legal_info.services import LegalInfoService from fansifter_common.translation.services import TranslationService from email_campaigns.adapters.db import Repository from email_campaigns.campaigns.services import EmailCampaignService from email_campaigns.emails.exceptions import EmailNotFoundError from email_campaigns.emails.models import BaseEmail @dataclass(kw_only=True) class GetEmailPrivacyFooterRequest(AuthRequest): email_id: str class GetEmailPrivacyFooterHandler[T: BaseEmail]: permission: ClassVar[Permission] def __init__( self, auth_service: AuthService, campaign_service: EmailCampaignService, sendgrid_client: SendGridClient, legal_info_service: LegalInfoService, translation_service: TranslationService, ows_account_client: OwsAccountClient, ows_users_client: OwsUsersClient, email_repository: Repository[T], ) -> None: self.auth_service = auth_service self.campaign_service = campaign_service self.sendgrid_client = sendgrid_client self.legal_info_service = legal_info_service self.translation_service = translation_service self.ows_account_client = ows_account_client self.ows_users_client = ows_users_client self.email_repository = email_repository def handle(self, request: GetEmailPrivacyFooterRequest) -> str: 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, ) vendor = self.ows_account_client.get_vendor(email.vendor_id) identity = self.ows_users_client.get_identity(request.identity_id) if not email.email_domain: brand = Brand.SME else: brand = email.email_domain.brand fan_country_iso2 = self.legal_info_service.default_country_code legal_entity = self.legal_info_service.get_legal_entity(fan_country_iso2) translations = self.translation_service.get_translations_by_country_code( fan_country_iso2 ) return self.sendgrid_client.get_user_privacy_footer_block( email=identity.email, privacy_links_block=self.legal_info_service.prepare_privacy_links_for_country( fan_country_iso2 ), opt_in_info=translations["en"].optInInfo, opt_in_info_external=translations["en"].optInInfoExternal, unsubscribe_text=translations["en"].unsubscribe, unsubscribe_url="#", vendor_id=vendor.vendor_id, vendor_name=vendor.name, legal_entity=legal_entity, brand=brand, preview=True, )