quidproquo-deploy-awscdk 0.0.76 → 0.0.78

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 (27) hide show
  1. package/lib/constructs/feature/core/eventBus/QpqCoreEventBusConstruct.d.ts +18 -0
  2. package/lib/constructs/feature/core/eventBus/QpqCoreEventBusConstruct.js +62 -0
  3. package/lib/constructs/feature/core/eventBus/index.d.ts +1 -0
  4. package/lib/constructs/feature/core/eventBus/index.js +17 -0
  5. package/lib/constructs/feature/core/index.d.ts +1 -0
  6. package/lib/constructs/feature/core/index.js +1 -0
  7. package/lib/constructs/feature/core/queue/QpqApiCoreQueueConstruct.js +15 -0
  8. package/lib/constructs/feature/core/queue/QpqCoreQueueConstruct.js +14 -0
  9. package/lib/constructs/feature/core/storageDrive/QpqCoreStorageDriveConstruct.js +1 -0
  10. package/lib/lambdas/lambdaAPIGatewayEvent.js +1 -1
  11. package/lib/lambdas/lambdaEventBridgeEvent.js +1 -1
  12. package/lib/lambdas/lambdaSQSEvent.js +1 -1
  13. package/lib/stacks/InfQpqServiceStack.js +6 -0
  14. package/lib/utils/qpqDeployAwsCdkUtils.d.ts +1 -0
  15. package/lib/utils/qpqDeployAwsCdkUtils.js +12 -1
  16. package/package.json +1 -1
  17. package/src/constructs/feature/core/eventBus/QpqCoreEventBusConstruct.ts +74 -0
  18. package/src/constructs/feature/core/eventBus/index.ts +1 -0
  19. package/src/constructs/feature/core/index.ts +1 -0
  20. package/src/constructs/feature/core/queue/QpqApiCoreQueueConstruct.ts +27 -1
  21. package/src/constructs/feature/core/queue/QpqCoreQueueConstruct.ts +17 -0
  22. package/src/constructs/feature/core/storageDrive/QpqCoreStorageDriveConstruct.ts +1 -0
  23. package/src/lambdas/lambdaAPIGatewayEvent.ts +2 -0
  24. package/src/lambdas/lambdaEventBridgeEvent.ts +2 -0
  25. package/src/lambdas/lambdaSQSEvent.ts +2 -0
  26. package/src/stacks/InfQpqServiceStack.ts +12 -0
  27. package/src/utils/qpqDeployAwsCdkUtils.ts +25 -0
