from dataclasses import dataclass from typing import List from external_api.streams_analytics.providers.TrackStreamsProvider import TrackStreamsQuery from external_api.streams_analytics.track_streams_fetcher import TrackStreamsFetcher, default_track_streams_fetcher from external_api.base.analytics_models import StreamsAnalyticsResult from external_api.base.clients.apollo_client import ApolloClient from external_api.base.clients.client_factory import ApiClientFactory from utils.async_helpers import await_all @dataclass class DateRange: start_date: str end_date: str class StreamsAnalyticsService: track_streams_fetcher: TrackStreamsFetcher apollo_api_client: ApolloClient def __init__( self, track_streams_fetcher: TrackStreamsFetcher = default_track_streams_fetcher(), apollo_api_client: ApolloClient = ApiClientFactory.apollo_api_client(), ) -> None: super().__init__() self.track_streams_fetcher = track_streams_fetcher self.apollo_api_client = apollo_api_client async def get_album_stream_analytics(self, album_id: str, date_range: DateRange) -> List[StreamsAnalyticsResult]: tracks = await self.apollo_api_client.get_album_tracks(album_id) tasks = list(map(lambda x: self.get_track_streams_analytics(x.external_ids.isrc, date_range), tracks)) return await await_all(tasks) async def get_track_streams_analytics(self, isrc: str, date_range: DateRange) -> StreamsAnalyticsResult: query = TrackStreamsQuery(isrc=isrc, start_date=date_range.start_date, end_date=date_range.end_date) results = await self.track_streams_fetcher.fetch(query) return StreamsAnalyticsResult(results=results)