from dataclasses import dataclass from fansifter_common.adapters.stripo import StripoV2Client from email_campaigns.adapters.db import Repository from email_campaigns.config import settings from email_campaigns.emails.cache import EmailPublicPreviewCache from email_campaigns.emails.exceptions import ( AutosaveUnauthorizedError, EmailNotFoundError, ) from email_campaigns.emails.models import BaseEmail @dataclass(kw_only=True) class AutosaveEmailV2Request: email_id: str user_id: str username: str password: str class AutosaveEmailV2Handler[T: BaseEmail]: def __init__( self, email_repository: Repository[T], preview_cache: EmailPublicPreviewCache, stripo_client: StripoV2Client, ) -> None: self.email_repository = email_repository self.preview_cache = preview_cache self.stripo_client = stripo_client def handle(self, request: AutosaveEmailV2Request) -> None: self.authenticate(request) email = self.email_repository.get(request.email_id) if email is None: raise EmailNotFoundError self.validate_email(email) response = self.stripo_client.get_html_css( email_id=request.email_id, user_id=request.user_id, ) email.html_content = response.html email.css_content = response.css email.has_unapplied_changes = False email.updated_by = request.user_id self.email_repository.save(email) self.preview_cache.delete(email.id, email.email_type) def authenticate(self, request: AutosaveEmailV2Request) -> None: if ( settings.stripo_autosave_username != request.username or settings.stripo_autosave_password != request.password ): raise AutosaveUnauthorizedError def validate_email(self, email: T) -> None: """Extra email validation — override in subclasses."""