@@ -0,0 +1,18 @@
1
+ import { EventBusQPQConfigSetting, QPQConfig } from 'quidproquo-core';
2
+ import { QpqConstructBlock, QpqConstructBlockProps } from '../../../base/QpqConstructBlock';
3
+ import { Construct } from 'constructs';
4
+ import { aws_sns, aws_iam } from 'aws-cdk-lib';
5
+ export interface QpqCoreEventBusConstructProps extends QpqConstructBlockProps {
6
+ eventBusConfig: EventBusQPQConfigSetting;
7
+ }
8
+ export declare abstract class QpqCoreEventBusConstructBase extends QpqConstructBlock {
9
+ abstract topic: aws_sns.ITopic;
10
+ grantRead(grantee: aws_iam.IGrantable): void;
11
+ grantWrite(grantee: aws_iam.IGrantable): void;
12
+ grantAll(grantee: aws_iam.IGrantable): void;
13
+ }
14
+ export declare class QpqCoreEventBusConstruct extends QpqCoreEventBusConstructBase {
15
+ topic: aws_sns.ITopic;
16
+ static fromOtherStack(scope: Construct, id: string, qpqConfig: QPQConfig, awsAccountId: string, eventBusName: string, applicationOverride?: string): QpqCoreEventBusConstructBase;
17
+ constructor(scope: Construct, id: string, props: QpqCoreEventBusConstructProps);
18
+ }
@@ -0,0 +1,62 @@
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.QpqCoreEventBusConstruct = exports.QpqCoreEventBusConstructBase = void 0;
27
+ const quidproquo_actionprocessor_awslambda_1 = require("quidproquo-actionprocessor-awslambda");
28
+ const QpqConstructBlock_1 = require("../../../base/QpqConstructBlock");
29
+ const qpqDeployAwsCdkUtils = __importStar(require("../../../../utils"));
30
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
31
+ class QpqCoreEventBusConstructBase extends QpqConstructBlock_1.QpqConstructBlock {
32
+ grantRead(grantee) { }
33
+ grantWrite(grantee) {
34
+ this.topic.grantPublish(grantee);
35
+ }
36
+ grantAll(grantee) {
37
+ this.grantRead(grantee);
38
+ this.grantWrite(grantee);
39
+ }
40
+ }
41
+ exports.QpqCoreEventBusConstructBase = QpqCoreEventBusConstructBase;
42
+ class QpqCoreEventBusConstruct extends QpqCoreEventBusConstructBase {
43
+ static fromOtherStack(scope, id, qpqConfig, awsAccountId, eventBusName, applicationOverride) {
44
+ const topicArn = qpqDeployAwsCdkUtils.importStackValue(quidproquo_actionprocessor_awslambda_1.awsNamingUtils.getCFExportNameSnsTopicArnFromConfig(eventBusName, qpqConfig, applicationOverride));
45
+ class Import extends QpqCoreEventBusConstructBase {
46
+ constructor() {
47
+ super(...arguments);
48
+ this.topic = aws_cdk_lib_1.aws_sns.Topic.fromTopicArn(this, 'topic-arn', topicArn);
49
+ }
50
+ }
51
+ return new Import(scope, id, { qpqConfig, awsAccountId });
52
+ }
53
+ constructor(scope, id, props) {
54
+ super(scope, id, props);
55
+ this.topic = new aws_cdk_lib_1.aws_sns.Topic(this, 'topic', {
56
+ topicName: this.resourceName(props.eventBusConfig.name),
57
+ displayName: props.eventBusConfig.name,
58
+ });
59
+ qpqDeployAwsCdkUtils.exportStackValue(this, quidproquo_actionprocessor_awslambda_1.awsNamingUtils.getCFExportNameSnsTopicArnFromConfig(props.eventBusConfig.name, props.qpqConfig), this.topic.topicArn);
60
+ }
61
+ }
62
+ exports.QpqCoreEventBusConstruct = QpqCoreEventBusConstruct;
@@ -0,0 +1 @@
1
+ export * from './QpqCoreEventBusConstruct';
@@ -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("./QpqCoreEventBusConstruct"), exports);
@@ -1,4 +1,5 @@
1
1
  export * from './auth';
2
+ export * from './eventBus';
2
3
  export * from './parameter';
3
4
  export * from './queue';
4
5
  export * from './schedule';
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./auth"), exports);
18
+ __exportStar(require("./eventBus"), exports);
18
19
  __exportStar(require("./parameter"), exports);
19
20
  __exportStar(require("./queue"), exports);
20
21
  __exportStar(require("./schedule"), exports);
@@ -27,6 +27,7 @@ exports.QpqApiCoreQueueConstruct = void 0;
27
27
  const quidproquo_core_1 = require("quidproquo-core");
28
28
  const QpqConstructBlock_1 = require("../../../base/QpqConstructBlock");
29
29
  const QpqCoreQueueConstruct_1 = require("./QpqCoreQueueConstruct");
30
+ const QpqCoreEventBusConstruct_1 = require("../eventBus/QpqCoreEventBusConstruct");
30
31
  const Function_1 = require("../../../basic/Function");
31
32
  const qpqDeployAwsCdkUtils = __importStar(require("../../../../utils"));
32
33
  const aws_cdk_lib_1 = require("aws-cdk-lib");
@@ -53,6 +54,20 @@ class QpqApiCoreQueueConstruct extends QpqConstructBlock_1.QpqConstructBlock {
53
54
  });
54
55
  // ///////// end todo
55
56
  const queueResource = QpqCoreQueueConstruct_1.QpqCoreQueueConstruct.fromOtherStack(this, 'queue', props.qpqConfig, props.queueConfig, props.awsAccountId);
