from flask import jsonify, request from analytics import config, features from analytics.api import app from analytics.constants.access import ACCESS_ANALYTICS from analytics.features import is_insights_transfer_product_ownership_enabled from analytics.handler_utils import _get_query_string_params, user_has_full_access from analytics.logic.permissions import get_permission_values from analytics.logic.tiktok import ( get_tiktok_aggregated_summary, get_tiktok_aggregated_time_series, get_tiktok_time_series, ) from analytics.validation.access import verify_profile @app.route(config.SOUND_RECORDING_TIKTOK_TIMESERIES_PATH) @verify_profile(access=ACCESS_ANALYTICS) def sound_recording_tiktok_timeseries(isrc): """Return TikTok timeseries for a sound recording. Route: GET /sound-recording//tiktok/timeseries Path params: isrc (str): ISRC identifier. Query params: start_date (str): Start date YYYY-MM-DD. end_date (str): End date YYYY-MM-DD. type (str): Aggregation type (BY_CONTENT_TYPE, BY_COUNTRY, or ALL). countries (list[str]): Country codes to filter by. ids (list[str]): IDs to filter by. days_back (str): Number of days to look back. Snowflake tables: - V_TIKTOK_BY_ISRC_PRODUCT_COUNTRY_DAILY - V_TIKTOK_BY_ISRC_COUNTRY_DAILY JOINs: - DIM_RELEASE (permissions subquery) - LABEL_PARTICIPANT_PARTICIPATED_IN_ORCHARD_PRODUCT (permissions subquery) Returns: JSON with TikTok timeseries items. """ path_params = {"reverse_isrc": isrc[::-1], "isrc": isrc} query_params = _get_query_string_params( ["start_date", "end_date", "type"], path_params ) query_params = { **query_params, "countries": request.args.getlist("countries"), "ids": request.args.getlist("ids"), "days_back": request.args.get("days_back"), "transfer_product_ownership_enabled": is_insights_transfer_product_ownership_enabled(), } permissions = get_permission_values() if user_has_full_access(permissions): query_params["user_has_full_access"] = True else: query_params["user_has_full_access"] = False timeseries = get_tiktok_time_series(query_params, permissions) response_body = {"items": timeseries} return jsonify(response_body), 200 @app.route(config.SOUND_RECORDING_TIKTOK_SUMMARY_PATH) @verify_profile(access=ACCESS_ANALYTICS) def sound_recording_tiktok_summary(isrc): """Return TikTok summary for a sound recording. Route: GET /sound-recording//tiktok/summary Path params: isrc (str): ISRC identifier. Query params: start_date (str): Start date YYYY-MM-DD. end_date (str): End date YYYY-MM-DD. type (str): Aggregation type (BY_CONTENT_TYPE, BY_COUNTRY, or ALL). countries (list[str]): Country codes to filter by. days_back (str): Number of days to look back. limit (int): Max results (default 25). offset (int): Pagination offset (default 0). order_by (str): Sort field (default "creations"). order_dir (str): Sort direction (default "DESC"). Snowflake tables: - V_TIKTOK_BY_ISRC_PRODUCT_COUNTRY_DAILY - V_TIKTOK_BY_ISRC_COUNTRY_DAILY JOINs: - DIM_RELEASE (permissions subquery) - LABEL_PARTICIPANT_PARTICIPATED_IN_ORCHARD_PRODUCT (permissions subquery) Returns: JSON with TikTok summary items. """ path_params = {"reverse_isrc": isrc[::-1], "isrc": isrc} query_params = _get_query_string_params( ["start_date", "end_date", "type"], path_params ) query_params = { **query_params, "countries": request.args.getlist("countries"), "summary": True, "days_back": request.args.get("days_back"), "limit": int(request.args.get("limit", 25)), "offset": int(request.args.get("offset", 0)), "order_by": request.args.get("order_by", "creations"), "order_dir": request.args.get("order_dir", "DESC"), "transfer_product_ownership_enabled": is_insights_transfer_product_ownership_enabled(), } permissions = get_permission_values() if user_has_full_access(permissions): query_params["user_has_full_access"] = True else: query_params["user_has_full_access"] = False summary = get_tiktok_time_series(query_params, permissions) response_body = {"items": summary} return jsonify(response_body), 200 @app.route(config.SOUND_RECORDING_TIKTOK_AGGREGATED_SUMMARY_PATH) @verify_profile(access=ACCESS_ANALYTICS) def sound_recording_tiktok_aggregated_summary(isrc): """Return TikTok aggregated summary for a sound recording. Route: GET /sound-recording//tiktok/aggregated-summary Path params: isrc (str): ISRC identifier. Query params: countries (list[str]): Country codes to filter by. top_size (int): Number of top items (default 5). Snowflake tables: - TIKTOK_BY_ISRC_PRODUCT_COUNTRY_ROLLUP - TIKTOK_BY_ISRC_COUNTRY_ROLLUP JOINs: - DIM_RELEASE (permissions subquery) - LABEL_PARTICIPANT_PARTICIPATED_IN_ORCHARD_PRODUCT (permissions subquery) Returns: JSON with aggregated TikTok summary. """ path_params = {"reverse_isrc": isrc[::-1], "isrc": isrc} query_params = { **path_params, "countries": request.args.getlist("countries"), "top_size": int(request.args.get("top_size", 5)), "transfer_product_ownership_enabled": is_insights_transfer_product_ownership_enabled(), } permissions = get_permission_values() if user_has_full_access(permissions): query_params["user_has_full_access"] = True else: query_params["user_has_full_access"] = False aggregated_summary = get_tiktok_aggregated_summary(query_params, permissions) response_body = {**aggregated_summary} return jsonify(response_body), 200 @app.route(config.SOUND_RECORDING_TIKTOK_AGGREGATED_TIMESERIES_PATH) @verify_profile(access=ACCESS_ANALYTICS) def sound_recording_tiktok_aggregated_timeseries(isrc): """Return TikTok aggregated timeseries for a sound recording. Route: GET /sound-recording//tiktok/aggregated-timeseries Path params: isrc (str): ISRC identifier. Query params: countries (list[str]): Country codes to filter by. top_size (int): Number of top items (default 5). days_back (int): Number of days to look back (default 28). Snowflake tables: - TIKTOK_BY_ISRC_PRODUCT_COUNTRY_ROLLUP - TIKTOK_BY_ISRC_COUNTRY_ROLLUP - V_TIKTOK_BY_ISRC_PRODUCT_COUNTRY_DAILY - V_TIKTOK_BY_ISRC_COUNTRY_DAILY JOINs: - DIM_RELEASE (permissions subquery) - LABEL_PARTICIPANT_PARTICIPATED_IN_ORCHARD_PRODUCT (permissions subquery) Returns: JSON with aggregated TikTok timeseries. """ path_params = {"reverse_isrc": isrc[::-1], "isrc": isrc} query_params = { **path_params, "countries": request.args.getlist("countries"), "top_size": int(request.args.get("top_size", 5)), "days_back": int(request.args.get("days_back", 28)), "is_tiktok_filters_enabled": True if features.is_tiktok_filters_enabled() else False, "transfer_product_ownership_enabled": is_insights_transfer_product_ownership_enabled(), } permissions = get_permission_values() if user_has_full_access(permissions): query_params["user_has_full_access"] = True else: query_params["user_has_full_access"] = False aggregated_timeseries = get_tiktok_aggregated_time_series(query_params, permissions) response_body = {**aggregated_timeseries} return jsonify(response_body), 200