in source/services/tasks/tasks.ts [717:831]
async buildTaskItem(task: TaskInfo, taskId?: string): Promise<TaskReturn | ErrorReturn> {
try {
let item = {
taskId: taskId ? taskId : uuid.v4(),
name: task.name,
description: task.description,
targetTag: task.targetTag,
accounts: COMMON_UTIL.trimStringInArray(task.accounts.split(',')),
regions: COMMON_UTIL.trimStringInArray(task.regions.split(',')),
actionName: task.actionName,
triggerType: task.triggerType,
enabled: task.enabled !== undefined ? task.enabled : true
};
// Checks regions
let regions = await this.getAwsRegions() as string[];
for (let region of item['regions']) {
if (regions.indexOf(region) < 0) {
return Promise.reject(
COMMON_UTIL.getErrorObject('BuildTaskItemFailure', 400, `Invalid region: ${region}`)
);
}
}
// Checks accounts
for (let account of item['accounts']) {
if (!/^\d{12}$/.test(account)) {
return Promise.reject(
COMMON_UTIL.getErrorObject('BuildTaskItemFailure', 400, `Invalid account, account should be 12 digit number: ${account}`)
);
}
}
// Checks and create trigger type
if (task.triggerType === TriggerType.Schedule) {
item['scheduledType'] = task.scheduledType;
if (task.scheduledType === ScheduledType.CronExpression) {
if (task.scheduledCronExpression === undefined) {
return Promise.reject(
COMMON_UTIL.getErrorObject('BuildTaskItemFailure', 400, 'Missing key/value: scheduledCronExpression')
);
}
item['scheduledCronExpression'] = task.scheduledCronExpression;
} else if (task.scheduledType === ScheduledType.FixedRate) {
if (task.scheduledFixedRateInterval === undefined) {
return Promise.reject(
COMMON_UTIL.getErrorObject('BuildTaskItemFailure', 400, 'Missing key/value: scheduledFixedRateInterval')
);
} else if (task.scheduledFixedRateType === undefined) {
return Promise.reject(
COMMON_UTIL.getErrorObject('BuildTaskItemFailure', 400, 'Missing key/value: scheduledFixedRateType')
);
}
// Checks if the rate interval is valid
if (!/^[1-9]\d*$/.test(task.scheduledFixedRateInterval)) {
return Promise.reject(
COMMON_UTIL.getErrorObject('BuildTaskItemFailure', 400, 'Invalid interval (1 <= interval, integer).')
);
}
item['scheduledFixedRateInterval'] = +task.scheduledFixedRateInterval;
// Checks if the rate type is valid
if (!Object.values(ScheduledFixedRateType).includes(task.scheduledFixedRateType)) {
return Promise.reject(
COMMON_UTIL.getErrorObject('BuildTaskItemFailure', 400, `Invalid rate type: ${task.scheduledFixedRateType}.`)
);
}
// If the interval is 1, remove 's' from the rate type if it has at the end
item['scheduledFixedRateType'] =
+task.scheduledFixedRateInterval === 1 && task.scheduledFixedRateType.endsWith('s') ?
task.scheduledFixedRateType.slice(0, -1) :
task.scheduledFixedRateType
} else {
// This can happen if a user calls API directly with invalid value.
return Promise.reject(
COMMON_UTIL.getErrorObject('BuildTaskItemFailure', 400, `Invalid schedule type: ${task.scheduledType}`)
);
}
} else if (task.triggerType === TriggerType.Event) {
if (task.eventPattern === undefined) {
return Promise.reject(
COMMON_UTIL.getErrorObject('BuildTaskItemFailure', 400, 'Missing key/value: eventPattern')
)
}
// Checks if eventPattern is valid JSON
try {
LOGGER.info(`eventPattern: ${task.eventPattern}`);
JSON.parse(task.eventPattern);
} catch (error) {
return Promise.reject(
COMMON_UTIL.getErrorObject('BuildTaskItemFailure', 400, `Invalid eventPattern: ${error.message}`)
)
}
item['eventPattern'] = task.eventPattern;
} else {
// This can happen if a user calls API directly with invalid value.
return Promise.reject(
COMMON_UTIL.getErrorObject('BuildTaskItemFailure', 400, `Invalid trigger type: ${task.triggerType}`)
);
}
let taskParameters = await this.checkParameterValue(task.taskParameters);
item['taskParameters'] = taskParameters;
return Promise.resolve(item);
} catch (error) {
LOGGER.error(`buildTaskItem Error: ${JSON.stringify(error)}`);
return Promise.reject(
COMMON_UTIL.getErrorObject('BuildTaskItemFailure', 400, `Error occurred while building a task item.`, error)
);
}
}