from typing import Optional from projects.services.project_target_items_maper import ProjectTargetItemsMapper from services.recent_search.recent_search_repository import RecentSearchesRepository from services.recent_search.schemas import CampaignSearchModel, ProjectSearchModel from models.campaign import Campaign from models.projects import Project class CampaignMapperService: repository = RecentSearchesRepository() target_items_mapper: ProjectTargetItemsMapper = ProjectTargetItemsMapper() def map_entity(self, campaign: Campaign): project, is_pending = self.__project_for_campaign(campaign) category_id = campaign.type.group_id if campaign.type else None return CampaignSearchModel( id=campaign.id, name=campaign.name, uuid=campaign.uuid, project=project, startDate=campaign.start_date, endDate=campaign.fallback_end_date, categoryId=category_id, isPending=is_pending, isUnassigned=project is None, platforms=campaign.platform_value, ) def __project_for_campaign(self, campaign: Campaign) -> (Optional[ProjectSearchModel], bool): project = self.__first_or_none(self.repository.projects_by_campaign(campaign.id)) if project: is_pending = self.repository.is_campaign_pending_for_project(project.id, campaign.id) return self.__map_project(project), is_pending return None, False def __map_project(self, project: Project): targets = self.target_items_mapper.map_project_target_items_from_model(project.target_items) return ProjectSearchModel( id=project.id, name=project.display_name, targets=targets, startDate=project.start_date, isConfidential=project.is_confidential, isClaimed=project.is_claimed, userRoles=[], editDate=project.last_edit_at, ) def __first_or_none(self, items): return next(iter(items), None)