quidproquo-deploy-awscdk 0.0.85 → 0.0.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/lib/constructs/basic/Function.js +5 -0
  2. package/lib/constructs/feature/webserver/api/QpqWebserverApiConstruct.js +21 -42
  3. package/lib/constructs/feature/webserver/index.d.ts +1 -0
  4. package/lib/constructs/feature/webserver/index.js +1 -0
  5. package/lib/constructs/feature/webserver/serviceFunction/QpqWebserverServiceFunctionConstruct.d.ts +11 -0
  6. package/lib/constructs/feature/webserver/serviceFunction/QpqWebserverServiceFunctionConstruct.js +50 -0
  7. package/lib/constructs/feature/webserver/serviceFunction/index.d.ts +1 -0
  8. package/lib/constructs/feature/webserver/serviceFunction/index.js +17 -0
  9. package/lib/lambdas/lambdaAPIGatewayEvent.js +1 -1
  10. package/lib/lambdas/lambdaEventBridgeEvent.js +1 -1
  11. package/lib/lambdas/lambdaEventOriginRequest.js +1 -1
  12. package/lib/lambdas/lambdaSQSEvent.js +1 -1
  13. package/lib/lambdas/lambdaServiceFunctionExecute.d.ts +6 -0
  14. package/lib/lambdas/lambdaServiceFunctionExecute.js +52 -0
  15. package/lib/stacks/ApiQpqServiceStack.js +7 -0
  16. package/lib/utils/qpqDeployAwsCdkUtils.js +4 -1
  17. package/package.json +1 -1
  18. package/src/constructs/basic/Function.ts +8 -0
  19. package/src/constructs/feature/webserver/api/QpqWebserverApiConstruct.ts +25 -50
  20. package/src/constructs/feature/webserver/index.ts +1 -0
  21. package/src/constructs/feature/webserver/serviceFunction/QpqWebserverServiceFunctionConstruct.ts +49 -0
  22. package/src/constructs/feature/webserver/serviceFunction/index.ts +1 -0
  23. package/src/lambdas/lambdaAPIGatewayEvent.ts +2 -0
  24. package/src/lambdas/lambdaEventBridgeEvent.ts +2 -0
  25. package/src/lambdas/lambdaEventOriginRequest.ts +2 -0
  26. package/src/lambdas/lambdaSQSEvent.ts +2 -0
  27. package/src/lambdas/lambdaServiceFunctionExecute.ts +98 -0
  28. package/src/stacks/ApiQpqServiceStack.ts +17 -0
  29. package/src/utils/qpqDeployAwsCdkUtils.ts +9 -1
@@ -64,6 +64,11 @@ class Function extends QpqConstructBlock_1.QpqConstructBlock {
64
64
  actions: ['sns:Publish'],
65
65
  resources: ['*'],
66
66
  }));
67
+ // Let lambdas publish sns messages.
68
+ this.lambdaFunction.addToRolePolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
69
+ actions: ['lambda:InvokeFunction'],
70
+ resources: ['arn:aws:lambda:*:*:function:*sfunc*'],
71
+ }));
67
72
  }
68
73
  }
69
74
  exports.Function = Function;
