@sylvesterllc/aws-constructs 1.1.55 → 1.1.61

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 (182) hide show
  1. package/.github/workflows/publish.yml +69 -56
  2. package/__tests__/app-config.test.ts +32 -32
  3. package/__tests__/data/testConfig.ts +146 -146
  4. package/__tests__/mocks/ResourceMock.ts +9 -9
  5. package/__tests__/router.test.ts +194 -194
  6. package/dist/config/AppConfig.js +1 -1
  7. package/dist/config/Constants.js +1 -1
  8. package/dist/config/Environments.js +1 -1
  9. package/dist/config/MicroserviceAppConfig.js +1 -1
  10. package/dist/config/ServiceBundleConfig.js +1 -1
  11. package/dist/config/bishopConfig.js +1 -1
  12. package/dist/config/customConfigs/ApiAppConfig.js +1 -1
  13. package/dist/config/customConfigs/GlobalAppConfig.js +1 -1
  14. package/dist/config/customConfigs/IAppConfig.js +1 -1
  15. package/dist/config/customConfigs/ResourceAppConfig.js +1 -1
  16. package/dist/config/microServiceConfig.js +1 -1
  17. package/dist/config/types/LogDuration.js +1 -1
  18. package/dist/config/types/TsgAuthorizerProp.js +1 -1
  19. package/dist/config/types/TsgAuthorizerType.js +1 -1
  20. package/dist/config/types/TsgCdkConfigType.js +1 -1
  21. package/dist/config/types/TsgCognitoConfig.js +1 -1
  22. package/dist/config/types/TsgDnsConfig.js +1 -1
  23. package/dist/config/types/TsgDynamoDbProp.js +1 -1
  24. package/dist/config/types/TsgDynamoIndex.js +1 -1
  25. package/dist/config/types/TsgDynamoProp.js +1 -1
  26. package/dist/config/types/TsgDynamoTable.js +1 -1
  27. package/dist/config/types/TsgDynamoTableRef.js +1 -1
  28. package/dist/config/types/TsgEc2Prop.js +1 -1
  29. package/dist/config/types/TsgKeyPair.js +1 -1
  30. package/dist/config/types/TsgLambda.js +1 -1
  31. package/dist/config/types/TsgLambdaLayerProp.js +1 -1
  32. package/dist/config/types/TsgLambdaMap.js +1 -1
  33. package/dist/config/types/TsgLambdaName.js +1 -1
  34. package/dist/config/types/TsgLambdaNode.js +1 -1
  35. package/dist/config/types/TsgLambdaProp.js +1 -1
  36. package/dist/config/types/TsgLambdaProps.js +1 -1
  37. package/dist/config/types/TsgLambdaRoutable.js +1 -1
  38. package/dist/config/types/index.js +1 -1
  39. package/dist/constants/aws-service-principal-constants.js +1 -1
  40. package/dist/constructs/BasicLambda.js +3 -3
  41. package/dist/constructs/DynamoDbSingleTable.js +1 -1
  42. package/dist/constructs/MicroService.js +1 -1
  43. package/dist/constructs/basic-queue.js +1 -1
  44. package/dist/constructs/index.js +1 -1
  45. package/dist/constructs/timer-job.js +3 -3
  46. package/dist/helpers/logger.js +1 -1
  47. package/dist/helpers/util-helper.js +1 -1
  48. package/dist/index.js +1 -1
  49. package/dist/interfaces/ApiLambdaResult.js +1 -1
  50. package/dist/interfaces/BaseResourceProps.js +1 -1
  51. package/dist/interfaces/CreateLambdaFunctionInput.js +1 -1
  52. package/dist/interfaces/MicroserviceProps.js +1 -1
  53. package/dist/interfaces/lambda/index.js +1 -1
  54. package/dist/interfaces/lambda/lambda-props.js +1 -1
  55. package/dist/interfaces/timer-job/timer-job-props.js +1 -1
  56. package/dist/resources/base/baseResource.js +1 -1
  57. package/dist/resources/base/tsgBaseResource.js +1 -1
  58. package/dist/resources/certificate/createCertificate.js +1 -1
  59. package/dist/resources/cognito/createCognito.js +1 -1
  60. package/dist/resources/cognito/createCognitoProps.js +1 -1
  61. package/dist/resources/customResource/createSeedDatabaseCustomResource.js +1 -1
  62. package/dist/resources/dynamodb/CreateDynamo.js +1 -1
  63. package/dist/resources/dynamodb/CreateDynamoSingleTableDesign.js +1 -1
  64. package/dist/resources/ec2/create-ec2-instance.js +3 -3
  65. package/dist/resources/ecr/CreateEcr.js +2 -2
  66. package/dist/resources/gateway/CreateApiAndAttachLambdas.js +1 -1
  67. package/dist/resources/gateway/createApi.js +1 -1
  68. package/dist/resources/gateway/createApiKey.js +1 -1
  69. package/dist/resources/helpers/createCommonLayer.js +1 -1
  70. package/dist/resources/helpers/createRoutes.js +1 -1
  71. package/dist/resources/index.js +1 -1
  72. package/dist/resources/lambda/create-basic-lambda-helper.js +2 -2
  73. package/dist/resources/lambda/create-basic-lambda.js +2 -2
  74. package/dist/resources/lambda/createLambda.js +1 -1
  75. package/dist/resources/lambda/lambdaHelper.js +1 -1
  76. package/dist/resources/lambda-authorizer/TsgJwtTokenAuthorizer.js +1 -1
  77. package/dist/resources/lambda-authorizer/TsgRequestAuthorizer.js +1 -1
  78. package/dist/resources/lambda-authorizer/createAuthorizerHelpers.js +1 -1
  79. package/dist/resources/lambda-layer/createLambdaLayer.js +1 -1
  80. package/dist/resources/layers/common/src/nodejs/api-response/responses.js +1 -1
  81. package/dist/resources/layers/common/src/nodejs/index.js +1 -1
  82. package/dist/resources/layers/common/src/nodejs/logger/IContext.js +1 -1
  83. package/dist/resources/layers/common/src/nodejs/logger/index.js +1 -1
  84. package/dist/resources/layers/common/src/nodejs/logger/logger.js +1 -1
  85. package/dist/resources/resources/iam/policyDocuments/cognitoPolicy.js +1 -1
  86. package/dist/resources/resources/iam/roles/createRole.js +1 -1
  87. package/dist/resources/route53/CreateZone.js +1 -1
  88. package/dist/resources/route53/create-zones.js +1 -1
  89. package/dist/resources/securityManager/index.js +1 -1
  90. package/dist/resources/sqs/create-sqs-resource.js +1 -1
  91. package/jest.config.js +8 -8
  92. package/jest.config.ts.old +20 -20
  93. package/package.json +1 -1
  94. package/readme.md +147 -147
  95. package/src/config/AppConfig.ts +106 -106
  96. package/src/config/Constants.ts +26 -26
  97. package/src/config/Environments.ts +1 -1
  98. package/src/config/MicroserviceAppConfig.ts +8 -8
  99. package/src/config/ServiceBundleConfig.ts +17 -17
  100. package/src/config/bishopConfig.ts +82 -82
  101. package/src/config/customConfigs/ApiAppConfig.ts +5 -5
  102. package/src/config/customConfigs/GlobalAppConfig.ts +10 -10
  103. package/src/config/customConfigs/IAppConfig.ts +12 -12
  104. package/src/config/customConfigs/ResourceAppConfig.ts +15 -15
  105. package/src/config/microServiceConfig.ts +83 -83
  106. package/src/config/types/LogDuration.ts +7 -7
  107. package/src/config/types/TsgAuthorizerProp.ts +8 -8
  108. package/src/config/types/TsgAuthorizerType.ts +4 -4
  109. package/src/config/types/TsgCdkConfigType.ts +2 -2
  110. package/src/config/types/TsgCognitoConfig.ts +5 -5
  111. package/src/config/types/TsgDnsConfig.ts +10 -10
  112. package/src/config/types/TsgDynamoDbProp.ts +9 -9
  113. package/src/config/types/TsgDynamoIndex.ts +15 -15
  114. package/src/config/types/TsgDynamoProp.ts +16 -16
  115. package/src/config/types/TsgDynamoTable.ts +4 -4
  116. package/src/config/types/TsgDynamoTableRef.ts +3 -3
  117. package/src/config/types/TsgEc2Prop.ts +8 -8
  118. package/src/config/types/TsgKeyPair.ts +5 -5
  119. package/src/config/types/TsgLambda.ts +5 -5
  120. package/src/config/types/TsgLambdaLayerProp.ts +4 -4
  121. package/src/config/types/TsgLambdaMap.ts +3 -3
  122. package/src/config/types/TsgLambdaName.ts +3 -3
  123. package/src/config/types/TsgLambdaNode.ts +3 -3
  124. package/src/config/types/TsgLambdaProp.ts +19 -19
  125. package/src/config/types/TsgLambdaProps.ts +17 -17
  126. package/src/config/types/TsgLambdaRoutable.ts +8 -8
  127. package/src/config/types/index.ts +11 -11
  128. package/src/constants/aws-service-principal-constants.ts +2 -2
  129. package/src/constructs/BasicLambda.ts +19 -19
  130. package/src/constructs/DynamoDbSingleTable.ts +9 -9
  131. package/src/constructs/MicroService.ts +131 -131
  132. package/src/constructs/basic-queue.ts +18 -18
  133. package/src/constructs/index.ts +6 -6
  134. package/src/constructs/timer-job.ts +19 -19
  135. package/src/helpers/logger.ts +12 -12
  136. package/src/helpers/util-helper.ts +19 -19
  137. package/src/index.ts +8 -8
  138. package/src/interfaces/ApiLambdaResult.ts +6 -6
  139. package/src/interfaces/BaseResourceProps.ts +6 -6
  140. package/src/interfaces/CreateLambdaFunctionInput.ts +10 -10
  141. package/src/interfaces/MicroserviceProps.ts +10 -10
  142. package/src/interfaces/lambda/index.ts +1 -1
  143. package/src/interfaces/lambda/lambda-props.ts +15 -15
  144. package/src/interfaces/timer-job/timer-job-props.ts +6 -6
  145. package/src/resources/base/baseResource.ts +14 -14
  146. package/src/resources/base/tsgBaseResource.ts +21 -21
  147. package/src/resources/certificate/createCertificate.ts +57 -57
  148. package/src/resources/cognito/createCognito.ts +47 -47
  149. package/src/resources/cognito/createCognitoProps.ts +46 -46
  150. package/src/resources/customResource/createSeedDatabaseCustomResource.ts +36 -36
  151. package/src/resources/dynamodb/CreateDynamo.ts +110 -110
  152. package/src/resources/dynamodb/CreateDynamoSingleTableDesign.ts +118 -118
  153. package/src/resources/ec2/create-ec2-instance.ts +52 -52
  154. package/src/resources/ecr/CreateEcr.ts +57 -57
  155. package/src/resources/gateway/CreateApiAndAttachLambdas.ts +161 -161
  156. package/src/resources/gateway/createApi.ts +173 -173
  157. package/src/resources/gateway/createApiKey.ts +88 -88
  158. package/src/resources/helpers/createCommonLayer.ts +18 -18
  159. package/src/resources/helpers/createRoutes.ts +74 -74
  160. package/src/resources/index.ts +1 -1
  161. package/src/resources/lambda/create-basic-lambda-helper.ts +124 -124
  162. package/src/resources/lambda/create-basic-lambda.ts +162 -159
  163. package/src/resources/lambda/createLambda.ts +239 -239
  164. package/src/resources/lambda/lambdaHelper.ts +133 -133
  165. package/src/resources/lambda-authorizer/TsgJwtTokenAuthorizer.ts +107 -107
  166. package/src/resources/lambda-authorizer/TsgRequestAuthorizer.ts +44 -44
  167. package/src/resources/lambda-authorizer/createAuthorizerHelpers.ts +76 -76
  168. package/src/resources/lambda-layer/createLambdaLayer.ts +39 -39
  169. package/src/resources/layers/common/package.json +22 -22
  170. package/src/resources/layers/common/src/nodejs/api-response/responses.ts +41 -41
  171. package/src/resources/layers/common/src/nodejs/index.ts +3 -3
  172. package/src/resources/layers/common/src/nodejs/logger/IContext.ts +6 -6
  173. package/src/resources/layers/common/src/nodejs/logger/index.ts +1 -1
  174. package/src/resources/layers/common/src/nodejs/logger/logger.ts +10 -10
  175. package/src/resources/layers/common/tsconfig.json +7 -7
  176. package/src/resources/resources/iam/policyDocuments/cognitoPolicy.ts +54 -54
  177. package/src/resources/resources/iam/roles/createRole.ts +29 -29
  178. package/src/resources/route53/CreateZone.ts +61 -61
  179. package/src/resources/route53/create-zones.ts +40 -40
  180. package/src/resources/securityManager/index.ts +23 -23
  181. package/src/resources/sqs/create-sqs-resource.ts +26 -26
  182. package/tsconfig.json +46 -46
