from typing import List from artists.repositories.artist_projects_repository import ArtistProjectsRepository from projects.schemas import UnclaimedProjectModelSchema, UserSchema from shared.schemas import RoleSchema from projects.models import ProjectListItemResultModel from projects.services.project_target_items_maper import ProjectTargetItemsMapper from projects.schemas import ProjectListQueryParams, ProjectModelSchema from projects.repositories.projects_counter_repository import ProjectsCounterRepository from artists.schemas import ( ArtistProjectListResponseSchema, ArtistProjectsMetadata, ArtistUnclaimedProjectListResponseSchema, ) from projects.repositories.projects_list_repository import ProjectsListRepository from models.user_project import UserProjectRoles from projects.repositories.unclaimed_projects_repository import UnclaimedProjectsRepository class ArtistProjectsListService: projects_list_repository: ProjectsListRepository target_items_mapper: ProjectTargetItemsMapper projects_counter_repository: ProjectsCounterRepository artist_projects_repository: ArtistProjectsRepository unclaimed_project_repository: UnclaimedProjectsRepository def __init__( self, projects_list_repository: ProjectsListRepository = ProjectsListRepository(), target_items_mapper: ProjectTargetItemsMapper = ProjectTargetItemsMapper(), projects_counter_repository: ProjectsCounterRepository = ProjectsCounterRepository(), artist_projects_repository: ArtistProjectsRepository = ArtistProjectsRepository(), unclaimed_project_repository: UnclaimedProjectsRepository = UnclaimedProjectsRepository(), ): self.projects_list_repository = projects_list_repository self.target_items_mapper = target_items_mapper self.projects_counter_repository = projects_counter_repository self.artist_projects_repository = artist_projects_repository self.unclaimed_project_repository = unclaimed_project_repository def get_project_list( self, user_id: int, artist_external_id: str, filters: ProjectListQueryParams ) -> ArtistProjectListResponseSchema: fetch_result = self.projects_list_repository.get_projects_list(user_id, filters, artist_external_id) projects = self.__map_project_list_models(fetch_result) counts = self.projects_counter_repository.get_projects_count(user_id, filters, artist_external_id) labels = self.artist_projects_repository.get_artist_projects_labels(artist_external_id) return ArtistProjectListResponseSchema( items=projects, metadata=ArtistProjectsMetadata(counts, labels), limit=filters.limit, offset=filters.offset ) def get_unclaimed_project_list( self, user_id: int, artist_external_id: str, params: ProjectListQueryParams ) -> ArtistUnclaimedProjectListResponseSchema: fetch_result = self.unclaimed_project_repository.get_unclaimed_project_list(user_id, params, artist_external_id) def artists_l(x): return self.target_items_mapper.map_project_target_items_from_model(x.target_items).items projects = [UnclaimedProjectModelSchema(item.Project, artists_l(item.Project)) for item in fetch_result] counts = self.projects_counter_repository.get_projects_count(user_id, params, artist_external_id) labels = self.artist_projects_repository.get_artist_unclaimed_projects_labels(artist_external_id) return ArtistUnclaimedProjectListResponseSchema( items=projects, metadata=ArtistProjectsMetadata(counts, labels), limit=params.limit, offset=params.offset ) def __map_project_list_models(self, list_models: List[ProjectListItemResultModel]) -> List[ProjectModelSchema]: result = [] for item in list_models: model = ProjectModelSchema( id=item.id, name=item.name, targets=self.target_items_mapper.map_project_target_items_from_model(item.targets), budget=item.budget, allocation=item.allocation, totalSpend=item.total_spend, startDate=item.start_date, endDate=item.end_date, status=item.status, sharedStatus=item.shared_status, userRoles=[RoleSchema(UserProjectRoles(role)) for role in item.user_roles], title=item.title, isConfidential=item.isConfidential, currency=item.currency, isClaimed=item.isClaimed ) result.append(model) return result