from constants.artist_statuses import ArtistStatuses from shared.schemas import ArtistSchema from utils.list_utils import group_by from artists.repositories.artist_roster_repository import ArtistRosterRepository from artists.schemas import ( ArtistRosterRequestSchema, ArtistRosterArtistModel, ArtistRosterResponseModel, ArtistRosterMetadata ) class ArtistRosterService: artist_roster_repository = ArtistRosterRepository() def get_artist_roster(self, user_id: int, params: ArtistRosterRequestSchema) -> ArtistRosterResponseModel: artist_roster = self.artist_roster_repository.get_artist_roster(user_id, params) artists = group_by([self.__map_artists(artist) for artist in artist_roster], lambda x: x.metadata.status) return ArtistRosterResponseModel( live=artists.get(ArtistStatuses.ARTIST_STATUS_LIVE, []), planned=artists.get(ArtistStatuses.ARTIST_STATUS_PLANNED, []), inactive=artists.get(ArtistStatuses.ARTIST_STATUS_INACTIVE, []), ) def __map_artists(self, artist) -> ArtistRosterArtistModel: return ArtistRosterArtistModel( artist=ArtistSchema.from_db_model(artist.Artist), metadata=self.__map_metadata(artist) ) def __map_metadata(self, roster_artist) -> ArtistRosterMetadata: is_inactive = roster_artist.artist_status == ArtistStatuses.ARTIST_STATUS_INACTIVE projects_count = roster_artist.active_projects_count earliest_project_start_date = roster_artist.live_min_start_date latest_project_end_date = roster_artist.live_max_end_date if is_inactive: projects_count = roster_artist.completed_projects_count earliest_project_start_date = roster_artist.all_min_start_date latest_project_end_date = roster_artist.all_max_end_date return ArtistRosterMetadata( earliestProjectStartDate=earliest_project_start_date, latestProjectEndDate=latest_project_end_date, status=roster_artist.artist_status, isCurrentUserArtistTeamMember=roster_artist.is_team_member, projectsCount=projects_count )