57
+ props.queueConfig.eventBusSubscriptions.forEach((eventBusName) => {
58
+ const eventBus = QpqCoreEventBusConstruct_1.QpqCoreEventBusConstruct.fromOtherStack(this, `event-bus-${eventBusName}`, props.qpqConfig, props.awsAccountId, eventBusName);
59
+ eventBus.topic.addSubscription(new aws_cdk_lib_1.aws_sns_subscriptions.SqsSubscription(queueResource.queue, {
60
+ rawMessageDelivery: true,
61
+ // No wildcard support :(
62
+ // filterPolicy: {
63
+ // type: aws_sns.SubscriptionFilter.stringFilter({
64
+ // allowlist: Object.keys(props.queueConfig.qpqQueueProcessors).map((type) =>
65
+ // type.replaceAll(/{(.+?)}/g, '*'),
66
+ // ),
67
+ // }),
68
+ // },
69
+ }));
70
+ });
56
71
  queueFunction.lambdaFunction.addEventSource(new aws_cdk_lib_1.aws_lambda_event_sources.SqsEventSource(queueResource.queue, {
57
72
  batchSize: props.queueConfig.batchSize,
58
73
  maxBatchingWindow: cdk.Duration.seconds(props.queueConfig.batchWindowInSeconds),
@@ -67,6 +67,20 @@ class QpqCoreQueueConstruct extends QpqCoreQueueConstructBase {
67
67
  }),
68
68
  },
69
69
  });
70
+ // This has to be any topic arn as we want other services / apps to be able
71
+ // to publish to this queue
72
+ this.queue.addToResourcePolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
73
+ sid: 'AllowSNSServicePrincipal',
74
+ effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
75
+ principals: [new aws_cdk_lib_1.aws_iam.ServicePrincipal('sns.amazonaws.com')],
76
+ actions: ['sqs:SendMessage'],
77
+ resources: [this.queue.queueArn],
78
+ conditions: {
79
+ ArnEquals: {
80
+ 'aws:SourceArn': `arn:aws:sns:*:${props.awsAccountId}:*`,
81
+ },
82
+ },
83
+ }));
70
84
  }
71
85
  }
72
86
  exports.QpqCoreQueueConstruct = QpqCoreQueueConstruct;
@@ -62,6 +62,7 @@ class QpqCoreStorageDriveConstruct extends QpqCoreStorageDriveConstructBase {
62
62
  removalPolicy: cdk.RemovalPolicy.DESTROY,
63
63
  autoDeleteObjects: true,
64
64
  });
65
+ // TODO: Only do this IF a cloud front dist wants to use it
65
66
  this.bucket.addToResourcePolicy(new aws_cdk_lib_1.aws_iam.PolicyStatement({
66
67
  sid: 'AllowCloudFrontServicePrincipal',
67
68
  effect: aws_cdk_lib_1.aws_iam.Effect.ALLOW,
@@ -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({}, 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.getUserDirectoryActionProcessor)(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({}, 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)), 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({}, 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.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.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.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({}, 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.getUserDirectoryActionProcessor)(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({}, 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)), 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);
@@ -50,6 +50,12 @@ class InfQpqServiceStack extends QpqServiceStack_1.QpqServiceStack {
50
50
  qpqConfig: props.qpqConfig,
51
51
  apiKeyConfig: setting,
52
52
  }));
53
+ // Event Busses
54
+ const busses = quidproquo_core_1.qpqCoreUtils.getAllEventBusConfigs(props.qpqConfig).map((setting) => new constructs_1.QpqCoreEventBusConstruct(this, quidproquo_core_1.qpqCoreUtils.getUniqueKeyForSetting(setting), {
55
+ awsAccountId: props.awsAccountId,
56
+ qpqConfig: props.qpqConfig,
57
+ eventBusConfig: setting,
58
+ }));
53
59
  }
54
60
  }
55
61
  exports.InfQpqServiceStack = InfQpqServiceStack;
