import csv import io import logging from anydi import singleton from fansifter_common.adapters.sendgrid.models import FanData from fansifter_common.legal_info.constants import DEFAULT_COUNTRY_CODE from fansifter_common.legal_info.services import LegalInfoService from fansifter_common.translation.services import TranslationService from app.adapters.aws.s3 import S3Client from app.config import Settings logger = logging.getLogger(__name__) @singleton class SeedlistService: def __init__( self, s3_client: S3Client, legal_info_service: LegalInfoService, translation_service: TranslationService, settings: Settings, ) -> None: self.s3_client = s3_client self.legal_info_service = legal_info_service self.translation_service = translation_service self.settings = settings def get_seedlist_emails(self) -> list[str]: """Get seedlist emails from S3.""" try: content = self.s3_client.get_object_content( bucket=self.settings.seedlist_s3_bucket_name, key=self.settings.seedlist_s3_key, ) csv_reader = csv.reader(io.StringIO(content)) next(csv_reader, None) # Skip header emails: list[str] = [] for row in csv_reader: if row and len(row) > 0 and row[0].strip(): email = row[0].strip().strip('"') if email: emails.append(email) logger.info( "Loaded %d seedlist emails from S3.", len(emails), extra={ "bucket": self.settings.seedlist_s3_bucket_name, "key": self.settings.seedlist_s3_key, }, ) return emails except Exception as exc: logger.error( "Failed to load seedlist from S3.", exc_info=exc, extra={ "bucket": self.settings.seedlist_s3_bucket_name, "key": self.settings.seedlist_s3_key, }, ) return [] def create_seedlist_fan_data(self, emails: list[str]) -> list[FanData]: """Create FanData objects for seedlist emails.""" fan_country_iso2 = 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 ) data_to_send: list[FanData] = [] for email in emails: data_to_send.append( FanData( email=email, profile_token=None, privacy_links_block=self.legal_info_service.prepare_privacy_links_for_country( fan_country_iso2, self.settings.privacy_footer_utm_source_name ), legal_entity_name=legal_entity.name, legal_entity_address=legal_entity.address, country_iso2=fan_country_iso2, opt_in_info=translations["en"].optInInfo, opt_in_info_external=translations["en"].optInInfoExternal, unsubscribe_text=translations["en"].unsubscribe, ) ) return data_to_send