From 75f5ace173a6b36b943e2110845e411a2cce5d6d Mon Sep 17 00:00:00 2001 From: Attila Hajdrik Date: Mon, 25 Jan 2021 16:57:21 -0800 Subject: [PATCH] fix: #6397 - auth update overwrite parameters (#6403) --- .../utils/trigger-flow-auth-helper.js | 24 ++++++++++--------- .../provider-utils/awscloudformation/index.ts | 14 ++++++++--- .../awscloudformation/utils/storeResources.ts | 2 +- .../amplify-helpers/trigger-flow.ts | 6 ----- 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/packages/amplify-category-auth/src/provider-utils/awscloudformation/utils/trigger-flow-auth-helper.js b/packages/amplify-category-auth/src/provider-utils/awscloudformation/utils/trigger-flow-auth-helper.js index 03c61c558e6..adad81f56e2 100644 --- a/packages/amplify-category-auth/src/provider-utils/awscloudformation/utils/trigger-flow-auth-helper.js +++ b/packages/amplify-category-auth/src/provider-utils/awscloudformation/utils/trigger-flow-auth-helper.js @@ -29,13 +29,6 @@ async function handleTriggers(context, coreAnswers, previouslySaved) { triggerEnvs[r] = context.amplify.getTriggerEnvVariables(context, { key: r, modules: triggers[r] }, 'auth'); }); - const parameters = { - authResourceName, - triggerEnvs, - parentStack: { Ref: 'AWS::StackId' }, - triggers, - }; - // creating array of trigger names const keys = Object.keys(triggers); @@ -46,9 +39,12 @@ async function handleTriggers(context, coreAnswers, previouslySaved) { for (let t = 0; t < keys.length; t += 1) { const functionName = `${authResourceName}${keys[t]}`; const targetPath = `${targetDir}/function/${functionName}/src`; + if (previouslySaved && previouslySaved[keys[t]]) { const currentEnvVariables = context.amplify.loadEnvResourceParameters(context, 'function', functionName); - await triggerEnvParams(context, keys[t], values[t], functionName, currentEnvVariables); + + await saveTriggerEnvParamsToTeamProviderInfo(context, keys[t], values[t], functionName, currentEnvVariables); + const triggerOptions = { key: keys[t], values: values[t], @@ -65,10 +61,13 @@ async function handleTriggers(context, coreAnswers, previouslySaved) { parentResource: authResourceName, skipEdit: true, }; + const updatedLambda = await context.amplify.updateTrigger(triggerOptions); + triggerKeyValues = Object.assign(triggerKeyValues, updatedLambda); } else { - await triggerEnvParams(context, keys[t], values[t], functionName); + await saveTriggerEnvParamsToTeamProviderInfo(context, keys[t], values[t], functionName); + const triggerOptions = { key: keys[t], values: values[t], @@ -79,11 +78,14 @@ async function handleTriggers(context, coreAnswers, previouslySaved) { parentStack: 'auth', targetPath, triggerTemplate: `${keys[t]}.json.ejs`, + triggerEventPath: `${keys[t]}.event.json`, triggerDir: path.join(triggerAssetRoot, keys[t]), parentResource: authResourceName, skipEdit: true, }; + const newLambda = await context.amplify.addTrigger(triggerOptions); + triggerKeyValues = Object.assign(triggerKeyValues, newLambda); } } @@ -99,11 +101,11 @@ async function handleTriggers(context, coreAnswers, previouslySaved) { coreAnswers.parentStack = { Ref: 'AWS::StackId' }; } - return parameters.triggers; + return triggers; } // saving input-based trigger env variables to the team-provider -const triggerEnvParams = async (context, key, value, functionName, currentEnvVars) => { +const saveTriggerEnvParamsToTeamProviderInfo = async (context, key, value, functionName, currentEnvVars) => { const envs = await context.amplify.getTriggerEnvInputs(context, path.join(triggerAssetRoot, key), key, value, currentEnvVars); context.amplify.saveEnvResourceParameters(context, 'function', functionName, envs); }; diff --git a/packages/amplify-category-function/src/provider-utils/awscloudformation/index.ts b/packages/amplify-category-function/src/provider-utils/awscloudformation/index.ts index a05f0b8caaa..db1f06446ae 100644 --- a/packages/amplify-category-function/src/provider-utils/awscloudformation/index.ts +++ b/packages/amplify-category-function/src/provider-utils/awscloudformation/index.ts @@ -2,7 +2,7 @@ import { FunctionParameters, FunctionTriggerParameters, FunctionTemplate, Provid import { isMultiEnvLayer, LayerParameters, StoredLayerParameters } from './utils/layerParams'; import { chooseParamsOnEnvInit } from './utils/layerHelpers'; import { supportedServices } from '../supported-services'; -import { ServiceName, provider, parametersFileName } from './utils/constants'; +import { ServiceName, provider, parametersFileName, functionParametersFileName } from './utils/constants'; import { category as categoryName } from '../../constants'; import { createFunctionResources, @@ -19,6 +19,7 @@ import fs from 'fs-extra'; import path from 'path'; import open from 'open'; import { IsMockableResponse } from '../..'; +import { JSONUtilities } from 'amplify-cli-core'; /** * Entry point for creating a new function @@ -198,7 +199,7 @@ export async function updateFunctionResource(context, category, service, paramet context.amplify.pathManager.getBackendDirPath(), categoryName, resourceToUpdate, - parametersFileName, + functionParametersFileName, ); let previousParameters; @@ -206,10 +207,16 @@ export async function updateFunctionResource(context, category, service, paramet previousParameters = context.amplify.readJsonFile(parametersFilePath); if ('trigger' in previousParameters) { - parameters = _.assign(parameters, previousParameters); + parameters = _.assign({}, previousParameters, parameters); + + if (parameters.triggerEnvs && parameters.triggerEnvs instanceof String) { + parameters.triggerEnvs = JSONUtilities.parse(parameters.triggerEnvs) || []; + } } } + saveMutableState(parameters); + saveCFNParameters(parameters); } else { parameters = await serviceConfig.walkthroughs.updateWalkthrough(context, parameters, resourceToUpdate); if (parameters.dependsOn) { @@ -340,6 +347,7 @@ export async function updateConfigOnEnvInit(context: any, resourceName: string, if (resourceParams.trigger === true) { envParams = await initTriggerEnvs(context, resourceParams, providerPlugin, envParams, srvcMetaData); } + return envParams; } else if (isMultiEnvLayer(context, resourceName) && service === ServiceName.LambdaLayer) { const teamProviderParams: StoredLayerParameters = await chooseParamsOnEnvInit(context, resourceName); diff --git a/packages/amplify-category-function/src/provider-utils/awscloudformation/utils/storeResources.ts b/packages/amplify-category-function/src/provider-utils/awscloudformation/utils/storeResources.ts index 66d6495ef06..0bcabde2919 100644 --- a/packages/amplify-category-function/src/provider-utils/awscloudformation/utils/storeResources.ts +++ b/packages/amplify-category-function/src/provider-utils/awscloudformation/utils/storeResources.ts @@ -127,7 +127,7 @@ function copyTemplateFiles(context: $TSContext, parameters: FunctionParameters | let templateParams: $TSAny = parameters; if ('trigger' in parameters) { let triggerEnvs = context.amplify.loadEnvResourceParameters(context, 'function', parameters.resourceName); - parameters.triggerEnvs = JSON.parse(parameters.triggerEnvs) || []; + parameters.triggerEnvs = JSONUtilities.parse(parameters.triggerEnvs) || []; parameters.triggerEnvs.forEach(c => { triggerEnvs[c.key] = c.value; diff --git a/packages/amplify-cli/src/extensions/amplify-helpers/trigger-flow.ts b/packages/amplify-cli/src/extensions/amplify-helpers/trigger-flow.ts index 0d890071bff..cc215b81927 100644 --- a/packages/amplify-cli/src/extensions/amplify-helpers/trigger-flow.ts +++ b/packages/amplify-cli/src/extensions/amplify-helpers/trigger-flow.ts @@ -151,12 +151,6 @@ export const updateTrigger = async triggerOptions => { for (let v = 0; v < values.length; v += 1) { await copyFunctions(key, values[v], category, context, targetPath); } - const projectBackendDirPath = context.amplify.pathManager.getBackendDirPath(); - const parametersPath = path.join(projectBackendDirPath, 'function', functionName); - const dirContents = fs.readdirSync(parametersPath); - if (dirContents.includes('parameters.json')) { - JSONUtilities.writeJson(path.join(parametersPath, 'parameters.json'), { modules: values.join() }); - } await cleanFunctions(key, values, category, context, targetPath); }