"""Audio Attribute handlers.""" from flask import request from oto.adaptors.flask import flaskify from owsrequest import flask_request from owsresponse import response from backend.api import app from backend.constants import error from backend.constants import header from backend.logic import audio_attribute as audio_attribute_logic from backend.schemas.audio_attribute import TrackAudioAttributeUpsertSchema from backend.utils import api as api_utils from backend.utils import handlers as handlers_util @app.route('/audio-attributes', methods=['GET']) def get_audio_attributes(): """Get all available audio attributes. Returns: flask.Response: list of audio attributes """ access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify(response.create_error_response( code=error.ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, )) result = audio_attribute_logic.get_audio_attributes() return flaskify(result) @app.route('/audio-attributes/', methods=['GET']) def get_track_audio_attributes(tuid): """Get all audio attributes associated with the given tuid. Returns: flask.Response: list of audio attribute ids """ access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify(response.create_error_response( code=error.ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, )) result = audio_attribute_logic.get_track_audio_attributes(tuid) return flaskify(result) @app.route('/suggested-audio-attributes/', methods=['GET']) def get_track_suggested_audio_attributes(tuid): """Get all audio attributes associated with the given tuid. Returns: flask.Response: list of audio attribute ids """ access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify(response.create_error_response( code=error.ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, )) result = audio_attribute_logic.get_track_suggested_audio_attributes(tuid) handlers_util.persist_and_strip_suggestions( result, tuid, attribute_id_key='audio_attribute_id', write_func=audio_attribute_logic.write_audio_attribute_suggestions, attr_type='audio attribute', ) return flaskify(result) @app.route('/audio-attributes-edits/', methods=['GET']) def get_track_audio_attributes_edits(tuid): """Get all audio attributes edits associated with the given tuid. Returns: flask.Response: list of audio attribute ids """ access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify(response.create_error_response( code=error.ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, )) result = audio_attribute_logic.get_track_audio_attributes_edits(tuid) return flaskify(result) @app.route('/upsert-audio-attributes', methods=['POST']) @handlers_util.get_account_from_grass def upsert_track_audio_attributes(account): """Bulk upsert audio attributes for tracks. Args: account (namedtuple): Account data from GRASS headers. Returns: flask.Response: success message or database error """ access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify(response.create_error_response( code=error.ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, )) orchard_identity_id = request.headers.get(header.ORCHARD_IDENTITY_ID) if not orchard_identity_id: return flaskify(api_utils.create_validation_error_response(error.ERROR_MESSAGE_MISSING_ORCHARD_IDENTITY_ID)) json_data = handlers_util.parse_request_json( schema=TrackAudioAttributeUpsertSchema) result = audio_attribute_logic.update_track_audio_attributes( json_data['items'], orchard_identity_id) return flaskify(result) @app.route('/upsert-audio-attributes-edits', methods=['POST']) @handlers_util.get_account_from_grass def upsert_track_audio_attributes_edits(account): """Bulk upsert audio attributes edits for tracks. Args: account (namedtuple): Account data from GRASS headers. Returns: flask.Response: success message or database error """ access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify(response.create_error_response( code=error.ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, )) json_data = handlers_util.parse_request_json( schema=TrackAudioAttributeUpsertSchema) result = audio_attribute_logic.update_track_audio_attributes_edits( json_data['items']) return flaskify(result)