@@ -33,17 +33,6 @@ const qpqDeployAwsCdkUtils = __importStar(require("../../../../utils"));
33
33
  class QpqWebserverApiConstruct extends QpqConstructBlock_1.QpqConstructBlock {
34
34
  constructor(scope, id, props) {
35
35
  super(scope, id, props);
36
- // api.service.domain.com or api.domain.com
37
- const apexDomain = props.apiConfig.onRootDomain
38
- ? quidproquo_webserver_1.qpqWebServerUtils.getBaseDomainName(props.qpqConfig)
39
- : quidproquo_webserver_1.qpqWebServerUtils.getServiceDomainName(props.qpqConfig);
40
- // Create subdomain
41
- const subdomain = new SubdomainName_1.SubdomainName(this, 'subdomain', {
42
- apexDomain,
43
- subdomain: props.apiConfig.apiSubdomain,
44
- qpqConfig: props.qpqConfig,
45
- awsAccountId: props.awsAccountId,
46
- });
47
36
  // Build Function
48
37
  const func = new Function_1.Function(this, 'api-function', {
49
38
  buildPath: quidproquo_webserver_1.qpqWebServerUtils.getApiEntryFullPath(props.qpqConfig, props.apiConfig),
@@ -58,10 +47,6 @@ class QpqWebserverApiConstruct extends QpqConstructBlock_1.QpqConstructBlock {
58
47
  grantables.forEach((g) => {
59
48
  g.grantAll(func.lambdaFunction);
60
49
  });
61
- // const routes = qpqWebServerUtils.getAllRoutesForApi(props.apiConfig.apiName, props.qpqConfig);
62
- // const apiKeys = routes.reduce((acc, r) => {
63
- // return [...acc, ...(r.options.routeAuthSettings?.apiKeys || [])];
64
- // }, [] as ApiKey[]);
65
50
  // Create a rest api
66
51
  const api = new aws_cdk_lib_1.aws_apigateway.LambdaRestApi(this, 'lambda-rest-api', {
67
52
  restApiName: this.resourceName(`${props.apiConfig.apiName}-rest-api`),
@@ -72,34 +57,28 @@ class QpqWebserverApiConstruct extends QpqConstructBlock_1.QpqConstructBlock {
72
57
  },
73
58
  binaryMediaTypes: ['*/*'],
74
59
  proxy: true,
75
- // defaultMethodOptions: {
76
- // apiKeyRequired: apiKeys.length > 0,
77
- // },
78
- });
79
- // const usagePlan = api.addUsagePlan(this.qpqResourceName(props.apiConfig.apiName, 'usagePlan'), {
80
- // apiStages: [
81
- // {
82
- // api,
83
- // stage: api.deploymentStage,
84
- // },
85
- // ],
86
- // });
87
- // apiKeys.forEach((apiKey) => {
88
- // const name = `${props.apiConfig.apiName}-${apiKey.name}`;
89
- // const newApiKey = api.addApiKey(this.qpqResourceName(name, 'apiKey'), {
90
- // description: apiKey.description,
91
- // apiKeyName: this.resourceName(name),
92
- // value: apiKey.value,
93
- // });
94
- // // usagePlan.addApiKey(newApiKey);
95
- // });
96
- // Map all requests to this service to /serviceName/*
97
- new aws_cdk_lib_1.aws_apigateway.BasePathMapping(this, 'rest-bpm', {
98
- domainName: subdomain.domainName,
99
- restApi: api,
100
- // the properties below are optional
101
- // basePath: settings.service,
102
60
  });
61
+ // If we have not deprecated this api, then we need to create a subdomain for it
62
+ if (!props.apiConfig.deprecated) {
63
+ // api.service.domain.com or api.domain.com
64
+ const apexDomain = props.apiConfig.onRootDomain
65
+ ? quidproquo_webserver_1.qpqWebServerUtils.getBaseDomainName(props.qpqConfig)
66
+ : quidproquo_webserver_1.qpqWebServerUtils.getServiceDomainName(props.qpqConfig);
67
+ // Create subdomain
68
+ const subdomain = new SubdomainName_1.SubdomainName(this, 'subdomain', {
69
+ apexDomain,
70
+ subdomain: props.apiConfig.apiSubdomain,
71
+ qpqConfig: props.qpqConfig,
72
+ awsAccountId: props.awsAccountId,
73
+ });
74
+ // Map all requests to this service to /serviceName/*
75
+ new aws_cdk_lib_1.aws_apigateway.BasePathMapping(this, 'rest-bpm', {
76
+ domainName: subdomain.domainName,
77
+ restApi: api,
78
+ // the properties below are optional
79
+ // basePath: settings.service,
80
+ });
81
+ }
103
82
  }
104
83
  }
105
84
  exports.QpqWebserverApiConstruct = QpqWebserverApiConstruct;
@@ -2,4 +2,5 @@ export * from './api';
2
2
  export * from './apiKey';
3
3
  export * from './domain';
4
4
  export * from './redirect';
5
+ export * from './serviceFunction';
5
6
  export * from './webEntry';
@@ -18,4 +18,5 @@ __exportStar(require("./api"), exports);
18
18
  __exportStar(require("./apiKey"), exports);
19
19
  __exportStar(require("./domain"), exports);
20
20
  __exportStar(require("./redirect"), exports);
21
+ __exportStar(require("./serviceFunction"), exports);
21
22
  __exportStar(require("./webEntry"), exports);
@@ -0,0 +1,11 @@
1
+ import { aws_lambda } from 'aws-cdk-lib';
2
+ import { Construct } from 'constructs';
3
+ import { ServiceFunctionQPQWebServerConfigSetting } from 'quidproquo-webserver';
4
+ import { QpqConstructBlock, QpqConstructBlockProps } from '../../../base/QpqConstructBlock';
5
+ export interface QpqWebserverServiceFunctionConstructProps extends QpqConstructBlockProps {
6
+ serviceFunctionConfig: ServiceFunctionQPQWebServerConfigSetting;
7
+ apiLayerVersions?: aws_lambda.ILayerVersion[];
8
+ }
9
+ export declare class QpqWebserverServiceFunctionConstruct extends QpqConstructBlock {
10
+ constructor(scope: Construct, id: string, props: QpqWebserverServiceFunctionConstructProps);
11
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.QpqWebserverServiceFunctionConstruct = void 0;
27
+ const quidproquo_webserver_1 = require("quidproquo-webserver");
28
+ const QpqConstructBlock_1 = require("../../../base/QpqConstructBlock");
29
+ const Function_1 = require("../../../basic/Function");
30
+ const qpqDeployAwsCdkUtils = __importStar(require("../../../../utils"));
31
+ class QpqWebserverServiceFunctionConstruct extends QpqConstructBlock_1.QpqConstructBlock {
32
+ constructor(scope, id, props) {
33
+ super(scope, id, props);
34
+ // Build Function
35
+ const func = new Function_1.Function(this, 'api-function', {
36
+ buildPath: quidproquo_webserver_1.qpqWebServerUtils.getServiceFunctionFullPath(props.qpqConfig, props.serviceFunctionConfig),
37
+ functionName: this.resourceName(`${props.serviceFunctionConfig.functionName}-sfunc`),
38
+ functionType: 'lambdaServiceFunctionExecute',
39
+ executorName: 'executeServiceFunctionExecuteEvent',
40
+ qpqConfig: props.qpqConfig,
41
+ apiLayerVersions: props.apiLayerVersions,
42
+ awsAccountId: props.awsAccountId,
43
+ });
44
+ const grantables = qpqDeployAwsCdkUtils.getQqpGrantableResources(this, 'grantable', this.qpqConfig, props.awsAccountId);
45
+ grantables.forEach((g) => {
46
+ g.grantAll(func.lambdaFunction);
47
+ });
48
+ }
49
+ }
50
+ exports.QpqWebserverServiceFunctionConstruct = QpqWebserverServiceFunctionConstruct;
@@ -0,0 +1 @@
1
+ export * from './QpqWebserverServiceFunctionConstruct';
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./QpqWebserverServiceFunctionConstruct"), exports);
@@ -45,7 +45,7 @@ const getAPIGatewayEventExecutor = (dynamicModuleLoader, getCustomActionProcesso
45
45
  const cdkConfig = yield (0, lambdaConfig_1.getLambdaConfigs)();
46
46
  // Build a processor for the session and stuff
47
47
  // Remove the non route ones ~ let the story execute action add them
48
- const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getAPIGatewayEventActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
48
+ const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getAPIGatewayEventActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getServiceFunctionActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
49
49
  const logger = (result) => __awaiter(void 0, void 0, void 0, function* () {
50
50
  // addResult(
51
51
  // envConfig.appName,
@@ -30,7 +30,7 @@ const getEventBridgeEventExecutor = (dynamicModuleLoader, getCustomActionProcess
30
30
  const lambdaRuntimeConfig = JSON.parse(process.env.lambdaRuntimeConfig || '{}');
31
31
  // Build a processor for the session and stuff
32
32
  // Remove the non event ones
33
- const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getEventBridgeEventActionProcessor)(lambdaRuntimeConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
33
+ const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getEventBridgeEventActionProcessor)(lambdaRuntimeConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getServiceFunctionActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
34
34
  const logger = (result) => __awaiter(void 0, void 0, void 0, function* () { });
35
35
  // Run the callback
36
36
  const resolveStory = (0, quidproquo_core_1.createRuntime)({}, storyActionProcessor, getDateNow, logger, quidproquo_actionprocessor_awslambda_1.awsLambdaUtils.randomGuid);
@@ -30,7 +30,7 @@ const getOriginRequestEventExecutor = (dynamicModuleLoader, getCustomActionProce
30
30
  const cdkConfig = yield (0, lambdaConfig_1.getLambdaConfigs)();
31
31
  // Build a processor for the session and stuff
32
32
  // Remove the non route ones ~ let the story execute action add them
33
- const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getCloudFrontOriginRequestEventActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
33
+ const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getCloudFrontOriginRequestEventActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getServiceFunctionActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
34
34
  const logger = (result) => __awaiter(void 0, void 0, void 0, function* () { });
35
35
  // Run the callback
36
36
  const resolveStory = (0, quidproquo_core_1.createRuntime)({}, storyActionProcessor, getDateNow, logger, quidproquo_actionprocessor_awslambda_1.awsLambdaUtils.randomGuid);
@@ -28,7 +28,7 @@ const getStoryActionRuntime = (dynamicModuleLoader, getCustomActionProcessors =
28
28
  const cdkConfig = yield (0, lambdaConfig_1.getLambdaConfigs)();
29
29
  // Build a processor for the session and stuff
30
30
  // Remove the non route ones ~ let the story execute action add them
31
- const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getSQSEventRecordActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
31
+ const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getSQSEventRecordActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getServiceFunctionActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
32
32
  const logger = (result) => __awaiter(void 0, void 0, void 0, function* () { });
33
33
  // Run the callback
34
34
  const resolveStory = (0, quidproquo_core_1.createRuntime)({}, storyActionProcessor, getDateNow, logger, quidproquo_actionprocessor_awslambda_1.awsLambdaUtils.randomGuid);
@@ -0,0 +1,6 @@
1
+ import { ExecuteServiceFunctionEvent } from 'quidproquo-webserver';
2
+ import { DynamicModuleLoader } from 'quidproquo-actionprocessor-awslambda';
3
+ import { Context } from 'aws-lambda';
4
+ import { ActionProcessorListResolver } from './actionProcessorListResolver';
5
+ export declare const getServiceFunctionExecuteEventExecutor: (dynamicModuleLoader: DynamicModuleLoader, getCustomActionProcessors?: ActionProcessorListResolver) => (event: ExecuteServiceFunctionEvent<any>, context: Context) => Promise<import("quidproquo-core").StoryResult<any, any>>;
6
+ export declare const executeServiceFunctionExecuteEvent: (event: ExecuteServiceFunctionEvent<any>, context: Context) => Promise<import("quidproquo-core").StoryResult<any, any>>;
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.executeServiceFunctionExecuteEvent = exports.getServiceFunctionExecuteEventExecutor = void 0;
16
+ const quidproquo_actionprocessor_node_1 = require("quidproquo-actionprocessor-node");
17
+ const quidproquo_actionprocessor_awslambda_1 = require("quidproquo-actionprocessor-awslambda");
18
+ const quidproquo_actionprocessor_node_2 = require("quidproquo-actionprocessor-node");
19
+ const quidproquo_core_1 = require("quidproquo-core");
20
+ const lambdaConfig_1 = require("./lambdaConfig");
21
+ // @ts-ignore - Special webpack loader
22
+ const qpq_dynamic_loader_1 = __importDefault(require("qpq-dynamic-loader!"));
23
+ // @ts-ignore - Special webpack loader
24
+ const qpq_custom_action_processors_loader_1 = __importDefault(require("qpq-custom-action-processors-loader!"));
25
+ // TODO: Make this a util or something based on server time or something..
26
+ const getDateNow = () => new Date().toISOString();
27
+ const getServiceFunctionExecuteEventExecutor = (dynamicModuleLoader, getCustomActionProcessors = () => ({})) => {
28
+ return (event, context) => __awaiter(void 0, void 0, void 0, function* () {
29
+ const cdkConfig = yield (0, lambdaConfig_1.getLambdaConfigs)();
30
+ // Build a processor for the session and stuff
31
+ // Remove the non route ones ~ let the story execute action add them
32
+ const storyActionProcessor = Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({}, quidproquo_actionprocessor_node_1.coreActionProcessor), quidproquo_actionprocessor_node_1.webserverActionProcessor), (0, quidproquo_actionprocessor_awslambda_1.getServiceFunctionExecuteEventActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetSecretActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParameterActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getConfigGetParametersActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getSystemActionProcessor)(dynamicModuleLoader)), (0, quidproquo_actionprocessor_awslambda_1.getFileActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_node_2.getConfigActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getQueueActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getEventBusActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getUserDirectoryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getWebEntryActionProcessor)(cdkConfig.qpqConfig)), (0, quidproquo_actionprocessor_awslambda_1.getServiceFunctionActionProcessor)(cdkConfig.qpqConfig)), getCustomActionProcessors(cdkConfig.qpqConfig)), (0, qpq_custom_action_processors_loader_1.default)());
33
+ const logger = (result) => __awaiter(void 0, void 0, void 0, function* () {
34
+ // addResult(
35
+ // envConfig.appName,
36
+ // getDateNow(),
37
+ // doWeCarePath,
38
+ // "route-infrastructure",
39
+ // "infrastructure",
40
+ // "askRoute",
41
+ // result
42
+ // );
43
+ });
44
+ const resolveStory = (0, quidproquo_core_1.createRuntime)({}, storyActionProcessor, getDateNow, logger, quidproquo_actionprocessor_awslambda_1.awsLambdaUtils.randomGuid);
45
+ const result = yield resolveStory(quidproquo_core_1.askProcessEvent, [event, context]);
46
+ // just return the story result
47
+ return result;
48
+ });
49
+ };
50
+ exports.getServiceFunctionExecuteEventExecutor = getServiceFunctionExecuteEventExecutor;
51
+ // Default executor
52
+ exports.executeServiceFunctionExecuteEvent = (0, exports.getServiceFunctionExecuteEventExecutor)(qpq_dynamic_loader_1.default);
@@ -43,6 +43,13 @@ class ApiQpqServiceStack extends QpqServiceStack_1.QpqServiceStack {
43
43
  qpqConfig: props.qpqConfig,
44
44
  subdomainRedirectConfig: setting,
45
45
  }));
46
+ // Service Functions
47
+ const serviceFunctions = quidproquo_webserver_1.qpqWebServerUtils.getAllServiceFunctions(props.qpqConfig).map((setting) => new constructs_1.QpqWebserverServiceFunctionConstruct(this, quidproquo_core_1.qpqCoreUtils.getUniqueKeyForSetting(setting), {
48
+ awsAccountId: props.awsAccountId,
49
+ qpqConfig: props.qpqConfig,
50
+ serviceFunctionConfig: setting,
51
+ apiLayerVersions: layers.layers,
52
+ }));
46
53
  }
47
54
  }
