from typing import List from artists.repositories.artist_roster_repository import ArtistRosterRepository from artists.schemas import ( ArtistRosterProjectResponseModel, ArtistRosterProjectsRequestSchema ) from media_plan.schemas import MediaPlanShortResponseSchema from utils.list_utils import first_or_none class ArtistRosterProjectsListService: projects_list_repository: ArtistRosterRepository def __init__( self, projects_list_repository: ArtistRosterRepository = ArtistRosterRepository(), ): self.projects_list_repository = projects_list_repository def get_artist_project_list_for_expansion( self, user_id: int, artist_external_id: str, filters: ArtistRosterProjectsRequestSchema ) -> List[ArtistRosterProjectResponseModel]: fetched_projects = self.projects_list_repository.get_projects_list(user_id, artist_external_id, filters) projects_ids = list(map(lambda x: x.Project.id, fetched_projects)) media_plans = self.projects_list_repository.get_project_media_plans(projects_ids) return list(map(lambda x: self.__map_project(x, media_plans), fetched_projects)) def __map_project(self, project_model, media_plans) -> ArtistRosterProjectResponseModel: project_meta = first_or_none(media_plans, lambda x: x.project_id == project_model.Project.id) media_plans = list(map(self.__map_media_plan, project_meta.media_plans)) if project_meta else [] return ArtistRosterProjectResponseModel( id=project_model.Project.id, name=project_model.Project.name, status=project_model.status, startDate=project_model.start_date, endDate=project_model.Project.end_date, currency=project_model.Project.currency, allocatedBudget=project_model.Project.allocation, totalBudget=project_model.Project.budget, mediaPlans=media_plans, ) def __map_media_plan(self, media_plan): return MediaPlanShortResponseSchema( id=media_plan.get("id"), name=media_plan.get("name"), )