from dataclasses import dataclass from anydi import singleton from fansifter_common.auth.requests import AuthRequest from fansifter_common.auth.services import AuthService from fansifter_common.auth.types import Permission from pydantic import TypeAdapter from dmp.adapters.db import ReportingDB from dmp.artists.cache import ArtistCache, cached_artist_data from dmp.artists.dtos import ArtistAccount @dataclass class GetArtistAccountsRequest(AuthRequest): global_participant_id: str ArtistAccountValidator = TypeAdapter(list[ArtistAccount]) @singleton class GetArtistAccountsHandler: permission = Permission("roster", "view") def __init__( self, db: ReportingDB, auth_service: AuthService, artist_cache: ArtistCache, ) -> None: self.db = db self.auth_service = auth_service self.artist_cache = artist_cache def handle(self, request: GetArtistAccountsRequest) -> list[ArtistAccount]: account_access = self.auth_service.authorize_for_permission( request.identity_id, permission=self.permission ) return self._get_artist_accounts( request.global_participant_id, vendor_ids=account_access.vendor_ids, subaccount_ids=account_access.subaccount_ids, ) @cached_artist_data("accounts") def _get_artist_accounts( self, global_participant_id: str, vendor_ids: list[int], subaccount_ids: list[int], ) -> list[ArtistAccount]: query = self.db.query_from_template( "artist/get-accounts.sql", context={ "global_participant_id": global_participant_id, "vendor_ids": vendor_ids, "subaccount_ids": subaccount_ids, }, ) return ArtistAccountValidator.validate_python( self.db.session.execute(query).mappings(), )