sls-helper-plugin-janis
Version:
A Serverless Helper plugin to add custom helpers for Janis Commerce
114 lines (89 loc) • 3.22 kB
JavaScript
;
const logger = require('lllog')();
const { kebabCase, titleCase } = require('../utils/string');
const validateAuthorizer = require('../utils/validate-authorizer');
const { parseFunctionLayers } = require('../utils/parse-function-layers');
const { removeTraceLayerEnv } = require('../utils/trace-layer');
const INTEGRATION = 'lambda';
const eventListener = ({
serviceName,
entityName,
eventName,
mustHaveClient,
listenersDirName,
layers,
addLayers,
skipTraceLayer,
package: pkg,
authorizer,
timeout,
functionRawProps
}, serviceConfig) => {
const serviceNameAsTitle = titleCase(serviceName);
const serviceAsKebab = kebabCase(serviceName);
const entityNameAsTitle = titleCase(entityName);
const entityNameAsKebab = kebabCase(entityName);
const eventNameAsTitle = titleCase(eventName);
const eventNameAsKebab = kebabCase(eventName);
const authorizerName = authorizer || (mustHaveClient ? 'ServiceAuthorizer' : 'ServiceNoClientAuthorizer');
validateAuthorizer(serviceConfig, authorizerName);
const listenerCode = `${serviceNameAsTitle}${entityNameAsTitle}${eventNameAsTitle}`.replace(/ /g, '');
const functionConfiguration = {
name: `EL-\${self:custom.serviceName}-${listenerCode}-\${self:custom.stage}`,
handler: `src/${listenersDirName}/${serviceAsKebab}/${entityNameAsKebab}/${eventNameAsKebab}.handler`,
description: `${serviceNameAsTitle} ${entityNameAsTitle} ${eventNameAsTitle} Listener`,
events: [
{
http: {
integration: INTEGRATION,
path: `/listener/${serviceAsKebab}/${entityNameAsKebab}/${eventNameAsKebab}`,
method: 'post',
authorizer: `\${self:custom.authorizers.${authorizerName}}`,
request: {
template: '${self:custom.apiRequestTemplate}'
},
response: '${self:custom.apiResponseTemplate}'
}
}
],
...parseFunctionLayers(layers, addLayers, skipTraceLayer, serviceConfig),
...functionRawProps,
...removeTraceLayerEnv(skipTraceLayer, functionRawProps?.environment)
};
if(pkg && pkg.include)
functionConfiguration.package = pkg;
if(timeout)
functionConfiguration.timeout = timeout;
return {
[`EL-${listenerCode}`]: functionConfiguration
};
};
const defaultParams = {
mustHaveClient: false,
listenersDirName: 'event-listeners'
};
module.exports = ({ functions, ...serviceConfig }, hookParams) => {
const params = {
...defaultParams,
...hookParams
};
if(!params.serviceName)
throw new Error('Missing or empty serviceName in janis.eventListener hook.');
if(!params.entityName)
throw new Error('Missing or empty entityName in janis.eventListener hook.');
if(!params.eventName)
throw new Error('Missing or empty eventName in janis.eventListener hook.');
/* istanbul ignore next */
if(!serviceConfig.custom || !serviceConfig.custom.apiRequestTemplate)
logger.warn('Missing custom.apiRequestTemplate property. Add janis.templates hook first.');
/* istanbul ignore next */
if(!serviceConfig.custom || !serviceConfig.custom.apiResponseTemplate)
logger.warn('Missing custom.apiResponseTemplate property. Add janis.templates hook first.');
return {
...serviceConfig,
functions: [
...(functions || []),
eventListener(params, serviceConfig)
]
};
};