from collections.abc import Sequence from dataclasses import dataclass from typing import ClassVar from anydi import singleton from dmp.artists.dtos import Participant from dmp.artists.enums import ParticipantType from dmp.artists.repositories import ParticipantCriteria, ParticipantRepository @dataclass(kw_only=True) class GetParticipantsRequest: DEFAULT_LIMIT: ClassVar[int] = 50 DEFAULT_OFFSET: ClassVar[int] = 0 vendor_id: int | None = None subaccount_id: int | None = None search: str | None = None participant_type: ParticipantType | None = None virtual_participant_ids: list[str] | None = None limit: int offset: int @dataclass(frozen=True) class GetParticipantsResponse: total: int items: Sequence[Participant] @singleton class GetParticipantsHandler: def __init__( self, participant_repository: ParticipantRepository, ) -> None: self.participant_repository = participant_repository def handle(self, request: GetParticipantsRequest) -> GetParticipantsResponse: vendor_ids = [request.vendor_id] if request.vendor_id is not None else None subaccount_ids = [request.subaccount_id] if request.subaccount_id else None criteria = ParticipantCriteria( vendor_ids=vendor_ids, subaccount_ids=subaccount_ids, search=request.search, participant_type=request.participant_type, virtual_participant_ids=request.virtual_participant_ids, ) total = self.participant_repository.count_by_criteria(criteria) if total == 0: return GetParticipantsResponse(total=total, items=[]) participants = self.participant_repository.find_by_criteria( criteria, limit=request.limit, offset=request.offset, ) return GetParticipantsResponse(total=total, items=participants)