async function serviceQuestions()

in provider-utils/awscloudformation/service-walkthroughs/livestream-push.js [11:368]


async function serviceQuestions(context, options, defaultValuesFilename, resourceName) {
  const { amplify } = context;
  const defaultLocation = path.resolve(`${__dirname}/../default-values/${defaultValuesFilename}`);
  let resource = {};
  const targetDir = amplify.pathManager.getBackendDirPath();
  let advancedAnswers = {};
  let mediaLiveAnswers = {};
  let mediaPackageAnswers;
  let cloudFrontAnswers = {};
  const props = {};
  let defaults = {};
  defaults = JSON.parse(fs.readFileSync(`${defaultLocation}`));
  defaults.resourceName = 'mylivestream';

  // TODO: find a way to use default in new question files
  try {
    const oldValues = JSON.parse(fs.readFileSync(`${targetDir}/video/${resourceName}/props.json`));
    Object.assign(defaults, oldValues);
  } catch (err) {
    // Do nothing
  }

  const { payload } = context.parameters.options;
  const args = payload ? JSON.parse(payload) : {};

  // question dictionaries taken by inquirer
  // project name
  const nameProject = [
    {
      type: question.resourceName.type,
      name: question.resourceName.key,
      message: question.resourceName.question,
      validate: amplify.inputValidation(question.resourceName),
      default: defaults.resourceName,
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.resourceName.key,
          value: args.resourceName ? args.resourceName : defaults.resourceName,
        });
      },
    }];

  // prompt for advanced options
  const advanced = [
    {
      type: question.advancedChoice.type,
      name: question.advancedChoice.key,
      message: question.advancedChoice.question,
      default: defaults.advanced[question.advancedChoice.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.advancedChoice.key,
          value: defaults.advanced[question.advancedChoice.key],
        });
      },
    },
  ];

  // advanced options (currently only segmentation settings)
  const advancedQuestions = [
    {
      type: question.gopSize.type,
      name: question.gopSize.key,
      message: question.gopSize.question,
      validate: amplify.inputValidation(question.gopSize),
      default: defaults.advanced[question.gopSize.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.gopSize.key,
          value: defaults.advanced[question.gopSize.key],
        });
      },
    },
    {
      type: question.gopPerSegment.type,
      name: question.gopPerSegment.key,
      message: question.gopPerSegment.question,
      validate: amplify.inputValidation(question.gopPerSegment),
      default: defaults.advanced[question.gopPerSegment.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.gopPerSegment.key,
          value: defaults.advanced[question.gopPerSegment.key],
        });
      },
    },
    {
      type: question.segsPerPlist.type,
      name: question.segsPerPlist.key,
      message: question.segsPerPlist.question,
      validate: amplify.inputValidation(question.segsPerPlist),
      default: defaults.advanced[question.segsPerPlist.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.segsPerPlist.key,
          value: defaults.advanced[question.segsPerPlist.key],
        });
      },
    },
  ];

  const mediaLiveQuestions = [
    {
      type: question.securityGroup.type,
      name: question.securityGroup.key,
      message: question.securityGroup.question,
      validate: amplify.inputValidation(question.securityGroup),
      default: defaults.mediaLive[question.securityGroup.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.securityGroup.key,
          value: defaults.mediaLive[question.securityGroup.key],
        });
      },
    },
    {
      type: question.ingestType.type,
      name: question.ingestType.key,
      message: question.ingestType.question,
      choices: question.ingestType.options,
      default: defaults.mediaLive[question.ingestType.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.ingestType.key,
          value: defaults.mediaLive[question.ingestType.key],
        });
      },
    },
    {
      type: question.encodingProfile.type,
      name: question.encodingProfile.key,
      message: question.encodingProfile.question,
      choices: question.encodingProfile.options,
      default: defaults.mediaLive[question.encodingProfile.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.encodingProfile.key,
          value: defaults.mediaLive[question.encodingProfile.key],
        });
      },
    },
    {
      type: question.autoStart.type,
      name: question.autoStart.key,
      message: question.autoStart.question,
      choices: question.autoStart.options,
      default: defaults.mediaLive[question.autoStart.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.autoStart.key,
          value: defaults.mediaLive[question.autoStart.key],
        });
      },
    },
  ];

  const mp4Questions = [
    {
      type: question.mp4URL.type,
      name: question.mp4URL.key,
      message: question.mp4URL.question,
      default: defaults.advanced[question.mp4URL.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.mp4URL.key,
          value: defaults.advanced[question.mp4URL.key],
        });
      },
    },
  ];

  const mediaPackageQuestions = [
    {
      type: question.endpoints.type,
      name: question.endpoints.key,
      message: question.endpoints.question,
      choices: question.endpoints.options,
      default: defaults.mediaPackage[question.endpoints.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.endpoints.key,
          value: defaults.mediaPackage[question.endpoints.key],
        });
      },
    },
    {
      type: question.startOverWindow.type,
      name: question.startOverWindow.key,
      message: question.startOverWindow.question,
      validate: amplify.inputValidation(question.startOverWindow),
      default: defaults.mediaPackage[question.startOverWindow.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.startOverWindow.key,
          value: defaults.mediaPackage[question.startOverWindow.key],
        });
      },
    },
  ];

  const mediaStorage = [
    {
      type: question.storageType.type,
      name: question.storageType.key,
      message: question.storageType.question,
      choices: question.storageType.options,
      default: defaults.mediaStorage[question.storageType.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.storageType.key,
          value: defaults.mediaStorage[question.storageType.key],
        });
      },
    },
  ];

  const cloudFrontEnable = [
    {
      type: question.enableDistribution.type,
      name: question.enableDistribution.key,
      message: question.enableDistribution.question,
      choices: question.enableDistribution.options,
      default: defaults.cloudFront[question.enableDistribution.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.enableDistribution.key,
          value: defaults.cloudFront[question.enableDistribution.key],
        });
      },
    },
  ];

  const cloudFrontQuestions = [
    {
      type: question.priceClass.type,
      name: question.priceClass.key,
      message: question.priceClass.question,
      choices: question.priceClass.options,
      default: defaults.cloudFront[question.priceClass.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.priceClass.key,
          value: defaults.cloudFront[question.priceClass.key],
        });
      },
    },
    {
      type: question.sBucketLogs.type,
      name: question.sBucketLogs.key,
      message: question.sBucketLogs.question,
      validate: amplify.inputValidation(question.sBucketLogs),
      default: defaults.cloudFront[question.sBucketLogs.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.sBucketLogs.key,
          value: defaults.cloudFront[question.sBucketLogs.key],
        });
      },
    },
    {
      type: question.sLogPrefix.type,
      name: question.sLogPrefix.key,
      message: question.sLogPrefix.question,
      validate: amplify.inputValidation(question.sLogPrefix),
      default: defaults.cloudFront[question.sLogPrefix.key],
      when(answers) {
        return headlessMode.autoAnswer({
          context,
          answers,
          key: question.sLogPrefix.key,
          value: defaults.cloudFront[question.sLogPrefix.key],
        });
      },
    },
  ];
  if (resourceName) {
    resource.resourceName = resourceName;
  } else {
    resource = await inquirer.prompt(nameProject);
  }

  // main question control flow
  const answers = {};

  answers.resourceName = resource.resourceName;

  const advancedEnable = await inquirer.prompt(advanced);
  if (advancedEnable.advancedChoice === false) {
    advancedAnswers.gopSize = '1';
    advancedAnswers.gopPerSegment = '2';
    advancedAnswers.segsPerPlist = '3';
    advancedAnswers.advancedChoice = false;
  } else {
    advancedAnswers = await inquirer.prompt(advancedQuestions);
    advancedAnswers.advancedChoice = true;
  }

  mediaLiveAnswers = await inquirer.prompt(mediaLiveQuestions);
  if (mediaLiveAnswers.ingestType === 'MP4_FILE') {
    const mp4Answers = await inquirer.prompt(mp4Questions);
    mediaLiveAnswers.mp4URL = mp4Answers.mp4URL;
  }
  const mediaStorageAnswers = await inquirer.prompt(mediaStorage);
  if (mediaStorageAnswers.storageType === 'mPackageStore' || mediaStorageAnswers.storageType === 'mPackage') {
    mediaPackageAnswers = await inquirer.prompt(mediaPackageQuestions);
    props.mediaPackage = mediaPackageAnswers;
    // TODO change this to choice prompt
    const cloudfrontenable = await inquirer.prompt(cloudFrontEnable);
    if (cloudfrontenable.enableDistribution === 'YES') {
      cloudFrontAnswers = await inquirer.prompt(cloudFrontQuestions);
    }
    cloudFrontAnswers.enableDistribution = cloudfrontenable.enableDistribution;
  } else {
    cloudFrontAnswers.enableDistribution = 'NO';
  }

  // export stored answers
  props.shared = answers;
  props.advanced = advancedAnswers;
  props.mediaLive = mediaLiveAnswers;
  props.mediaPackage = mediaPackageAnswers;
  props.mediaStorage = mediaStorageAnswers;
  props.cloudFront = cloudFrontAnswers;

  return props;
}