"""High-level logic for consistency checks. `ar_` prefix stands for Art Relations. `mg_` prefix stands for Music Graph. """ from __future__ import annotations from typing import List from typing import Tuple from src.common.models.graphql import ProductMetadata from src.common.models.metadata import InconsistencyReport from src.common.models.metadata import InconsistencyType from src.common.models.metadata import MissingRecord from src.common.models.metadata import TrackArtistTable from src.common.models.metadata import TrackWriterTable from src.logic import art_relations from src.logic import graphql from src.models.metadata import TrackParticipation def check_track_participations(product_metadata: ProductMetadata) -> InconsistencyReport: """Track Participations consistency check against AR. Args: product_metadata: Product metadata. Returns: Inconsistency Report. """ gql_track_participations = graphql.get_track_participations(product_metadata) ar_track_participations = art_relations.get_track_participations( product_metadata.product.productId) missing_pp, extra_pp = _compare_participations( ar_track_participations, gql_track_participations) missing_data = _get_missing_track_participations_records(missing_pp) return InconsistencyReport( inconsistency_type=InconsistencyType.BAD_TRACK_PARTICIPATIONS, missing_data=missing_data) def _compare_participations( ar_participations: List[TrackParticipation], gql_participations: List[TrackParticipation] ) -> Tuple[List[TrackParticipation], List[TrackParticipation]]: """Compare two lists of product participations. Args: ar_participations: AR Product Participations list. gql_participations: GQL Product Participations list. Returns: List of missing participations and list of extra participations. """ missing_participations = [ participation for participation in ar_participations if participation not in gql_participations ] extra_participations = [ participation for participation in gql_participations if participation not in ar_participations ] return missing_participations, extra_participations def _get_missing_track_participations_records( missing_track_participations: List[TrackParticipation]) -> List[MissingRecord]: """Get missing track participations records.""" result = [] for participation in missing_track_participations: if participation.participant_participated_as == 'track_writer': table = TrackWriterTable else: table = TrackArtistTable result.append( MissingRecord( table_name=table.name, primary_key_name=table.primary_key_name, record_id=participation.participant_id, ) ) return result