@@ -8,6 +8,7 @@ export declare const getQqpParameterGrantables: (scope: Construct, id: string, q
8
8
  export declare const getQqpStorageDriveGrantables: (scope: Construct, id: string, qpqConfig: QPQConfig, awsAccountId: string) => QpqResource[];
9
9
  export declare const getQqpQueueGrantables: (scope: Construct, id: string, qpqConfig: QPQConfig, awsAccountId: string) => QpqResource[];
10
10
  export declare const getQqpUserPoolGrantables: (scope: Construct, id: string, qpqConfig: QPQConfig, awsAccountId: string) => QpqResource[];
11
+ export declare const getQqpTopicGrantables: (scope: Construct, id: string, qpqConfig: QPQConfig, awsAccountId: string) => QpqResource[];
11
12
  export declare const getQqpUserPoolGrantablesForApiConfig: (scope: Construct, id: string, qpqConfig: QPQConfig, awsAccountId: string, config: ApiQPQWebServerConfigSetting) => QpqResource[];
12
13
  export declare const serviceNeedsServiceHostedZone: (qpqConfig: QPQConfig) => boolean;
13
14
  export declare const getQqpGrantableResources: (scope: Construct, id: string, qpqConfig: QPQConfig, awsAccountId: string) => QpqResource[];
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
23
23
  return result;
24
24
  };
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.importStackValue = exports.exportStackValue = exports.getQqpGrantableResourcesForApiConfig = exports.getQqpGrantableResources = exports.serviceNeedsServiceHostedZone = exports.getQqpUserPoolGrantablesForApiConfig = exports.getQqpUserPoolGrantables = exports.getQqpQueueGrantables = exports.getQqpStorageDriveGrantables = exports.getQqpParameterGrantables = exports.getQqpSecretGrantables = void 0;
26
+ exports.importStackValue = exports.exportStackValue = exports.getQqpGrantableResourcesForApiConfig = exports.getQqpGrantableResources = exports.serviceNeedsServiceHostedZone = exports.getQqpUserPoolGrantablesForApiConfig = exports.getQqpTopicGrantables = exports.getQqpUserPoolGrantables = exports.getQqpQueueGrantables = exports.getQqpStorageDriveGrantables = exports.getQqpParameterGrantables = exports.getQqpSecretGrantables = void 0;
27
27
  const cdk = __importStar(require("aws-cdk-lib"));
28
28
  const quidproquo_core_1 = require("quidproquo-core");
29
29
  const quidproquo_webserver_1 = require("quidproquo-webserver");
@@ -76,6 +76,16 @@ const getQqpUserPoolGrantables = (scope, id, qpqConfig, awsAccountId) => {
76
76
  return userDirectoryResources;
77
77
  };
78
78
  exports.getQqpUserPoolGrantables = getQqpUserPoolGrantables;
79
+ const getQqpTopicGrantables = (scope, id, qpqConfig, awsAccountId) => {
80
+ const eventBusConfigs = quidproquo_core_1.qpqCoreUtils
81
+ .getAllEventBusConfigs(qpqConfig)
82
+ .filter((ebc) => !ebc.deprecated);
83
+ const eventBuses = eventBusConfigs.map((eventBus) => {
84
+ return constructs_1.QpqCoreEventBusConstruct.fromOtherStack(scope, `${id}-${quidproquo_core_1.qpqCoreUtils.getUniqueKeyForSetting(eventBus)}-grantable`, qpqConfig, awsAccountId, eventBus.name);
85
+ });
86
+ return eventBuses;
87
+ };
88
+ exports.getQqpTopicGrantables = getQqpTopicGrantables;
79
89
  const getQqpUserPoolGrantablesForApiConfig = (scope, id, qpqConfig, awsAccountId, config) => {
80
90
  const routesWithAuth = quidproquo_webserver_1.qpqWebServerUtils
81
91
  .getAllRoutesForApi(config.apiName, qpqConfig)
@@ -109,6 +119,7 @@ const getQqpGrantableResources = (scope, id, qpqConfig, awsAccountId) => {
109
119
  ...(0, exports.getQqpStorageDriveGrantables)(scope, id, qpqConfig, awsAccountId),
110
120
  ...(0, exports.getQqpQueueGrantables)(scope, id, qpqConfig, awsAccountId),
111
121
  ...(0, exports.getQqpUserPoolGrantables)(scope, id, qpqConfig, awsAccountId),
122
+ ...(0, exports.getQqpTopicGrantables)(scope, id, qpqConfig, awsAccountId),
112
123
  ];
113
124
  };
114
125
  exports.getQqpGrantableResources = getQqpGrantableResources;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "quidproquo-deploy-awscdk",
3
- "version": "0.0.76",
3
+ "version": "0.0.78",
4
4
  "description": "",
5
5
  "main": "./lib/index.js",
6
6
  "types": "./lib/index.d.js",