@@ -1,89 +1,89 @@
1
- import { Construct } from "constructs";
2
- import { BaseResource } from "../base/baseResource";
3
- import { ApiKeyProps, IApiKey, ApiKey as AWS_API_KEY, IRestApi, RestApi } from "aws-cdk-lib/aws-apigateway";
4
- import { AppConfig } from "../../config/AppConfig";
5
- import { CfnOutput, RemovalPolicy } from "aws-cdk-lib";
6
- import { UsagePlanProps } from "aws-cdk-lib/aws-apigateway";
7
-
8
- export class TsgApiKey extends BaseResource<AWS_API_KEY> {
9
-
10
-
11
- private api: RestApi;
12
- private apiKey: IApiKey;
13
-
14
- constructor(scope: Construct, config: AppConfig, api: RestApi) {
15
- super(scope, config);
16
-
17
- this.api = api;
18
-
19
- this.createdResources = this.createResource(scope);
20
-
21
- this.applyRemovalPolicy();
22
-
23
- this.createOutput(scope, this.createdResources);
24
- }
25
-
26
- get APIKey() {
27
- return this.apiKey;
28
- }
29
-
30
- public createResource(scope: Construct): AWS_API_KEY[] {
31
-
32
- const keyProps: ApiKeyProps = {
33
- apiKeyName: `${this.config.AppPrefix}-x-api-key`,
34
- resources: [this.api],
35
- value: `ddGTsLQrae2U6zTEjw4M07qO4pHGt60u73zImLHE`,
36
- enabled: true,
37
- description: `API App Key for ${this.config.AppName}`,
38
-
39
- };
40
-
41
- const apiKey = new AWS_API_KEY(scope, `${this.config.AppPrefix}-api-key`, keyProps);
42
-
43
- this.createUsagePlan(scope, this.config, this.api, apiKey);
44
-
45
- return [apiKey];
46
- }
47
-
48
- protected createOutput<T>(scope: Construct, createdAssets: T[]): void {
49
- this.createdResources.forEach((key, idx) => {
50
-
51
- new CfnOutput(scope, `api-key-${idx}`, {
52
- value: `${key.keyId}\t${key.keyArn}`
53
- });
54
- });
55
- }
56
-
57
- private applyRemovalPolicy() {
58
-
59
- const apiKey = this.createdResources[0];
60
-
61
- if (apiKey) {
62
- apiKey.applyRemovalPolicy(RemovalPolicy.DESTROY);
63
- }
64
- }
65
-
66
- private createUsagePlan(scope: Construct, config: AppConfig, api: RestApi, apiKey: AWS_API_KEY) {
67
-
68
- const planProps: UsagePlanProps = {
69
- name: `${config.AppName}-easy-plan`,
70
- throttle: {
71
- rateLimit: 1000,
72
- burstLimit: 10,
73
- },
74
- apiStages: [
75
- {
76
- api: api,
77
- stage: api.deploymentStage,
78
- },
79
- ],
80
- };
81
-
82
- const plan = api.addUsagePlan(
83
- `${config.AppPrefix}-${config.AppName}-usage-plan`,
84
- planProps
85
- );
86
-
87
- plan.addApiKey(apiKey);
88
- }
1
+ import { Construct } from "constructs";
2
+ import { BaseResource } from "../base/baseResource";
3
+ import { ApiKeyProps, IApiKey, ApiKey as AWS_API_KEY, IRestApi, RestApi } from "aws-cdk-lib/aws-apigateway";
4
+ import { AppConfig } from "../../config/AppConfig";
5
+ import { CfnOutput, RemovalPolicy } from "aws-cdk-lib";
6
+ import { UsagePlanProps } from "aws-cdk-lib/aws-apigateway";
7
+
8
+ export class TsgApiKey extends BaseResource<AWS_API_KEY> {
9
+
10
+
11
+ private api: RestApi;
12
+ private apiKey: IApiKey;
13
+
14
+ constructor(scope: Construct, config: AppConfig, api: RestApi) {
15
+ super(scope, config);
16
+
17
+ this.api = api;
18
+
19
+ this.createdResources = this.createResource(scope);
20
+
21
+ this.applyRemovalPolicy();
22
+
23
+ this.createOutput(scope, this.createdResources);
24
+ }
25
+
26
+ get APIKey() {
27
+ return this.apiKey;
28
+ }
29
+
30
+ public createResource(scope: Construct): AWS_API_KEY[] {
31
+
32
+ const keyProps: ApiKeyProps = {
33
+ apiKeyName: `${this.config.AppPrefix}-x-api-key`,
34
+ resources: [this.api],
35
+ value: `ddGTsLQrae2U6zTEjw4M07qO4pHGt60u73zImLHE`,
36
+ enabled: true,
37
+ description: `API App Key for ${this.config.AppName}`,
38
+
39
+ };
40
+
41
+ const apiKey = new AWS_API_KEY(scope, `${this.config.AppPrefix}-api-key`, keyProps);
42
+
43
+ this.createUsagePlan(scope, this.config, this.api, apiKey);
44
+
45
+ return [apiKey];
46
+ }
47
+
48
+ protected createOutput<T>(scope: Construct, createdAssets: T[]): void {
49
+ this.createdResources.forEach((key, idx) => {
50
+
51
+ new CfnOutput(scope, `api-key-${idx}`, {
52
+ value: `${key.keyId}\t${key.keyArn}`
53
+ });
54
+ });
55
+ }
56
+
57
+ private applyRemovalPolicy() {
58
+
59
+ const apiKey = this.createdResources[0];
60
+
61
+ if (apiKey) {
62
+ apiKey.applyRemovalPolicy(RemovalPolicy.DESTROY);
63
+ }
64
+ }
65
+
66
+ private createUsagePlan(scope: Construct, config: AppConfig, api: RestApi, apiKey: AWS_API_KEY) {
67
+
68
+ const planProps: UsagePlanProps = {
69
+ name: `${config.AppName}-easy-plan`,
70
+ throttle: {
71
+ rateLimit: 1000,
72
+ burstLimit: 10,
73
+ },
74
+ apiStages: [
75
+ {
76
+ api: api,
77
+ stage: api.deploymentStage,
78
+ },
79
+ ],
80
+ };
81
+
82
+ const plan = api.addUsagePlan(
83
+ `${config.AppPrefix}-${config.AppName}-usage-plan`,
84
+ planProps
85
+ );
86
+
87
+ plan.addApiKey(apiKey);
88
+ }
89
89
  }
@@ -1,18 +1,18 @@
1
- import { Construct } from "constructs";
2
- import { createLambdaLayer } from "../lambda-layer/createLambdaLayer";
3
- import { TsgLambdaLayerProp } from "../../config/types/TsgLambdaLayerProp";
4
- import { AppConfig } from "../../config/AppConfig";
5
-
6
- export const createCommonLayer = (scope: Construct, appProps: AppConfig) => {
7
-
8
- const prop: TsgLambdaLayerProp = {
9
- description: appProps.RESOURCES.LAMBDA_LAYERS![0].description,
10
- codePath: appProps.RESOURCES.LAMBDA_LAYERS![0].codePath,
11
- name: appProps.RESOURCES.LAMBDA_LAYERS![0].name,
12
- };
13
-
14
- const layer = createLambdaLayer(scope, appProps, prop)
15
-
16
- return [layer];
17
- };
18
-
1
+ import { Construct } from "constructs";
2
+ import { createLambdaLayer } from "../lambda-layer/createLambdaLayer";
3
+ import { TsgLambdaLayerProp } from "../../config/types/TsgLambdaLayerProp";
4
+ import { AppConfig } from "../../config/AppConfig";
5
+
6
+ export const createCommonLayer = (scope: Construct, appProps: AppConfig) => {
7
+
8
+ const prop: TsgLambdaLayerProp = {
9
+ description: appProps.RESOURCES.LAMBDA_LAYERS![0].description,
10
+ codePath: appProps.RESOURCES.LAMBDA_LAYERS![0].codePath,
11
+ name: appProps.RESOURCES.LAMBDA_LAYERS![0].name,
12
+ };
13
+
14
+ const layer = createLambdaLayer(scope, appProps, prop)
15
+
16
+ return [layer];
17
+ };
18
+
@@ -1,75 +1,75 @@
1
- import { AuthorizationType, IRestApi, LambdaIntegration, RequestAuthorizer, Resource, TokenAuthorizer } from "aws-cdk-lib/aws-apigateway";
2
- import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs";
3
- import { TsgLambdaProp } from "../../config/types";
4
- import { Logger } from "../../helpers/logger";
5
- import { logger } from "../layers/common/src/nodejs";
6
-
7
-
8
- export class Routes {
9
-
10
- public static Resources: Resource[] = [];
11
- private static routeMap = new Map();
12
-
13
- public static createResource(
14
- prop: TsgLambdaProp,
15
- api: IRestApi,
16
- lambdaNode: NodejsFunction,
17
- authorizer?: TokenAuthorizer | RequestAuthorizer,
18
- ): void {
19
-
20
- const routeMap: Map<string, Resource> = new Map();
21
-
22
- let activeRoutePath = "";
23
- let activeResource: Resource | undefined = undefined;
24
-
25
- // Only attach lambda to an Api Gateway if a route exist
26
- if (prop.apiGateway?.route) {
27
-
28
- if (!prop.apiGateway.useRouteOverride) {
29
- // First we create the root resource if it doesn't exist.
30
- // Note: this now uses the bundle version as the first segment in the path.
31
- activeRoutePath = `v${(prop.apiGateway?.version) ? prop.apiGateway.version : 1}`;
32
- activeResource = Routes.routeMap.get(activeRoutePath) || api.root.addResource(activeRoutePath);
33
- Routes.routeMap.set(activeRoutePath, activeResource);
34
- }
35
-
36
-
37
- // Now we go through our route segments creating the rest of the path.
38
- const pathSegments = prop.apiGateway?.route.split("/").filter(x => (x));
39
-
40
- for (let i = 0; i < pathSegments.length; i++) {
41
- activeRoutePath = `${activeRoutePath}/${pathSegments[i]}`;
42
- let secondaryResource = Routes.routeMap.get(activeRoutePath) || activeResource?.addResource(pathSegments[i]) || api.root.addResource(pathSegments[i]);
43
- Routes.routeMap.set(activeRoutePath, secondaryResource);
44
- activeResource = secondaryResource;
45
- }
46
-
47
- // console.log(`Route: ${prop.apiGateway.method}\t Lambda Name: ${lambdaNode.node.id}\t Path: ${activeRoutePath}`);
48
- // Finally, we attach our function to the last resource
49
- activeResource?.addMethod(prop.apiGateway.method || 'GET',
50
- new LambdaIntegration(lambdaNode, { proxy: true, }),
51
- {
52
- requestParameters: Routes.createQueryStringObject(prop.apiGateway.queryStrings),
53
- apiKeyRequired: (prop.apiGateway.requireApiKey) ? true : false,
54
- authorizer: prop.apiGateway.secure ? authorizer : undefined,
55
- authorizationType: prop.apiGateway.secure ? AuthorizationType.CUSTOM : undefined,
56
- });
57
- }
58
- }
59
-
60
- public static createQueryStringObject(queryStrings: string[] | undefined): { [key: string]: boolean } {
61
-
62
- if (!queryStrings || queryStrings.length === 0) {
63
- return {};
64
- }
65
-
66
- const obj: { [key: string]: boolean } = {};
67
-
68
- queryStrings.forEach((qs: string) => {
69
- obj[`method.request.querystring.${qs}`] = true;
70
- });
71
-
72
- return obj;
73
- }
74
-
1
+ import { AuthorizationType, IRestApi, LambdaIntegration, RequestAuthorizer, Resource, TokenAuthorizer } from "aws-cdk-lib/aws-apigateway";
2
+ import { NodejsFunction } from "aws-cdk-lib/aws-lambda-nodejs";
3
+ import { TsgLambdaProp } from "../../config/types";
4
+ import { Logger } from "../../helpers/logger";
5
+ import { logger } from "../layers/common/src/nodejs";
6
+
7
+
8
+ export class Routes {
9
+
10
+ public static Resources: Resource[] = [];
11
+ private static routeMap = new Map();
12
+
13
+ public static createResource(
14
+ prop: TsgLambdaProp,
15
+ api: IRestApi,
16
+ lambdaNode: NodejsFunction,
17
+ authorizer?: TokenAuthorizer | RequestAuthorizer,
18
+ ): void {
19
+
20
+ const routeMap: Map<string, Resource> = new Map();
21
+
22
+ let activeRoutePath = "";
23
+ let activeResource: Resource | undefined = undefined;
24
+
25
+ // Only attach lambda to an Api Gateway if a route exist
26
+ if (prop.apiGateway?.route) {
27
+
28
+ if (!prop.apiGateway.useRouteOverride) {
29
+ // First we create the root resource if it doesn't exist.
30
+ // Note: this now uses the bundle version as the first segment in the path.
31
+ activeRoutePath = `v${(prop.apiGateway?.version) ? prop.apiGateway.version : 1}`;
32
+ activeResource = Routes.routeMap.get(activeRoutePath) || api.root.addResource(activeRoutePath);
33
+ Routes.routeMap.set(activeRoutePath, activeResource);
34
+ }
35
+
36
+
37
+ // Now we go through our route segments creating the rest of the path.
38
+ const pathSegments = prop.apiGateway?.route.split("/").filter(x => (x));
39
+
40
+ for (let i = 0; i < pathSegments.length; i++) {
41
+ activeRoutePath = `${activeRoutePath}/${pathSegments[i]}`;
42
+ let secondaryResource = Routes.routeMap.get(activeRoutePath) || activeResource?.addResource(pathSegments[i]) || api.root.addResource(pathSegments[i]);
43
+ Routes.routeMap.set(activeRoutePath, secondaryResource);
44
+ activeResource = secondaryResource;
45
+ }
46
+
47
+ // console.log(`Route: ${prop.apiGateway.method}\t Lambda Name: ${lambdaNode.node.id}\t Path: ${activeRoutePath}`);
48
+ // Finally, we attach our function to the last resource
49
+ activeResource?.addMethod(prop.apiGateway.method || 'GET',
50
+ new LambdaIntegration(lambdaNode, { proxy: true, }),
51
+ {
52
+ requestParameters: Routes.createQueryStringObject(prop.apiGateway.queryStrings),
53
+ apiKeyRequired: (prop.apiGateway.requireApiKey) ? true : false,
54
+ authorizer: prop.apiGateway.secure ? authorizer : undefined,
55
+ authorizationType: prop.apiGateway.secure ? AuthorizationType.CUSTOM : undefined,
56
+ });
57
+ }
58
+ }
59
+
60
+ public static createQueryStringObject(queryStrings: string[] | undefined): { [key: string]: boolean } {
61
+
62
+ if (!queryStrings || queryStrings.length === 0) {
63
+ return {};
64
+ }
65
+
66
+ const obj: { [key: string]: boolean } = {};
67
+
68
+ queryStrings.forEach((qs: string) => {
69
+ obj[`method.request.querystring.${qs}`] = true;
70
+ });
71
+
72
+ return obj;
73
+ }
74
+
75
75
  }
@@ -1 +1 @@
1
- export { CreateCertificate } from "./certificate/createCertificate";
1
+ export { CreateCertificate } from "./certificate/createCertificate";
@@ -1,124 +1,124 @@
1
- import { Duration } from "aws-cdk-lib";
2
- import { ServicePrincipal } from "aws-cdk-lib/aws-iam";
3
- import { LayerVersion, Runtime } from "aws-cdk-lib/aws-lambda";
4
- import {
5
- NodejsFunction,
6
- NodejsFunctionProps,
7
- SourceMapMode,
8
- } from "aws-cdk-lib/aws-lambda-nodejs";
9
- import { RetentionDays } from "aws-cdk-lib/aws-logs";
10
- import path = require("path");
11
- import { LambdaProps } from "../../interfaces/lambda";
12
- import { Construct } from "constructs";
13
- import { Table } from "aws-cdk-lib/aws-dynamodb";
14
-
15
- export const createBasicLambda = (
16
- scope: Construct,
17
- props: LambdaProps
18
- ): NodejsFunction => {
19
- const lambdaProps = createBasicLambdaProps(props);
20
-
21
- let lambdaFunction = new NodejsFunction(
22
- scope,
23
- `${props.appPrefix || ""}${props.functionName}`,
24
- lambdaProps
25
- );
26
-
27
- grantAccessToDynamoTables(scope, lambdaFunction, props.dynamoTableNames);
28
-
29
- addLambdaLayers(scope, lambdaFunction, props.lambdaLayerArn);
30
-
31
- return lambdaFunction;
32
- };
33
-
34
- const createBasicLambdaProps = (props: LambdaProps): NodejsFunctionProps => {
35
- let resolvedEntry: string;
36
-
37
- if (props.codePath && path.isAbsolute(props.codePath)) {
38
- resolvedEntry = props.codePath;
39
- } else if (props.codePath && props.projectRoot) {
40
- // codePath is relative, resolve from current directory + projectRoot
41
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
42
- } else if (props.projectRoot) {
43
- // No codePath, use default path with projectRoot
44
- resolvedEntry = path.resolve(
45
- process.cwd(),
46
- props.projectRoot,
47
- `resources/lambdas/${props.functionName}/main.mts`
48
- );
49
- } else if (props.codePath) {
50
- // codePath without projectRoot
51
- resolvedEntry = path.resolve(process.cwd(), props.codePath);
52
- } else {
53
- // Default path without projectRoot
54
- resolvedEntry = path.join(
55
- `./resources/lambdas/${props.functionName}/main.mts`
56
- );
57
- }
58
-
59
- const lambdaProp: NodejsFunctionProps = {
60
- entry: resolvedEntry,
61
- functionName: `${props.appPrefix ? `${props.appPrefix}-` : ""}${
62
- props.functionName
63
- }`,
64
- handler: "main.ts",
65
- logRetention: RetentionDays.TWO_WEEKS,
66
- runtime: Runtime.NODEJS_LATEST,
67
- timeout: Duration.minutes(
68
- props.timeoutInMinutes ? props.timeoutInMinutes : 1
69
- ),
70
- memorySize: props.memory,
71
- environment: {
72
- ...props.envs,
73
- },
74
- bundling: {
75
- minify: true,
76
- target: `esnext`,
77
- sourceMap: true,
78
- sourceMapMode: SourceMapMode.EXTERNAL,
79
- environment: {
80
- ...props.envs,
81
- },
82
- ...(props.projectRoot && { projectRoot: props.projectRoot }),
83
- ...(props.depsLockFilePath && {
84
- depsLockFilePath: props.depsLockFilePath,
85
- }),
86
- },
87
- role: props.role,
88
- layers: undefined,
89
- };
90
-
91
- return lambdaProp;
92
- };
93
-
94
- const grantAccessToDynamoTables = (
95
- scope: Construct,
96
- lambda: NodejsFunction,
97
- tableNames?: string[]
98
- ) => {
99
- if (tableNames && tableNames.length > 0) {
100
- tableNames.forEach((tableName) => {
101
- const table = Table.fromTableName(scope, `${tableName}-table`, tableName);
102
-
103
- table.grantReadWriteData(lambda);
104
- });
105
- }
106
- };
107
-
108
- const addLambdaLayers = (
109
- scope: Construct,
110
- lambda: NodejsFunction,
111
- layerArns?: string[]
112
- ) => {
113
- if (layerArns && layerArns.length > 0) {
114
- layerArns.forEach((arn: string, idx: number) => {
115
- const layer = LayerVersion.fromLayerVersionArn(
116
- scope,
117
- `common-layer-${idx}`,
118
- arn
119
- );
120
-
121
- lambda.addLayers(layer);
122
- });
123
- }
124
- };
1
+ import { Duration } from "aws-cdk-lib";
2
+ import { ServicePrincipal } from "aws-cdk-lib/aws-iam";
3
+ import { LayerVersion, Runtime } from "aws-cdk-lib/aws-lambda";
4
+ import {
5
+ NodejsFunction,
6
+ NodejsFunctionProps,
7
+ SourceMapMode,
8
+ } from "aws-cdk-lib/aws-lambda-nodejs";
9
+ import { RetentionDays } from "aws-cdk-lib/aws-logs";
10
+ import path = require("path");
11
+ import { LambdaProps } from "../../interfaces/lambda";
12
+ import { Construct } from "constructs";
13
+ import { Table } from "aws-cdk-lib/aws-dynamodb";
14
+
15
+ export const createBasicLambda = (
16
+ scope: Construct,
17
+ props: LambdaProps,
18
+ ): NodejsFunction => {
19
+ const lambdaProps = createBasicLambdaProps(props);
20
+
21
+ let lambdaFunction = new NodejsFunction(
22
+ scope,
23
+ `${props.appPrefix || ""}${props.functionName}`,
24
+ lambdaProps,
25
+ );
26
+
27
+ grantAccessToDynamoTables(scope, lambdaFunction, props.dynamoTableNames);
28
+
29
+ addLambdaLayers(scope, lambdaFunction, props.lambdaLayerArn);
30
+
31
+ return lambdaFunction;
32
+ };
33
+
34
+ const createBasicLambdaProps = (props: LambdaProps): NodejsFunctionProps => {
35
+ let resolvedEntry: string;
36
+
37
+ if (props.codePath && path.isAbsolute(props.codePath)) {
38
+ resolvedEntry = props.codePath;
39
+ } else if (props.codePath && props.projectRoot) {
40
+ // codePath is relative, resolve from current directory + projectRoot
41
+ resolvedEntry = path.resolve(process.cwd(), props.codePath);
42
+ } else if (props.projectRoot) {
43
+ // No codePath, use default path with projectRoot
44
+ resolvedEntry = path.resolve(
45
+ process.cwd(),
46
+ props.projectRoot,
47
+ `resources/lambdas/${props.functionName}/main.mts`,
48
+ );
49
+ } else if (props.codePath) {
50
+ // codePath without projectRoot
51
+ resolvedEntry = path.resolve(process.cwd(), props.codePath);
52
+ } else {
53
+ // Default path without projectRoot
54
+ resolvedEntry = path.join(
55
+ `./resources/lambdas/${props.functionName}/main.mts`,
56
+ );
57
+ }
58
+
59
+ const lambdaProp: NodejsFunctionProps = {
60
+ entry: resolvedEntry,
61
+ functionName: `${props.appPrefix ? `${props.appPrefix}-` : ""}${
62
+ props.functionName
63
+ }`,
64
+ handler: "main",
65
+ logRetention: RetentionDays.TWO_WEEKS,
66
+ runtime: Runtime.NODEJS_LATEST,
67
+ timeout: Duration.minutes(
68
+ props.timeoutInMinutes ? props.timeoutInMinutes : 1,
69
+ ),
70
+ memorySize: props.memory,
71
+ environment: {
72
+ ...props.envs,
73
+ },
74
+ bundling: {
75
+ minify: true,
76
+ target: `esnext`,
77
+ sourceMap: true,
78
+ sourceMapMode: SourceMapMode.EXTERNAL,
79
+ environment: {
80
+ ...props.envs,
81
+ },
82
+ ...(props.projectRoot && { projectRoot: props.projectRoot }),
83
+ ...(props.depsLockFilePath && {
84
+ depsLockFilePath: props.depsLockFilePath,
85
+ }),
86
+ },
87
+ role: props.role,
88
+ layers: undefined,
89
+ };
90
+
91
+ return lambdaProp;
92
+ };
93
+
94
+ const grantAccessToDynamoTables = (
95
+ scope: Construct,
96
+ lambda: NodejsFunction,
97
+ tableNames?: string[],
98
+ ) => {
99
+ if (tableNames && tableNames.length > 0) {
100
+ tableNames.forEach((tableName) => {
101
+ const table = Table.fromTableName(scope, `${tableName}-table`, tableName);
102
+
103
+ table.grantReadWriteData(lambda);
104
+ });
105
+ }
106
+ };
107
+
108
+ const addLambdaLayers = (
109
+ scope: Construct,
110
+ lambda: NodejsFunction,
111
+ layerArns?: string[],
112
+ ) => {
113
+ if (layerArns && layerArns.length > 0) {
114
+ layerArns.forEach((arn: string, idx: number) => {
115
+ const layer = LayerVersion.fromLayerVersionArn(
116
+ scope,
117
+ `common-layer-${idx}`,
118
+ arn,
119
+ );
120
+
121
+ lambda.addLayers(layer);
122
+ });
123
+ }
124
+ };