from typing import Any, Mapping from marshmallow import Schema, fields, validate from playlist.connectors.snowflake import SnowflakeQuery from playlist.constants.handler_constants import STOREFRONT_ENABLED from playlist.queries.constants import ( ALLOWED_ORDER_BY_KEYS, DEFAULT_DISTRIBUTORS, DEFAULT_PAGE_SIZE, RECENT_PLACEMENTS_FILENAME, RECENT_PLACEMENTS_WITH_STOREFRONT_FILENAME, get_recent_placements_table_params, ) class RecentPlacementsSchema(Schema): limit = fields.Integer(required=True) offset = fields.Integer(required=True) filter_label_ids = fields.List(fields.Str) filter_subaccount_ids = fields.List(fields.Str) playlist_types = fields.List(fields.Str) store_ids = fields.List(fields.Str) min_followers = fields.Integer() curator_countries = fields.List(fields.Str) permission_label_ids = fields.List(fields.Str) permission_subaccount_ids = fields.List(fields.Str) permission_label_participant_ids = fields.List(fields.Int) global_participant_ids = fields.List(fields.Str) distributors = fields.List(fields.Str) use_primary_playlist_type = fields.Boolean() sort_key = fields.Str(validate=validate.OneOf(ALLOWED_ORDER_BY_KEYS)) sort_direction = fields.Str(validate=validate.OneOf(["ASC", "DESC"])) storefront_enabled = fields.Boolean(default=False) filter_by_top_10_apple_music_markets = fields.Boolean(default=False) class RecentPlacementsQuery(SnowflakeQuery): query_schema = RecentPlacementsSchema default_params = { "offset": 0, "limit": DEFAULT_PAGE_SIZE, "distributors": DEFAULT_DISTRIBUTORS, } @property def table_params(self) -> Mapping[str, Any]: return get_recent_placements_table_params(self.user_params) @property def filename(self) -> str: return ( RECENT_PLACEMENTS_WITH_STOREFRONT_FILENAME if self.user_params.get(STOREFRONT_ENABLED) else RECENT_PLACEMENTS_FILENAME )