from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from dmp.adapters.aws.s3 import S3Client from dmp.audiences.exceptions import AudienceExportNotFoundError from dmp.audiences.models import AudienceExport from dmp.audiences.repositories import AudienceExportRepository from dmp.audiences.services import AudienceService from dmp.config import Settings @dataclass class GetAudienceExportRequest(AuthRequest): audience_id: str export_id: str @dataclass class GetAudienceExportResponse: export: AudienceExport presigned_url: str | None @singleton class GetAudienceExportHandler: permission = Permission("audience", "export_to_csv") def __init__( self, s3_client: S3Client, auth_service: AuthService, audience_service: AudienceService, audience_export_repository: AudienceExportRepository, settings: Settings, ) -> None: self.s3_client = s3_client self.auth_service = auth_service self.audience_service = audience_service self.audience_export_repository = audience_export_repository self.settings = settings def handle(self, request: GetAudienceExportRequest) -> GetAudienceExportResponse: audience = self.audience_service.get_audience(request.audience_id) self.auth_service.check_account_resource( request.identity_id, account=audience.account, permission=self.permission, resource_id=audience.id, ) snapshot = audience.latest_snapshot if not snapshot: raise AudienceExportNotFoundError export = self.audience_export_repository.get_by_id_and_audience_id( export_id=request.export_id, audience_id=audience.id, ) if not export: raise AudienceExportNotFoundError presigned_url: str | None = None if export.is_completed and export.zip_key: presigned_url = self.s3_client.generate_presigned_url( bucket=self.settings.audience_export_bucket_name, key=export.zip_key, ) return GetAudienceExportResponse( export=export, presigned_url=presigned_url, )