"""Blueprint for Historical Contract Advance API.""" from flask import Blueprint, request from owsrequest import flask_request from owsresponse import response from owsresponse.adaptors.flask import flaskify from abacus_contract.constants.error import ( ERROR_CODE_AUTHORIZATION, ERROR_INVALID_IDS, ) from abacus_contract.logic import ( contract as contract_logic, historical_contract_advance as logic, ) from abacus_contract.utils.authorization import pdp_authorize_many_accounts from abacus_contract.utils.format_error import validation_error from abacus_contract.utils.request import get_optional_numeric_list_from_params historical_contract_advance_api = Blueprint('historical_contract_advance_api', __name__) @historical_contract_advance_api.route( '/historical-contract-advances/dataloader', methods=['POST'] ) def get_historical_contract_advances_by_contract_ids(): """Get historical contract advances by list of contract IDs. Request Body: List of contract IDs (e.g., [1, 2, 3]) Returns: List of objects containing historical advances grouped by contract_id: [ {'data': [advance1, advance2, ...]}, {'data': [advance3]}, {'data': None} ] """ try: contract_ids = get_optional_numeric_list_from_params(optional=True) if contract_ids is None: contract_ids = [] except ValueError: return flaskify(validation_error(ERROR_INVALID_IDS.format(object='Contract'))) advances_response = logic.get_historical_contract_advances_by_contract_ids( contract_ids ) access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: account_ids = contract_logic.get_account_ids_by_contract_ids(contract_ids) authorized = pdp_authorize_many_accounts(account_ids) if not authorized: return flaskify( response.create_error_response( code=ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, ) ) return flaskify(advances_response)