from typing import List from flask import g from artists.repositories.artist_team_repository import ArtistTeamRepository from services.artists_repository import ArtistsRepository from services.permissions.exceptions import ArtistsValidationError, UsersValidationError from utils.exceptions import Forbidden from utils.list_utils import diff class ArtistsValidator: artists_repository = ArtistsRepository() artist_team_repository = ArtistTeamRepository() def validate_request_user_admin_or_artist_team_editor(self, label_id: int, artist_external_id: str): if not g.is_admin: artists = self.artist_team_repository.get_artist_for_user_with_team_users_in_label( g.user_id, label_id, [artist_external_id] ) if not artists: raise Forbidden() def validate_all_artists_from_label_by_external_id(self, label_id: int, artists_ids: List[str]): label_artists = self.artists_repository.get_label_artists(label_id, artists_ids) unmatched_artists = diff(artists_ids, [artist.external_id for artist in label_artists]) if unmatched_artists: raise ArtistsValidationError( f"Artist with id {unmatched_artists} not related to label {label_id} or not exist" ) def validate_user_have_artist_team_user_for_artists_in_label( self, user_id: int, label_id: int, artists_ids: List[str] ): user_artists = self.artist_team_repository.get_artist_for_user_with_team_users_in_label( user_id, label_id, artists_ids ) unmatched_artists = diff(artists_ids, [artist.external_id for artist in user_artists]) if unmatched_artists: raise ArtistsValidationError( f"User has no artist teams for artists with IDs {unmatched_artists}" ) def validate_user_not_have_artist_team_user_for_artists_in_label( self, user_id: int, label_id: int, artists_ids: List[str] ): artists_without_user = self.artist_team_repository.get_artist_for_user_without_team_users_in_label( user_id, label_id, artists_ids ) unmatched_artists = diff(artists_ids, [artist.external_id for artist in artists_without_user]) if unmatched_artists: raise ArtistsValidationError( f"User has artist teams for artists with IDs {unmatched_artists}" ) def validate_artist_have_team_for_users_in_label( self, artist_id: str, label_id: int, users_ids: List[int] ): users_with_artist_teams = self.artist_team_repository.get_users_for_artist_with_team_users_in_label( users_ids, label_id, artist_id ) unmatched_users = diff(users_ids, [user.id for user in users_with_artist_teams]) if unmatched_users: raise UsersValidationError( f"Artist has no artist team with users IDs {unmatched_users}" ) def validate_artist_not_have_team_for_users_in_label( self, artist_id: str, label_id: int, users_ids: List[int] ): users_with_artist_teams = self.artist_team_repository.get_users_for_artist_without_team_users_in_label( users_ids, label_id, artist_id ) unmatched_users = diff(users_ids, [user.id for user in users_with_artist_teams]) if unmatched_users: raise UsersValidationError( f"Artist has artist team with users IDs {unmatched_users}" )