"""Application Handlers. Requests are redirected to handlers, which are responsible for getting information from the URL and passing it down to the logic layer. The way each layer talks to each other is through Response objects which defines the type status of the data and the data itself. Please note: the Orchard uses the term handlers over views as convention for clarity See: oto.response for more details. """ from flask import request from playlist.api import app from playlist.constants.handler_constants import PAGINATION_QUERY_STRING_PARAMS from playlist.features import ( is_insights_playlist_v2_current_past_enabled, is_insights_primary_playlist_type_enabled, is_insights_transfer_product_ownership_enabled, is_show_sme_data_enabled, ) from playlist.queries.constants import DEFAULT_DISTRIBUTORS, DISTRIBUTORS_WITH_SME from playlist.queries.fetch_queries import ( fetch_bulk_sound_recording_placement_analytics, fetch_playlist_placement_streams_aggregated, fetch_playlist_placement_streams_on_date, fetch_sound_recording_top_placements, ) from playlist.services.ows_permissions import get_permissions from playlist.utils.handler_utils import ( format_response, get_post_request_params, get_query_string_list_params, get_query_string_params, parallel, separate_playlists_by_storefront, ) @app.route("/sound-recording//top-placements", methods=["GET"]) def get_sound_recording_top_placements(isrc): permissions = get_permissions(request) query_params = get_query_string_params( [ "sort_key", "sort_direction", "playlist_appearances", ] ) query_params = {**query_params, "isrc": isrc} query_params = get_query_string_list_params( { "streams_country": "stream_countries", "store_id": "store_ids", "playlist_type": "playlist_types", "curator_country": "curator_countries", "distributor": "distributors", }, query_params, ) # FF checks query_params["use_primary_playlist_type"] = ( is_insights_primary_playlist_type_enabled() ) query_params["transfer_product_ownership_enabled"] = ( is_insights_transfer_product_ownership_enabled() ) pagination_params = get_query_string_params(PAGINATION_QUERY_STRING_PARAMS) params = {**query_params, **pagination_params} placements, total_count = fetch_sound_recording_top_placements(params, permissions) return format_response({"placements": placements, "total_count": total_count}) @app.route("/sound-recording/placement-analytics-bulk", methods=["POST"]) def get_sound_recording_placement_analytics_bulk(): data = request.get_json() request_params = data.get("params", {}) request_params["insights_playlist_v2_current_past_enabled"] = ( is_insights_playlist_v2_current_past_enabled() ) playlist_placements = data.get("playlist_placements", []) if len(playlist_placements) == 0: return format_response({}, 400, "Missing playlist_placements") ( placements_with_storefronts, placements_without_storefront, ) = separate_playlists_by_storefront(playlist_placements) distributors = DEFAULT_DISTRIBUTORS if is_show_sme_data_enabled(): distributors = DISTRIBUTORS_WITH_SME query_params_with_storefront = get_post_request_params( request_params, [ "stream_countries", "storefronts", "playlist_appearances", "insights_playlist_v2_current_past_enabled", ], { "sound_recording_playlist_placements": placements_with_storefronts, "distributors": distributors, "storefront_defined": True, }, ) query_params_without_storefront = get_post_request_params( request_params, [ "stream_countries", "storefronts", "playlist_appearances", "insights_playlist_v2_current_past_enabled", ], { "sound_recording_playlist_placements": placements_without_storefront, "distributors": distributors, "storefront_defined": False, }, ) permissions = get_permissions(request) placements = [] if len(placements_without_storefront) > 0 and len(placements_with_storefronts) > 0: requests = { "without_storefront": { "func": fetch_bulk_sound_recording_placement_analytics, "args": (query_params_without_storefront, permissions), }, "with_storefront": { "func": fetch_bulk_sound_recording_placement_analytics, "args": (query_params_with_storefront, permissions), }, } result = parallel(requests) placements_storefront_not_provided = result.message["without_storefront"] placements_storefront_provided = result.message["with_storefront"] placements = placements_storefront_provided + placements_storefront_not_provided elif len(placements_without_storefront) > 0: placements = fetch_bulk_sound_recording_placement_analytics( query_params_without_storefront, permissions ) elif len(placements_with_storefronts) > 0: placements = fetch_bulk_sound_recording_placement_analytics( query_params_with_storefront, permissions ) return format_response({"placements": placements}) @app.route("/sound-recording/placement-streams-bulk", methods=["POST"]) def get_sound_recording_placement_streams_bulk(): data = request.get_json() request_params = data.get("params", {}) playlist_placements = data.get("playlist_placements", []) if len(playlist_placements) == 0: return format_response({}, 400, "Missing playlist_placements") ( placements_with_storefronts, placements_without_storefront, ) = separate_playlists_by_storefront(playlist_placements) distributors = DEFAULT_DISTRIBUTORS if is_show_sme_data_enabled(): distributors = DISTRIBUTORS_WITH_SME query_params_with_storefront = get_post_request_params( request_params, [ "stream_countries", ], { "sound_recording_playlist_placements": placements_with_storefronts, "distributors": distributors, "storefront_defined": True, }, ) query_params_without_storefront = get_post_request_params( request_params, [ "stream_countries", ], { "sound_recording_playlist_placements": placements_without_storefront, "distributors": distributors, "storefront_defined": False, }, ) permissions = get_permissions(request) placements = [] if len(placements_without_storefront) > 0 and len(placements_with_storefronts) > 0: requests = { "without_storefront": { "func": fetch_playlist_placement_streams_aggregated, "args": (query_params_without_storefront, permissions), }, "with_storefront": { "func": fetch_playlist_placement_streams_aggregated, "args": (query_params_with_storefront, permissions), }, } result = parallel(requests) placements_storefront_not_provided = result.message["without_storefront"] placements_storefront_provided = result.message["with_storefront"] placements = placements_storefront_provided + placements_storefront_not_provided elif len(placements_without_storefront) > 0: placements = fetch_playlist_placement_streams_aggregated( query_params_without_storefront, permissions ) elif len(placements_with_storefronts) > 0: placements = fetch_playlist_placement_streams_aggregated( query_params_with_storefront, permissions ) return format_response({"placements": placements}) @app.route("/sound-recording/placement-streams-on-date-bulk", methods=["POST"]) def get_sound_recording_placement_streams_on_date_bulk(): data = request.get_json() request_params = data.get("params", {}) playlist_placements = data.get("playlist_placements", []) if len(playlist_placements) == 0: return format_response({}, 400, "Missing playlist_placements") if not request_params.get("date"): return format_response({}, 400, "Missing date") ( placements_with_storefronts, placements_without_storefront, ) = separate_playlists_by_storefront(playlist_placements) query_params_with_storefront = get_post_request_params( request_params, ["stream_countries", "distributors", "date"], { "sound_recording_playlist_placements": placements_with_storefronts, "storefront_defined": True, }, ) query_params_without_storefront = get_post_request_params( request_params, ["stream_countries", "distributors", "date"], { "sound_recording_playlist_placements": placements_without_storefront, "storefront_defined": False, }, ) permissions = get_permissions(request) placements = [] if len(placements_without_storefront) > 0 and len(placements_with_storefronts) > 0: requests = { "without_storefront": { "func": fetch_playlist_placement_streams_on_date, "args": (query_params_without_storefront, permissions), }, "with_storefront": { "func": fetch_playlist_placement_streams_on_date, "args": (query_params_with_storefront, permissions), }, } result = parallel(requests) placements_storefront_not_provided = result.message["without_storefront"] placements_storefront_provided = result.message["with_storefront"] placements = placements_storefront_provided + placements_storefront_not_provided elif len(placements_without_storefront) > 0: placements = fetch_playlist_placement_streams_on_date( query_params_without_storefront, permissions ) elif len(placements_with_storefronts) > 0: placements = fetch_playlist_placement_streams_on_date( query_params_with_storefront, permissions ) return format_response({"placements": placements})