from dataclasses import dataclass from typing import ClassVar from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from fansifter_common.constants import PROD_ENVIRONMENT from email_campaigns.adapters.db import Repository from email_campaigns.config import settings from email_campaigns.emails import tokens from email_campaigns.emails.exceptions import EmailNotFoundError from email_campaigns.emails.models import BaseEmail @dataclass class GenerateEmailPublicPreviewUrlRequest(AuthRequest): email_id: str domain: str @dataclass class GenerateEmailPublicPreviewUrlResponse: url: str class GenerateEmailPublicPreviewUrlHandler[T: BaseEmail]: """Base handler for generating public preview URLs for emails.""" permission: ClassVar[Permission] path_prefix: ClassVar[str] = "" def __init__( self, auth_service: AuthService, email_repository: Repository[T], ) -> None: self.auth_service = auth_service self.email_repository = email_repository def _get_domain(self, requested_domain: str) -> str: if settings.environment == PROD_ENVIRONMENT: if requested_domain in settings.email_public_preview_available_domains: return requested_domain return settings.email_public_preview_available_domains[0] return settings.qa_email_public_preview_domain def handle( self, request: GenerateEmailPublicPreviewUrlRequest ) -> GenerateEmailPublicPreviewUrlResponse: """Generate public preview URL for an email.""" email_id = request.email_id email = self.email_repository.get(email_id) if email is None: raise EmailNotFoundError self.auth_service.authorize_account( request.identity_id, account=email.account, permission=self.permission, ) token = tokens.encrypt_email_id(email_id) domain = self._get_domain(request.domain) public_preview_url = f"https://fansifter-emails.{domain}/{self.path_prefix}{email_id}?pwd={token}" return GenerateEmailPublicPreviewUrlResponse(url=public_preview_url)