from projects.constants import ProjectTargetTypes from db import db from utils.exceptions import ValidationError from models import ProjectTargetItem, Polymorphable, Artist from models.project_entity_type import ProjectEntityType, ProjectEntityAddType from projects.schemas import UpdateProjectParams from projects.repositories.projects_repository import ProjectsRepository from services.permissions.exceptions import ProjectNotFound class ProjectsValidator: projects_repository = ProjectsRepository() def validate_project_details(self, project_id: int, params: UpdateProjectParams): self.validate_project_exists(project_id) self.__validate_switch_to_playlist(project_id, params) def validate_project_exists(self, project_id: int): if not self.projects_repository.is_project_exists(project_id): raise ProjectNotFound() def __validate_switch_to_playlist(self, project_id: int, params: UpdateProjectParams): if params.targets.type == ProjectTargetTypes.PLAYLIST.value: artist = ( db.session.query(Artist) .select_from(Artist) .join(Polymorphable, Polymorphable.id == Artist.id) .join(ProjectTargetItem, Polymorphable.id == ProjectTargetItem.entity_id) .filter( ProjectTargetItem.project_id == project_id, ProjectTargetItem.entity_type == ProjectEntityType.PRIMARY_ARTIST.value, ProjectTargetItem.add_type == ProjectEntityAddType.LOCKED.value, ProjectTargetItem.is_deleted.is_(False), ) .one_or_none() ) if artist and not artist.is_unknown: raise ValidationError("Primary artist has to be unknown to change focus to playlist")