@@ -0,0 +1,74 @@
1
+ import { awsNamingUtils } from 'quidproquo-actionprocessor-awslambda';
2
+ import { EventBusQPQConfigSetting, qpqCoreUtils, QPQConfig } from 'quidproquo-core';
3
+
4
+ import { QpqConstructBlock, QpqConstructBlockProps } from '../../../base/QpqConstructBlock';
5
+ import { QpqResource } from '../../../base/QpqResource';
6
+
7
+ import * as qpqDeployAwsCdkUtils from '../../../../utils';
8
+
9
+ import { Construct } from 'constructs';
10
+ import { aws_sns, aws_iam } from 'aws-cdk-lib';
11
+
12
+ export interface QpqCoreEventBusConstructProps extends QpqConstructBlockProps {
13
+ eventBusConfig: EventBusQPQConfigSetting;
14
+ }
15
+
16
+ export abstract class QpqCoreEventBusConstructBase extends QpqConstructBlock {
17
+ abstract topic: aws_sns.ITopic;
18
+
19
+ public grantRead(grantee: aws_iam.IGrantable) {}
20
+
21
+ public grantWrite(grantee: aws_iam.IGrantable): void {
22
+ this.topic.grantPublish(grantee);
23
+ }
24
+
25
+ public grantAll(grantee: aws_iam.IGrantable): void {
26
+ this.grantRead(grantee);
27
+ this.grantWrite(grantee);
28
+ }
29
+ }
30
+
31
+ export class QpqCoreEventBusConstruct extends QpqCoreEventBusConstructBase {
32
+ topic: aws_sns.ITopic;
33
+
34
+ static fromOtherStack(
35
+ scope: Construct,
36
+ id: string,
37
+ qpqConfig: QPQConfig,
38
+ awsAccountId: string,
39
+ eventBusName: string,
40
+ applicationOverride?: string,
41
+ ): QpqCoreEventBusConstructBase {
42
+ const topicArn = qpqDeployAwsCdkUtils.importStackValue(
43
+ awsNamingUtils.getCFExportNameSnsTopicArnFromConfig(
44
+ eventBusName,
45
+ qpqConfig,
46
+ applicationOverride,
47
+ ),
48
+ );
49
+
50
+ class Import extends QpqCoreEventBusConstructBase {
51
+ topic = aws_sns.Topic.fromTopicArn(this, 'topic-arn', topicArn);
52
+ }
53
+
54
+ return new Import(scope, id, { qpqConfig, awsAccountId });
55
+ }
56
+
57
+ constructor(scope: Construct, id: string, props: QpqCoreEventBusConstructProps) {
58
+ super(scope, id, props);
59
+
60
+ this.topic = new aws_sns.Topic(this, 'topic', {
61
+ topicName: this.resourceName(props.eventBusConfig.name),
62
+ displayName: props.eventBusConfig.name,
63
+ });
64
+
65
+ qpqDeployAwsCdkUtils.exportStackValue(
66
+ this,
67
+ awsNamingUtils.getCFExportNameSnsTopicArnFromConfig(
68
+ props.eventBusConfig.name,
69
+ props.qpqConfig,
70
+ ),
71
+ this.topic.topicArn,
72
+ );
73
+ }
74
+ }
@@ -0,0 +1 @@
1
+ export * from './QpqCoreEventBusConstruct';
@@ -1,4 +1,5 @@
1
1
  export * from './auth';
2
+ export * from './eventBus';
2
3
  export * from './parameter';
3
4
  export * from './queue';
4
5
  export * from './schedule';
@@ -2,13 +2,14 @@ import { QueueQPQConfigSetting, qpqCoreUtils, QPQConfig } from 'quidproquo-core'
2
2
 
3
3
  import { QpqConstructBlock, QpqConstructBlockProps } from '../../../base/QpqConstructBlock';
4
4
  import { QpqCoreQueueConstruct } from './QpqCoreQueueConstruct';
5
+ import { QpqCoreEventBusConstruct } from '../eventBus/QpqCoreEventBusConstruct';
5
6
 
6
7
  import { Function } from '../../../basic/Function';
7
8
 
8
9
  import * as qpqDeployAwsCdkUtils from '../../../../utils';
9
10
 
10
11
  import { Construct } from 'constructs';
11
- import { aws_lambda_event_sources, aws_lambda } from 'aws-cdk-lib';
12
+ import { aws_lambda_event_sources, aws_lambda, aws_sns, aws_sns_subscriptions } from 'aws-cdk-lib';
12
13
  import * as cdk from 'aws-cdk-lib';
13
14
 
