import sqlalchemy as sa from sqlalchemy.orm import joinedload, selectinload from ows_text_campaigns.adapters.db import Repository from ows_text_campaigns.artist.models import ArtistPhoneNumber, ArtistSettings class ArtistPhoneNumberRepository(Repository[ArtistPhoneNumber]): def exists_by_phone_numbers_excluding_global_participant_id( self, phone_numbers: list[str], global_participant_id: str ) -> bool: query = sa.select( sa.select(1) .exists() .where( ArtistPhoneNumber.phone_number.in_(phone_numbers), ArtistPhoneNumber.global_participant_id != global_participant_id, ) ) result = self.db.session.execute(query) return bool(result.scalar_one()) class ArtistSettingsRepository(Repository[ArtistSettings]): def get_by_global_participant_id( self, global_participant_id: str ) -> ArtistSettings | None: query = ( sa.select(ArtistSettings) .where( ArtistSettings.global_participant_id == global_participant_id, ) .options( joinedload(ArtistSettings.asset), selectinload(ArtistSettings.phone_numbers), ) ) return self.db.session.execute(query).scalar_one_or_none() def get_by_phone_number(self, phone_number: str) -> ArtistSettings | None: query = ( sa.select(ArtistSettings) .join(ArtistSettings.phone_numbers) .where(ArtistPhoneNumber.phone_number == phone_number) .options( joinedload(ArtistSettings.asset), selectinload(ArtistSettings.phone_numbers).joinedload( ArtistPhoneNumber.vcard_asset ), ) .limit(1) ) return self.db.session.execute(query).scalar_one_or_none()