48
55
  exports.ApiQpqServiceStack = ApiQpqServiceStack;
@@ -106,9 +106,12 @@ const serviceNeedsServiceHostedZone = (qpqConfig) => {
106
106
  const apiConfigs = quidproquo_core_1.qpqCoreUtils
107
107
  .getConfigSettings(qpqConfig, quidproquo_webserver_1.QPQWebServerConfigSettingType.Api)
108
108
  .filter((config) => !config.onRootDomain);
109
+ const webEntryConfigs = quidproquo_core_1.qpqCoreUtils
110
+ .getConfigSettings(qpqConfig, quidproquo_webserver_1.QPQWebServerConfigSettingType.WebEntry)
111
+ .filter((config) => !config.domain.onRootDomain);
109
112
  // // Or if we are deploying to a feature env ~ like joecoady
110
113
  // const hasFeatureName = !!qpqCoreUtils.getApplicationModuleFeature(qpqConfig);
111
- return apiConfigs.length > 0; // || hasFeatureName;
114
+ return apiConfigs.length > 0 || webEntryConfigs.length > 0; // || hasFeatureName;
112
115
  };
113
116
  exports.serviceNeedsServiceHostedZone = serviceNeedsServiceHostedZone;
114
117
  // Get resources that we can use to grant permissions to lambdas etc
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quidproquo-deploy-awscdk",
3
- "version": "0.0.85",
3
+ "version": "0.0.87",
4
4
  "description": "",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.js",
