from apollo_utils.core.constants import MARKET_WORLDWIDE from datetime import date, timedelta from sqlalchemy import func from typing import List from apollo_main_db.spotify.models import SpotifyAnalyticsAccountStreamInfo from src.db.base import session as db_session from src.legacy.redis_db import keys from src.legacy.redis_db.decorators import cache_value from src.legacy.spotify.vendor.base import SpotifyBase class SpotifyStreams(SpotifyBase): @cache_value(keys.SPOTIFY_MARKETS_BY_STREAMS, keys.SPOTIFY_MARKETS_BY_STREAMS_TTL) def get_markets_by_month_streams(self) -> List[str]: """Get list of markets sorted by the last month streams. Returns: Markets list. """ from_date = (date.today() - timedelta(days=31)).isoformat() result = ( db_session.query(SpotifyAnalyticsAccountStreamInfo.market) .filter( SpotifyAnalyticsAccountStreamInfo.account == 1, SpotifyAnalyticsAccountStreamInfo.date >= from_date, ) .group_by(SpotifyAnalyticsAccountStreamInfo.market) .order_by(func.sum(SpotifyAnalyticsAccountStreamInfo.total_streams).desc()) .all() ) return [MARKET_WORLDWIDE] + [i.market for i in result]