from collections.abc import Sequence from dataclasses import dataclass from typing import ClassVar from anydi import singleton from fansifter_common.auth.requests import AuthAccountFilterRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from dmp.artists.dtos import Participant from dmp.artists.enums import ParticipantType from dmp.artists.repositories import ParticipantCriteria, ParticipantRepository @dataclass(kw_only=True) class GetArtistsV2Request(AuthAccountFilterRequest): DEFAULT_LIMIT: ClassVar[int] = 50 DEFAULT_OFFSET: ClassVar[int] = 0 search: str | None = None participant_type: ParticipantType | None = None virtual_participant_ids: list[str] | None = None limit: int offset: int @dataclass(frozen=True) class GetArtistsV2Response: total: int items: Sequence[Participant] @singleton class GetArtistsV2Handler: permission = Permission("roster", "view") def __init__( self, auth_service: AuthService, participant_repository: ParticipantRepository, ) -> None: self.auth_service = auth_service self.participant_repository = participant_repository def handle(self, request: GetArtistsV2Request) -> GetArtistsV2Response: account_access = self.auth_service.authorize_for_permission( request.identity_id, permission=self.permission ) vendor_ids = account_access.filter_vendor_ids(request.vendor_id) subaccount_ids = account_access.filter_subaccount_ids(request.subaccount_id) 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 GetArtistsV2Response(total=total, items=[]) participants = self.participant_repository.find_by_criteria( criteria, limit=request.limit, offset=request.offset, ) return GetArtistsV2Response(total=total, items=participants)