"""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.logic import art_relations from src.logic import graphql from src.common.models.metadata import InconsistencyType from src.common.models.metadata import InconsistencyReport from src.common.models.metadata import MissingRecord from src.common.models.metadata import ReleaseArtistTable from src.models.metadata import ProductParticipation def check_product_participations(product_metadata: ProductMetadata) -> InconsistencyReport: """Product Participations consistency check against AR. Args: product_metadata: Product metadata. Returns: Inconsistency Report. """ gql_product_participations = graphql.get_product_participations(product_metadata) ar_product_participations = art_relations.get_product_participations( product_metadata.product.productId) missing_pp, extra_pp = _compare_participations( ar_product_participations, gql_product_participations) missing_data = _get_missing_product_participations_records(missing_pp) return InconsistencyReport( inconsistency_type=InconsistencyType.BAD_PRODUCT_PARTICIPATIONS, missing_data=missing_data) def _compare_participations( ar_participations: List[ProductParticipation], gql_participations: List[ProductParticipation] ) -> Tuple[List[ProductParticipation], List[ProductParticipation]]: """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_product_participations_records( missing_product_participations: List[ProductParticipation] ) -> List[MissingRecord]: """Get missing product participations records.""" return [ MissingRecord( table_name=ReleaseArtistTable.name, primary_key_name=ReleaseArtistTable.primary_key_name, record_id=participation.participant_id, ) for participation in missing_product_participations ]