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.rosters.dtos import FanDataListItem, SearchFanDataListCriteria from dmp.rosters.enums import FanDataListType from dmp.rosters.repositories import FanDataListRepository from dmp.rosters.services import GlobalFanDataAccessService @dataclass(kw_only=True) class SearchRostersRequest(AuthAccountFilterRequest): DEFAULT_LIMIT: ClassVar[int] = 10 limit: int search: str | None = None exclude_local_reps: bool | None = None @dataclass(kw_only=True) class SearchRostersResponse: artists: list[FanDataListItem] custom_lists: list[FanDataListItem] @singleton class SearchRostersHandler: permission = Permission("roster", "view") def __init__( self, *, auth_service: AuthService, fandata_list_repository: FanDataListRepository, global_fandata_access_service: GlobalFanDataAccessService, ) -> None: self.auth_service = auth_service self.fandata_list_repository = fandata_list_repository self.global_fandata_access_service = global_fandata_access_service def handle(self, request: SearchRostersRequest) -> SearchRostersResponse: 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) global_vendor_ids = ( self.global_fandata_access_service.get_enabled_for_any_vendor( vendor_ids=vendor_ids, ) ) criteria = SearchFanDataListCriteria( vendor_ids=vendor_ids, subaccount_ids=subaccount_ids, search=request.search, global_vendor_ids=global_vendor_ids, exclude_local_reps=request.exclude_local_reps, ) result = self.fandata_list_repository.search_by_criteria( criteria, limit=request.limit, ) artists = [] custom_lists = [] for item in result: if item.type == FanDataListType.ARTIST: artists.append(item) elif item.type == FanDataListType.CUSTOM_LIST: custom_lists.append(item) return SearchRostersResponse( artists=artists, custom_lists=custom_lists, )