"""Models for metadata consistency.""" from __future__ import annotations from abc import ABC from abc import abstractmethod from dataclasses import dataclass from dataclasses import field from enum import Enum from typing import List from pydantic import BaseModel @dataclass class ParticipationMixin: """Mixin for product and track participations.""" participant_id: int | str participant_name: str participant_participated_as: str participant_normalized_name: str = field(init=False) def __post_init__(self): """Post init.""" self.participant_normalized_name = \ self.participant_name.replace(' ', '').replace('\t', '').lower() class ArtRelationsTable(ABC): """Art relations table interface.""" @classmethod @property @abstractmethod def name(cls): """Table name.""" raise NotImplementedError @classmethod @property @abstractmethod def primary_key_name(cls): """Table primary key name.""" raise NotImplementedError class ReleaseArtistTable(ArtRelationsTable): """Release artist table.""" name = 'release_artist' primary_key_name = 'release_artist_id' class TrackTable(ArtRelationsTable): """Release artist table.""" name = 'track' primary_key_name = 'id' class TrackArtistTable(ArtRelationsTable): """Release artist table.""" name = 'track_artist' primary_key_name = 'id' class TrackWriterTable(ArtRelationsTable): """Release artist table.""" name = 'track_writer' primary_key_name = 'track_writer_id' class MissingRecord(BaseModel): """Missing record model.""" table_name: str primary_key_name: str record_id: int class InconsistencyType(Enum): """Inconsistency type.""" BAD_LABEL_SOUND_RECORDINGS = 'BAD_LABEL_SOUND_RECORDINGS' BAD_PRODUCT_PARTICIPATIONS = 'BAD_PRODUCT_PARTICIPATIONS' BAD_TRACK_PARTICIPATIONS = 'BAD_TRACK_PARTICIPATIONS' class InconsistencyReport(BaseModel): """Inconsistency report model.""" inconsistency_type: InconsistencyType missing_data: List[MissingRecord] class Config: """Model config.""" use_enum_values = True def to_dict(self): """Convert to dict.""" if self.missing_data: return self.dict() else: return {} class ARSyncEvent(BaseModel): """AR Sync Event message model.""" commit: bool = True data: dict database: str = 'art_relations' old: dict = {} table: str type: str = 'update' source: str = 'lambda-metadata-consistency-checks'