@@ -73,5 +73,13 @@ export class Function extends QpqConstructBlock {
73
73
  resources: ['*'],
74
74
  }),
75
75
  );
76
+
77
+ // Let lambdas publish sns messages.
78
+ this.lambdaFunction.addToRolePolicy(
79
+ new aws_iam.PolicyStatement({
80
+ actions: ['lambda:InvokeFunction'],
81
+ resources: ['arn:aws:lambda:*:*:function:*sfunc*'],
82
+ }),
83
+ );
76
84
  }
77
85
  }
@@ -19,20 +19,6 @@ export class QpqWebserverApiConstruct extends QpqConstructBlock {
19
19
  constructor(scope: Construct, id: string, props: QpqWebserverApiConstructProps) {
20
20
  super(scope, id, props);
21
21
 
22
- // api.service.domain.com or api.domain.com
23
- const apexDomain = props.apiConfig.onRootDomain
24
- ? qpqWebServerUtils.getBaseDomainName(props.qpqConfig)
25
- : qpqWebServerUtils.getServiceDomainName(props.qpqConfig);
26
-
27
- // Create subdomain
28
- const subdomain = new SubdomainName(this, 'subdomain', {
29
- apexDomain,
30
- subdomain: props.apiConfig.apiSubdomain,
31
- qpqConfig: props.qpqConfig,
32
-
33
- awsAccountId: props.awsAccountId,
34
- });
35
-
36
22
  // Build Function
37
23
  const func = new Function(this, 'api-function', {
38
24
  buildPath: qpqWebServerUtils.getApiEntryFullPath(props.qpqConfig, props.apiConfig),
@@ -59,11 +45,6 @@ export class QpqWebserverApiConstruct extends QpqConstructBlock {
59
45
  g.grantAll(func.lambdaFunction);
60
46
  });
61
47
 
62
- // const routes = qpqWebServerUtils.getAllRoutesForApi(props.apiConfig.apiName, props.qpqConfig);
63
- // const apiKeys = routes.reduce((acc, r) => {
64
- // return [...acc, ...(r.options.routeAuthSettings?.apiKeys || [])];
65
- // }, [] as ApiKey[]);
66
-
67
48
  // Create a rest api
68
49
  const api = new aws_apigateway.LambdaRestApi(this, 'lambda-rest-api', {
69
50
  restApiName: this.resourceName(`${props.apiConfig.apiName}-rest-api`),
@@ -74,38 +55,32 @@ export class QpqWebserverApiConstruct extends QpqConstructBlock {
74
55
  },
75
56
  binaryMediaTypes: ['*/*'],
76
57
  proxy: true,
77
- // defaultMethodOptions: {
78
- // apiKeyRequired: apiKeys.length > 0,
79
- // },
80
58
  });
81
59
 
82
- // const usagePlan = api.addUsagePlan(this.qpqResourceName(props.apiConfig.apiName, 'usagePlan'), {
83
- // apiStages: [
84
- // {
85
- // api,
86
- // stage: api.deploymentStage,
87
- // },
88
- // ],
89
- // });
90
-
91
- // apiKeys.forEach((apiKey) => {
92
- // const name = `${props.apiConfig.apiName}-${apiKey.name}`;
93
- // const newApiKey = api.addApiKey(this.qpqResourceName(name, 'apiKey'), {
94
- // description: apiKey.description,
95
- // apiKeyName: this.resourceName(name),
96
- // value: apiKey.value,
97
- // });
98
-
99
- // // usagePlan.addApiKey(newApiKey);
100
- // });
101
-
102
- // Map all requests to this service to /serviceName/*
103
- new aws_apigateway.BasePathMapping(this, 'rest-bpm', {
104
- domainName: subdomain.domainName,
105
- restApi: api,
106
-
107
- // the properties below are optional
108
- // basePath: settings.service,
109
- });
60
+ // If we have not deprecated this api, then we need to create a subdomain for it
61
+ if (!props.apiConfig.deprecated) {
62
+ // api.service.domain.com or api.domain.com
63
+ const apexDomain = props.apiConfig.onRootDomain
64
+ ? qpqWebServerUtils.getBaseDomainName(props.qpqConfig)
65
+ : qpqWebServerUtils.getServiceDomainName(props.qpqConfig);
66
+
67
+ // Create subdomain
68
+ const subdomain = new SubdomainName(this, 'subdomain', {
69
+ apexDomain,
70
+ subdomain: props.apiConfig.apiSubdomain,
71
+ qpqConfig: props.qpqConfig,
72
+
73
+ awsAccountId: props.awsAccountId,
74
+ });
75
+
76
+ // Map all requests to this service to /serviceName/*
77
+ new aws_apigateway.BasePathMapping(this, 'rest-bpm', {
78
+ domainName: subdomain.domainName,
79
+ restApi: api,
80
+
81
+ // the properties below are optional
82
+ // basePath: settings.service,
83
+ });
84
+ }
110
85
  }
111
86
  }
@@ -2,4 +2,5 @@ export * from './api';
2
2
  export * from './apiKey';
3
3
  export * from './domain';
4
4
  export * from './redirect';
5
+ export * from './serviceFunction';
5
6
  export * from './webEntry';
@@ -0,0 +1,49 @@
1
+ import { aws_apigateway, aws_lambda } from 'aws-cdk-lib';
2
+ import { Construct } from 'constructs';
3
+
4
+ import { ServiceFunctionQPQWebServerConfigSetting, qpqWebServerUtils } from 'quidproquo-webserver';
5
+
6
+ import { QpqConstructBlock, QpqConstructBlockProps } from '../../../base/QpqConstructBlock';
7
+
8
+ import { Function } from '../../../basic/Function';
9
+
10
+ import * as qpqDeployAwsCdkUtils from '../../../../utils';
11
+
12
+ export interface QpqWebserverServiceFunctionConstructProps extends QpqConstructBlockProps {
13
+ serviceFunctionConfig: ServiceFunctionQPQWebServerConfigSetting;
14
+ apiLayerVersions?: aws_lambda.ILayerVersion[];
15
+ }
16
+
17
+ export class QpqWebserverServiceFunctionConstruct extends QpqConstructBlock {
18
+ constructor(scope: Construct, id: string, props: QpqWebserverServiceFunctionConstructProps) {
19
+ super(scope, id, props);
20
+
21
+ // Build Function
22
+ const func = new Function(this, 'api-function', {
23
+ buildPath: qpqWebServerUtils.getServiceFunctionFullPath(
24
+ props.qpqConfig,
25
+ props.serviceFunctionConfig,
26
+ ),
27
+ functionName: this.resourceName(`${props.serviceFunctionConfig.functionName}-sfunc`),
28
+ functionType: 'lambdaServiceFunctionExecute',
29
+ executorName: 'executeServiceFunctionExecuteEvent',
30
+
31
+ qpqConfig: props.qpqConfig,
32
+
33
+ apiLayerVersions: props.apiLayerVersions,
34
+
35
+ awsAccountId: props.awsAccountId,
36
+ });
37
+
38
+ const grantables = qpqDeployAwsCdkUtils.getQqpGrantableResources(
39
+ this,
40
+ 'grantable',
41
+ this.qpqConfig,
42
+ props.awsAccountId,
43
+ );
44
+
45
+ grantables.forEach((g) => {
46
+ g.grantAll(func.lambdaFunction);
47
+ });
48
+ }
49
+ }
@@ -0,0 +1 @@
1
+ export * from './QpqWebserverServiceFunctionConstruct';
@@ -11,6 +11,7 @@ import {
11
11
  getConfigGetParametersActionProcessor,
12
12
  getUserDirectoryActionProcessor,
13
13
  getWebEntryActionProcessor,
14
+ getServiceFunctionActionProcessor,
14
15
  awsLambdaUtils,
15
16
  DynamicModuleLoader,
16
17
  } from 'quidproquo-actionprocessor-awslambda';
@@ -75,6 +76,7 @@ export const getAPIGatewayEventExecutor = (
75
76
  ...getEventBusActionProcessor(cdkConfig.qpqConfig),
76
77
  ...getUserDirectoryActionProcessor(cdkConfig.qpqConfig),
77
78
  ...getWebEntryActionProcessor(cdkConfig.qpqConfig),
79
+ ...getServiceFunctionActionProcessor(cdkConfig.qpqConfig),
78
80
 
79
81
  ...getCustomActionProcessors(cdkConfig.qpqConfig),
80
82
  ...qpqCustomActionProcessors(),
@@ -11,6 +11,7 @@ import {
11
11
  getConfigGetSecretActionProcessor,
12
12
  getConfigGetParameterActionProcessor,
13
13
  getConfigGetParametersActionProcessor,
14
+ getServiceFunctionActionProcessor,
14
15
  awsLambdaUtils,
15
16
  DynamicModuleLoader,
16
17
  LambdaRuntimeConfig,
@@ -61,6 +62,7 @@ export const getEventBridgeEventExecutor = (
61
62
  ...getQueueActionProcessor(cdkConfig.qpqConfig),
62
63
  ...getEventBusActionProcessor(cdkConfig.qpqConfig),
63
64
  ...getWebEntryActionProcessor(cdkConfig.qpqConfig),
65
+ ...getServiceFunctionActionProcessor(cdkConfig.qpqConfig),
64
66
  ...getUserDirectoryActionProcessor(cdkConfig.qpqConfig),
65
67
 
66
68
  ...getCustomActionProcessors(cdkConfig.qpqConfig),
@@ -9,6 +9,7 @@ import {
9
9
  getConfigGetParameterActionProcessor,
10
10
  getConfigGetParametersActionProcessor,
11
11
  getWebEntryActionProcessor,
12
+ getServiceFunctionActionProcessor,
12
13
  awsLambdaUtils,
13
14
  DynamicModuleLoader,
14
15
  } from 'quidproquo-actionprocessor-awslambda';
@@ -55,6 +56,7 @@ export const getOriginRequestEventExecutor = (
55
56
  ...getFileActionProcessor(cdkConfig.qpqConfig),
56
57
  ...getConfigActionProcessor(cdkConfig.qpqConfig),
57
58
  ...getWebEntryActionProcessor(cdkConfig.qpqConfig),
59
+ ...getServiceFunctionActionProcessor(cdkConfig.qpqConfig),
58
60
 
59
61
  // We probably don't want this?
60
62
  ...getUserDirectoryActionProcessor(cdkConfig.qpqConfig),
@@ -13,6 +13,7 @@ import {
13
13
  getConfigGetParametersActionProcessor,
14
14
  getUserDirectoryActionProcessor,
15
15
  getWebEntryActionProcessor,
16
+ getServiceFunctionActionProcessor,
16
17
  awsLambdaUtils,
17
18
  DynamicModuleLoader,
18
19
  } from 'quidproquo-actionprocessor-awslambda';
@@ -63,6 +64,7 @@ export const getStoryActionRuntime = async (
63
64
  ...getEventBusActionProcessor(cdkConfig.qpqConfig),
64
65
  ...getUserDirectoryActionProcessor(cdkConfig.qpqConfig),
65
66
  ...getWebEntryActionProcessor(cdkConfig.qpqConfig),
67
+ ...getServiceFunctionActionProcessor(cdkConfig.qpqConfig),
66
68
 
67
69
  ...getCustomActionProcessors(cdkConfig.qpqConfig),
68
70
  ...qpqCustomActionProcessors(),
@@ -0,0 +1,98 @@
1
+ import { coreActionProcessor, webserverActionProcessor } from 'quidproquo-actionprocessor-node';
2
+ import { ExecuteServiceFunctionEvent } from 'quidproquo-webserver';
3
+
4
+ import {
5
+ getServiceFunctionExecuteEventActionProcessor,
6
+ getSystemActionProcessor,
7
+ getFileActionProcessor,
8
+ getQueueActionProcessor,
9
+ getEventBusActionProcessor,
10
+ getConfigGetSecretActionProcessor,
11
+ getConfigGetParameterActionProcessor,
12
+ getConfigGetParametersActionProcessor,
13
+ getUserDirectoryActionProcessor,
14
+ getWebEntryActionProcessor,
15
+ getServiceFunctionActionProcessor,
16
+ awsLambdaUtils,
17
+ DynamicModuleLoader,
18
+ } from 'quidproquo-actionprocessor-awslambda';
19
+
20
+ import { getConfigActionProcessor } from 'quidproquo-actionprocessor-node';
21
+
22
+ import { createRuntime, askProcessEvent } from 'quidproquo-core';
23
+
24
+ import { Context } from 'aws-lambda';
25
+
26
+ import { getLambdaConfigs } from './lambdaConfig';
27
+ import { ActionProcessorListResolver } from './actionProcessorListResolver';
28
+
29
+ // @ts-ignore - Special webpack loader
30
+ import qpqDynamicModuleLoader from 'qpq-dynamic-loader!';
31
+
32
+ // @ts-ignore - Special webpack loader
33
+ import qpqCustomActionProcessors from 'qpq-custom-action-processors-loader!';
34
+
35
+ // TODO: Make this a util or something based on server time or something..
36
+ const getDateNow = () => new Date().toISOString();
37
+
38
+ export const getServiceFunctionExecuteEventExecutor = (
39
+ dynamicModuleLoader: DynamicModuleLoader,
40
+ getCustomActionProcessors: ActionProcessorListResolver = () => ({}),
41
+ ) => {
42
+ return async (event: ExecuteServiceFunctionEvent<any>, context: Context) => {
43
+ const cdkConfig = await getLambdaConfigs();
44
+
45
+ // Build a processor for the session and stuff
46
+ // Remove the non route ones ~ let the story execute action add them
47
+ const storyActionProcessor = {
48
+ ...coreActionProcessor,
49
+ ...webserverActionProcessor,
50
+
51
+ ...getServiceFunctionExecuteEventActionProcessor(cdkConfig.qpqConfig),
52
+
53
+ ...getConfigGetSecretActionProcessor(cdkConfig.qpqConfig),
54
+ ...getConfigGetParameterActionProcessor(cdkConfig.qpqConfig),
55
+ ...getConfigGetParametersActionProcessor(cdkConfig.qpqConfig),
56
+ ...getSystemActionProcessor(dynamicModuleLoader),
57
+ ...getFileActionProcessor(cdkConfig.qpqConfig),
58
+ ...getConfigActionProcessor(cdkConfig.qpqConfig),
59
+ ...getQueueActionProcessor(cdkConfig.qpqConfig),
60
+ ...getEventBusActionProcessor(cdkConfig.qpqConfig),
61
+ ...getUserDirectoryActionProcessor(cdkConfig.qpqConfig),
62
+ ...getWebEntryActionProcessor(cdkConfig.qpqConfig),
63
+ ...getServiceFunctionActionProcessor(cdkConfig.qpqConfig),
64
+
65
+ ...getCustomActionProcessors(cdkConfig.qpqConfig),
66
+ ...qpqCustomActionProcessors(),
67
+ };
68
+
69
+ const logger = async (result: any) => {
70
+ // addResult(
71
+ // envConfig.appName,
72
+ // getDateNow(),
73
+ // doWeCarePath,
74
+ // "route-infrastructure",
75
+ // "infrastructure",
76
+ // "askRoute",
77
+ // result
78
+ // );
79
+ };
80
+
81
+ const resolveStory = createRuntime(
82
+ {},
83
+ storyActionProcessor,
84
+ getDateNow,
85
+ logger,
86
+ awsLambdaUtils.randomGuid,
87
+ );
88
+
89
+ const result = await resolveStory(askProcessEvent, [event, context]);
90
+
91
+ // just return the story result
92
+ return result;
93
+ };
94
+ };
95
+
96
+ // Default executor
97
+ export const executeServiceFunctionExecuteEvent =
98
+ getServiceFunctionExecuteEventExecutor(qpqDynamicModuleLoader);
@@ -12,6 +12,7 @@ import {
12
12
  QpqWebserverApiConstruct,
13
13
  QpqApiCoreQueueConstruct,
14
14
  QpqWebserverSubdomainRedirectConstruct,
15
+ QpqWebserverServiceFunctionConstruct,
15
16
  } from '../constructs';
16
17
 
17
18
  export interface ApiQpqServiceStackProps extends QpqServiceStackProps {
@@ -84,5 +85,21 @@ export class ApiQpqServiceStack extends QpqServiceStack {
84
85
  },
85
86
  ),
86
87
  );
88
+
89
+ // Service Functions
90
+ const serviceFunctions = qpqWebServerUtils.getAllServiceFunctions(props.qpqConfig).map(
91
+ (setting) =>
92
+ new QpqWebserverServiceFunctionConstruct(
93
+ this,
94
+ qpqCoreUtils.getUniqueKeyForSetting(setting),
95
+ {
96
+ awsAccountId: props.awsAccountId,
97
+ qpqConfig: props.qpqConfig,
98
+
99
+ serviceFunctionConfig: setting,
100
+ apiLayerVersions: layers.layers,
101
+ },
102
+ ),
103
+ );
87
104
  }
88
105
  }
@@ -15,6 +15,7 @@ import {
15
15
  ApiQPQWebServerConfigSetting,
16
16
  QPQWebServerConfigSettingType,
17
17
  qpqWebServerUtils,
18
+ WebEntryQPQWebServerConfigSetting,
18
19
  } from 'quidproquo-webserver';
19
20
 
20
21
  import {
@@ -211,10 +212,17 @@ export const serviceNeedsServiceHostedZone = (qpqConfig: QPQConfig) => {
211
212
  .getConfigSettings<ApiQPQWebServerConfigSetting>(qpqConfig, QPQWebServerConfigSettingType.Api)
212
213
  .filter((config) => !config.onRootDomain);
213
214
 
215
+ const webEntryConfigs = qpqCoreUtils
216
+ .getConfigSettings<WebEntryQPQWebServerConfigSetting>(
217
+ qpqConfig,
218
+ QPQWebServerConfigSettingType.WebEntry,
219
+ )
220
+ .filter((config) => !config.domain.onRootDomain);
221
+
214
222
  // // Or if we are deploying to a feature env ~ like joecoady
215
223
  // const hasFeatureName = !!qpqCoreUtils.getApplicationModuleFeature(qpqConfig);
216
224
 
217
- return apiConfigs.length > 0; // || hasFeatureName;
225
+ return apiConfigs.length > 0 || webEntryConfigs.length > 0; // || hasFeatureName;
218
226
  };
219
227
 
220
228
  // Get resources that we can use to grant permissions to lambdas etc