from dataclasses import dataclass from typing import cast from anydi import singleton from pydantic import TypeAdapter from dmp.adapters.db import ReportingDB from dmp.artists.dtos import Participant from dmp.artists.enums import ParticipantType ParticipantList = TypeAdapter(list[Participant]) @dataclass(kw_only=True) class ParticipantCriteria: vendor_ids: list[int] | None = None subaccount_ids: list[int] | None = None search: str | None = None participant_type: ParticipantType | None = None virtual_participant_ids: list[str] | None = None @singleton class ParticipantRepository: def __init__(self, db: ReportingDB) -> None: self.db = db def count_by_criteria(self, criteria: ParticipantCriteria) -> int: template_name = "participant/get-participants-count.sql" query = self.db.query_from_template( template_name, context={ "criteria": criteria, }, ) result = self.db.session.execute(query) return cast(int, result.scalar_one()) def find_by_criteria( self, criteria: ParticipantCriteria, *, limit: int | None = None, offset: int | None = None, ) -> list[Participant]: template_name = "participant/get-participants.sql" query = self.db.query_from_template( template_name, context={ "criteria": criteria, "limit": limit, "offset": offset, }, ) result = self.db.session.execute(query) return ParticipantList.validate_python(result.mappings())