@oracle/suitecloud-cli
Version:
SuiteCloud CLI for Node.js
171 lines (153 loc) • 6.45 kB
JavaScript
/*
** Copyright (c) 2024 Oracle and/or its affiliates. All rights reserved.
** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl.
*/
;
const path = require('path');
const { prompt, Separator } = require('inquirer');
const CommandUtils = require('../../../utils/CommandUtils');
const NodeTranslationService = require('../../../services/NodeTranslationService');
const FileSystemService = require('../../../services/FileSystemService');
const BaseInputHandler = require('../../base/BaseInputHandler');
const {
COMMAND_UPDATE: { ERRORS, QUESTIONS, MESSAGES },
YES,
NO,
} = require('../../../services/TranslationKeys');
const { validateArrayIsNotEmpty, validateScriptId, showValidationResults } = require('../../../validation/InteractiveAnswersValidator');
const { FOLDERS } = require('../../../ApplicationConstants');
const ANSWERS_NAMES = {
FILTER_BY_SCRIPT_ID: 'filterByScriptId',
INCLUDE_CUSTOM_INSTANCES: 'includeinstances',
OVERWRITE_OBJECTS: 'overwriteObjects',
SCRIPT_ID_LIST: 'scriptid',
SCRIPT_ID_FILTER: 'scriptIdFilter',
};
const COMMAND_OPTIONS = {
AUTH_ID: 'authid',
INCLUDE_CUSTOM_INSTANCES: 'includeinstances',
PROJECT: 'project',
SCRIPT_ID: 'scriptid',
};
const CUSTOM_RECORD_PREFIX = 'customrecord';
const MAX_ENTRIES_BEFORE_FILTER = 30;
const XML_EXTENSION = '.xml';
module.exports = class UpdateInputHandler extends BaseInputHandler {
constructor(options) {
super(options);
this._fileSystemService = new FileSystemService();
}
async getParameters(params) {
const foundXMLFiles = this._searchFilesFromObjectsFolder();
let filteredObjectsList = await this._getObjectsToSelect(foundXMLFiles);
const selectedScriptIds = await this._getSelectedScriptIds(filteredObjectsList);
const customRecordsAndSegments = selectedScriptIds.filter((scriptid) => scriptid.startsWith(CUSTOM_RECORD_PREFIX));
const includeCustomInstances = await this._includeCustomInstancesQuestion(customRecordsAndSegments);
const overwriteObjects = await this._overwriteQuestion(includeCustomInstances);
return {
[ANSWERS_NAMES.OVERWRITE_OBJECTS]: overwriteObjects,
[COMMAND_OPTIONS.SCRIPT_ID]: selectedScriptIds,
[COMMAND_OPTIONS.INCLUDE_CUSTOM_INSTANCES]: includeCustomInstances,
};
}
_searchFilesFromObjectsFolder() {
const pathToObjectsFolder = path.join(this._projectFolder, FOLDERS.OBJECTS);
const filesInObjectsFolder = this._fileSystemService.getFilesFromDirectory(pathToObjectsFolder);
const foundXMLFiles = filesInObjectsFolder
.filter((filename) => filename.endsWith(XML_EXTENSION))
.map((file) => ({
name: file.replace(this._projectFolder, '').slice(0, -XML_EXTENSION.length),
value: path.basename(file, XML_EXTENSION),
}));
if (foundXMLFiles.length === 0) {
throw NodeTranslationService.getMessage(ERRORS.NO_OBJECTS_IN_PROJECT);
}
return foundXMLFiles;
}
async _getObjectsToSelect(foundXMLFiles) {
if (foundXMLFiles.length > MAX_ENTRIES_BEFORE_FILTER) {
const filteredObjects = await this._filterObjectsByScriptId(foundXMLFiles);
if (filteredObjects.length === 0) {
throw NodeTranslationService.getMessage(MESSAGES.NO_OBJECTS_WITH_SCRIPT_ID_FILTER);
}
return filteredObjects;
} else {
return foundXMLFiles;
}
}
async _filterObjectsByScriptId(foundXMLFiles) {
const filterAnswers = await this._questionFilterByScriptId();
const filteredObjects = filterAnswers[ANSWERS_NAMES.FILTER_BY_SCRIPT_ID]
? foundXMLFiles.filter((element) => element.value.includes(filterAnswers[ANSWERS_NAMES.SCRIPT_ID_FILTER]))
: foundXMLFiles;
return filteredObjects;
}
async _getSelectedScriptIds(filteredObjects) {
filteredObjects.push(new Separator());
const selectObjectsToUpdateQuestion = {
type: CommandUtils.INQUIRER_TYPES.CHECKBOX,
name: ANSWERS_NAMES.SCRIPT_ID_LIST,
message: NodeTranslationService.getMessage(QUESTIONS.SCRIPT_ID),
default: 1,
choices: filteredObjects,
validate: (fieldValue) => showValidationResults(fieldValue, validateArrayIsNotEmpty),
};
const answers = await prompt([selectObjectsToUpdateQuestion]);
return answers[ANSWERS_NAMES.SCRIPT_ID_LIST];
}
async _questionFilterByScriptId() {
return await prompt([
{
type: CommandUtils.INQUIRER_TYPES.LIST,
name: ANSWERS_NAMES.FILTER_BY_SCRIPT_ID,
message: NodeTranslationService.getMessage(QUESTIONS.FILTER_BY_SCRIPT_ID),
default: false,
choices: [
{ name: NodeTranslationService.getMessage(YES), value: true },
{ name: NodeTranslationService.getMessage(NO), value: false },
],
},
{
when: (response) => {
return response[ANSWERS_NAMES.FILTER_BY_SCRIPT_ID];
},
type: CommandUtils.INQUIRER_TYPES.INPUT,
name: ANSWERS_NAMES.SCRIPT_ID_FILTER,
message: NodeTranslationService.getMessage(QUESTIONS.SCRIPT_ID_FILTER),
validate: (fieldValue) => showValidationResults(fieldValue, validateScriptId),
},
]);
}
async _includeCustomInstancesQuestion(customRecordsAndSegments) {
const includeCustomInstancesQuestions = {
when: customRecordsAndSegments.length >= 1,
type: CommandUtils.INQUIRER_TYPES.LIST,
name: ANSWERS_NAMES.INCLUDE_CUSTOM_INSTANCES,
message: NodeTranslationService.getMessage(QUESTIONS.INCLUDE_CUSTOM_INSTANCES),
default: false,
choices: [
{ name: NodeTranslationService.getMessage(YES), value: true },
{ name: NodeTranslationService.getMessage(NO), value: false },
],
};
const answer = await prompt([includeCustomInstancesQuestions]);
return answer[ANSWERS_NAMES.INCLUDE_CUSTOM_INSTANCES];
}
async _overwriteQuestion(includeCustomInstances) {
const message = includeCustomInstances
? NodeTranslationService.getMessage(QUESTIONS.OVERWRITE_OBJECTS_WITH_CUSTOM_INSTANCES)
: NodeTranslationService.getMessage(QUESTIONS.OVERWRITE_OBJECTS);
const overwriteObjectsQuestion = {
type: CommandUtils.INQUIRER_TYPES.LIST,
name: ANSWERS_NAMES.OVERWRITE_OBJECTS,
message: message,
default: 0,
choices: [
{ name: NodeTranslationService.getMessage(YES), value: true },
{ name: NodeTranslationService.getMessage(NO), value: false },
],
};
const answers = await prompt([overwriteObjectsQuestion]);
return answers[ANSWERS_NAMES.OVERWRITE_OBJECTS];
}
};