from dataclasses import dataclass from campaigns.meta.dtos import AdFormat from campaigns.meta.enums import ( AssetPositionGroup, CampaignContentType, CampaignPlatform, ) from campaigns.meta.models import Campaign, CampaignImage, CampaignVideo from campaigns.meta.repositories import AdFormatRepository @dataclass class AdFormatService: ad_format_repository: AdFormatRepository def get_campaign_available_ad_formats( self, campaign: Campaign, *, content_type: CampaignContentType, platforms: list[CampaignPlatform], ) -> list[AdFormat]: assets: list[CampaignImage] | list[CampaignVideo] if content_type == CampaignContentType.POST: return self.ad_format_repository.find_by_position_groups_and_platforms( position_groups=[ AssetPositionGroup.RATIO_9_16, AssetPositionGroup.RATIO_1_1, ], platforms=platforms, ) elif content_type == CampaignContentType.IMAGE: assets = [image for image in campaign.images if image.is_valid] elif content_type == CampaignContentType.VIDEO: assets = [video for video in campaign.videos if video.is_valid] else: return [] position_groups = list({asset.position_group for asset in assets}) return self.ad_format_repository.find_by_position_groups_and_platforms( position_groups=position_groups, platforms=platforms, ) def find_ad_formats_by_position_groups_and_platforms( self, position_groups: list[AssetPositionGroup], platforms: list[CampaignPlatform], ) -> list[AdFormat]: return self.ad_format_repository.find_by_position_groups_and_platforms( position_groups=position_groups, platforms=platforms, )