modular_api/helpers/params_converter.py (84 lines of code) (raw):

import os import pathlib from base64 import b64decode from modular_api.helpers.exceptions import ModularApiBadRequestException from modular_api.helpers.log_helper import get_logger _LOG = get_logger(__name__) TEMP_FILE_TEMPLATE = '.{0}_modular_temp' SECURE_STRING = '*****' TEMP_FILE_FOLDER_PATH = pathlib.Path(__file__).parent.parent.resolve() def convert_param(param): return f'--{param}' def build_param_and_value_in_click_format(param, value, secure_parameters, parameters_list, log_parameters_list): value_to_be_logged = value if param in secure_parameters: value_to_be_logged = SECURE_STRING param = convert_param(param) parameters_list.extend([param, value]) log_parameters_list.extend([param, value_to_be_logged]) return parameters_list, log_parameters_list def is_valid_file_extensions_passed(meta_file_extensions, received_file_extension): if meta_file_extensions and ( not received_file_extension or received_file_extension not in meta_file_extensions): raise ModularApiBadRequestException( f'File must have the following extensions: ' f'{", ".join(meta_file_extensions)}') def process_file_with_extension(file_extension: str, file_content: bytes, temp_file: str): with open(temp_file, 'wb') as file: file.write(file_content) def convert_api_params(body, command_def, secure_parameters): """ Convert api params and check :param body: The body of the request :param command_def: The command definition of the current command from command_base.json file :param secure_parameters: Secure parameters of the command :return: List of the temporary files """ parameters_list = [] log_parameters_list = [] temp_files_list = [] def_map = {j['name']: i for i, j in enumerate(command_def['parameters'])} for key, value in body.items(): if def_map.get(key) and command_def['parameters'][def_map[key]].get( 'convert_content_to_file'): meta_file_extensions = command_def['parameters'][def_map[key]].get( 'temp_file_extension') received_file_extension = value['file_extension'] is_valid_file_extensions_passed( meta_file_extensions=meta_file_extensions, received_file_extension=received_file_extension ) temp_file_key = TEMP_FILE_TEMPLATE.format(key) temp_file = os.path.join(TEMP_FILE_FOLDER_PATH, temp_file_key) temp_file += received_file_extension process_file_with_extension( file_extension=received_file_extension, file_content=b64decode(value['file_content']), temp_file=temp_file ) parameters_list, log_parameters_list = \ build_param_and_value_in_click_format( key, temp_file, secure_parameters, parameters_list, log_parameters_list) temp_files_list.append(temp_file) continue is_flag = command_def['parameters'][def_map[key]].get('is_flag') if is_flag: if value not in [True, 'True', 'true']: raise ModularApiBadRequestException( f'Unexpected value for the flag \'{key}\'. ' f'Only \'True\' is allowed, got \'{value}\'.' ) pretty_param = convert_param(key) parameters_list.append(pretty_param) log_parameters_list.append(pretty_param) elif isinstance(value, (str, int, float, bool)): parameters_list, log_parameters_list = \ build_param_and_value_in_click_format( key, value, secure_parameters, parameters_list, log_parameters_list) elif isinstance(value, list): for param_value in value: parameters_list, log_parameters_list = \ build_param_and_value_in_click_format( key, param_value, secure_parameters, parameters_list, log_parameters_list) return parameters_list, temp_files_list, log_parameters_list