"""Bulk endpoint blueprints.""" import simplejson as json from flask import Blueprint, request from owsrequest import flask_request from owsresponse import response from owsresponse.adaptors.flask import flaskify from ledger.constants.error import ERROR_CODE_AUTHORIZATION from ledger.logic import bulk_ledgers as logic from ledger.utils.format_error import validation_error bulk_api = Blueprint('bulk_api', __name__) @bulk_api.route('/ledger/bulk', methods=['POST']) def bulk_create_ledger_account_entries(): """POST one or more ledger entries in an atomic transaction.""" access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify( response.create_error_response( code=ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, ) ) parsed_body = json.loads(request.data.decode(), use_decimal=True) try: logic.handle_bulk_insert(parsed_body) return flaskify(response.Response(message={'message': 'OK'}, status=201)) except Exception as e: return validation_error(str(e)) @bulk_api.route('/bulk/accounts-balance', methods=['GET']) def get_accounts_balances(): """Endpoint for bulk GET accounts' balances.""" access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify( response.create_error_response( code=ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=403, ) ) account_ids = request.args.get('account_ids', None) balance_min = request.args.get('balance_min', None) balance_max = request.args.get('balance_max', None) if account_ids: account_ids = list(map(int, account_ids.split(','))) return logic.get_accounts_balance( account_ids=account_ids, balance_min=balance_min, balance_max=balance_max ) @bulk_api.route('/bulk/contracts/closed-balance', methods=['GET']) def get_contracts_balances(): """Endpoint for bulk GET contracts' balances.""" access_rule_decision = flask_request.verify_rules_access_standalone(request) if not access_rule_decision: return flaskify( response.create_error_response( code=ERROR_CODE_AUTHORIZATION, message='Unauthorized', status=40, ) ) contract_ids = request.args.get('contract_ids', None) account_ids = request.args.get('account_ids', None) if contract_ids: contract_ids = list(map(int, contract_ids.split(','))) if account_ids: account_ids = list(map(int, account_ids.split(','))) return logic.get_contracts_balance( contract_ids=contract_ids, account_ids=account_ids )