14
15
  export interface QpqApiCoreQueueConstructProps extends QpqConstructBlockProps {
@@ -58,6 +59,31 @@ export class QpqApiCoreQueueConstruct extends QpqConstructBlock {
58
59
  props.awsAccountId,
59
60
  );
60
61
 
62
+ props.queueConfig.eventBusSubscriptions.forEach((eventBusName) => {
63
+ const eventBus = QpqCoreEventBusConstruct.fromOtherStack(
64
+ this,
65
+ `event-bus-${eventBusName}`,
66
+ props.qpqConfig,
67
+ props.awsAccountId,
68
+ eventBusName,
69
+ );
70
+
71
+ eventBus.topic.addSubscription(
72
+ new aws_sns_subscriptions.SqsSubscription(queueResource.queue, {
73
+ rawMessageDelivery: true,
74
+
75
+ // No wildcard support :(
76
+ // filterPolicy: {
77
+ // type: aws_sns.SubscriptionFilter.stringFilter({
78
+ // allowlist: Object.keys(props.queueConfig.qpqQueueProcessors).map((type) =>
79
+ // type.replaceAll(/{(.+?)}/g, '*'),
80
+ // ),
81
+ // }),
82
+ // },
83
+ }),
84
+ );
85
+ });
86
+
61
87
  queueFunction.lambdaFunction.addEventSource(
62
88
  new aws_lambda_event_sources.SqsEventSource(queueResource.queue, {
63
89
  batchSize: props.queueConfig.batchSize,
@@ -72,5 +72,22 @@ export class QpqCoreQueueConstruct extends QpqCoreQueueConstructBase {
72
72
  }),
73
73
  },
74
74
  });
75
+
76
+ // This has to be any topic arn as we want other services / apps to be able
77
+ // to publish to this queue
78
+ this.queue.addToResourcePolicy(
79
+ new aws_iam.PolicyStatement({
80
+ sid: 'AllowSNSServicePrincipal',
81
+ effect: aws_iam.Effect.ALLOW,
82
+ principals: [new aws_iam.ServicePrincipal('sns.amazonaws.com')],
83
+ actions: ['sqs:SendMessage'],
84
+ resources: [this.queue.queueArn],
85
+ conditions: {
86
+ ArnEquals: {
87
+ 'aws:SourceArn': `arn:aws:sns:*:${props.awsAccountId}:*`,
88
+ },
89
+ },
90
+ }),
91
+ );
75
92
  }
76
93
  }
@@ -67,6 +67,7 @@ export class QpqCoreStorageDriveConstruct extends QpqCoreStorageDriveConstructBa
67
67
  autoDeleteObjects: true,
68
68
  });
69
69
 
