from anydi import singleton from fansifter_common.adapters.stripo import StripoClient from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from email_campaigns.adapters.db import Repository from email_campaigns.automated.enums import AutomatedEmailType from email_campaigns.automated.models import AutomatedEmail from email_campaigns.emails.cache import EmailPublicPreviewCache from email_campaigns.emails.exceptions import EmailNotFoundError from email_campaigns.emails.handlers import ( UpdateEmailContentHandler, UpdateEmailContentRequest, ) from email_campaigns.emails.types import EmailPreview from email_campaigns.emails.validators import EmailValidator @singleton class UpdateAutomatedEmailContentHandler(UpdateEmailContentHandler[AutomatedEmail]): # TODO: ---> Permission("automated_email", "edit") permission = Permission("email_campaign", "edit") def __init__( self, auth_service: AuthService, email_repository: Repository[AutomatedEmail], preview_cache: EmailPublicPreviewCache, email_validator: EmailValidator, stripo_client: StripoClient, ) -> None: super().__init__( auth_service=auth_service, email_repository=email_repository, preview_cache=preview_cache, ) self.email_validator = email_validator self.stripo_client = stripo_client def validate_updated_email(self, email: AutomatedEmail) -> None: if email.html_content is None: return self.email_validator.validate_privacy_footer_block_presence(email.html_content) if email.type == AutomatedEmailType.OPT_IN: self.email_validator.validate_opt_in_button_block_presence( email.html_content ) def handle(self, request: UpdateEmailContentRequest) -> EmailPreview: 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, ) self.validate_email(email) if request.html is not None: email.html_content = request.html if request.css is not None: email.css_content = request.css self.validate_updated_email(email) if email.is_automated: email.compressed_content = self.stripo_client.compress( email.html_content or "", email.css_content or "", ) self.email_repository.save(email) self.preview_cache.delete(email.id, email.email_type) return email.preview