70
+ // TODO: Only do this IF a cloud front dist wants to use it
70
71
  this.bucket.addToResourcePolicy(
71
72
  new aws_iam.PolicyStatement({
72
73
  sid: 'AllowCloudFrontServicePrincipal',
@@ -5,6 +5,7 @@ import {
5
5
  getSystemActionProcessor,
6
6
  getFileActionProcessor,
7
7
  getQueueActionProcessor,
8
+ getEventBusActionProcessor,
8
9
  getConfigGetSecretActionProcessor,
9
10
  getConfigGetParameterActionProcessor,
10
11
  getConfigGetParametersActionProcessor,
@@ -70,6 +71,7 @@ export const getAPIGatewayEventExecutor = (
70
71
  ...getFileActionProcessor(cdkConfig.qpqConfig),
71
72
  ...getConfigActionProcessor(cdkConfig.qpqConfig),
72
73
  ...getQueueActionProcessor(cdkConfig.qpqConfig),
74
+ ...getEventBusActionProcessor(cdkConfig.qpqConfig),
73
75
  ...getUserDirectoryActionProcessor(cdkConfig.qpqConfig),
74
76
 
75
77
  ...getCustomActionProcessors(cdkConfig.qpqConfig),
@@ -5,6 +5,7 @@ import {
5
5
  getSystemActionProcessor,
6
6
  getFileActionProcessor,
7
7
  getQueueActionProcessor,
8
+ getEventBusActionProcessor,
8
9
  getUserDirectoryActionProcessor,
9
10
  getConfigGetSecretActionProcessor,
10
11
  getConfigGetParameterActionProcessor,
@@ -57,6 +58,7 @@ export const getEventBridgeEventExecutor = (
57
58
  ...getConfigGetParametersActionProcessor(cdkConfig.qpqConfig),
58
59
  ...getConfigActionProcessor(cdkConfig.qpqConfig),
59
60
  ...getQueueActionProcessor(cdkConfig.qpqConfig),
61
+ ...getEventBusActionProcessor(cdkConfig.qpqConfig),
60
62
  ...getUserDirectoryActionProcessor(cdkConfig.qpqConfig),
61
63
 
62
64
  ...getCustomActionProcessors(cdkConfig.qpqConfig),
@@ -7,6 +7,7 @@ import {
7
7
  getSystemActionProcessor,
8
8
  getFileActionProcessor,
9
9
  getQueueActionProcessor,
10
+ getEventBusActionProcessor,
10
11
  getConfigGetSecretActionProcessor,
11
12
  getConfigGetParameterActionProcessor,
12
13
  getConfigGetParametersActionProcessor,
@@ -58,6 +59,7 @@ export const getStoryActionRuntime = async (
58
59
  ...getFileActionProcessor(cdkConfig.qpqConfig),
59
60
  ...getConfigActionProcessor(cdkConfig.qpqConfig),
60
61
  ...getQueueActionProcessor(cdkConfig.qpqConfig),
62
+ ...getEventBusActionProcessor(cdkConfig.qpqConfig),
61
63
  ...getUserDirectoryActionProcessor(cdkConfig.qpqConfig),
62
64
 
63
65
  ...getCustomActionProcessors(cdkConfig.qpqConfig),
@@ -9,6 +9,7 @@ import {
9
9
  QpqCoreParameterConstruct,
10
10
  QpqCoreQueueConstruct,
11
11
  QpqCoreSecretConstruct,
12
+ QpqCoreEventBusConstruct,
12
13
  QpqWebserverDomainConstruct,
13
14
  QpqCoreUserDirectoryConstruct,
14
15
  QpqWebserverApiKeyConstruct,
@@ -96,5 +97,16 @@ export class InfQpqServiceStack extends QpqServiceStack {
96
97
  apiKeyConfig: setting,
97
98
  }),
98
99
  );
100
+
101
+ // Event Busses
102
+ const busses = qpqCoreUtils.getAllEventBusConfigs(props.qpqConfig).map(
103
+ (setting) =>
104
+ new QpqCoreEventBusConstruct(this, qpqCoreUtils.getUniqueKeyForSetting(setting), {
105
+ awsAccountId: props.awsAccountId,
106
+ qpqConfig: props.qpqConfig,
107
+
108
+ eventBusConfig: setting,
109
+ }),
110
+ );
99
111
  }
100
112
  }
@@ -24,6 +24,7 @@ import {
24
24
  QpqCoreStorageDriveConstruct,
25
25
  QpqCoreQueueConstruct,
26
26
  QpqCoreUserDirectoryConstruct,
27
+ QpqCoreEventBusConstruct,
27
28
  } from '../constructs';
28
29
 
29
30
  export const getQqpSecretGrantables = (
@@ -151,6 +152,29 @@ export const getQqpUserPoolGrantables = (
151
152
  return userDirectoryResources;
152
153
  };
153
154
 
155
+ export const getQqpTopicGrantables = (
156
+ scope: Construct,
157
+ id: string,
158
+ qpqConfig: QPQConfig,
159
+ awsAccountId: string,
160
+ ): QpqResource[] => {
161
+ const eventBusConfigs = qpqCoreUtils
162
+ .getAllEventBusConfigs(qpqConfig)
163
+ .filter((ebc) => !ebc.deprecated);
164
+
165
+ const eventBuses = eventBusConfigs.map((eventBus) => {
166
+ return QpqCoreEventBusConstruct.fromOtherStack(
167
+ scope,
168
+ `${id}-${qpqCoreUtils.getUniqueKeyForSetting(eventBus)}-grantable`,
169
+ qpqConfig,
170
+ awsAccountId,
171
+ eventBus.name,
172
+ );
173
+ });
174
+
175
+ return eventBuses;
176
+ };
177
+
154
178
  export const getQqpUserPoolGrantablesForApiConfig = (
155
179
  scope: Construct,
156
180
  id: string,
@@ -206,6 +230,7 @@ export const getQqpGrantableResources = (
206
230
  ...getQqpStorageDriveGrantables(scope, id, qpqConfig, awsAccountId),
207
231
  ...getQqpQueueGrantables(scope, id, qpqConfig, awsAccountId),
208
232
  ...getQqpUserPoolGrantables(scope, id, qpqConfig, awsAccountId),
233
+ ...getQqpTopicGrantables(scope, id, qpqConfig, awsAccountId),
209
234
  ];
210
235
  };
211
236