@trunkrs/common 1.5.7 → 1.5.11

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 (67) hide show
  1. package/models/email/Attachment.d.ts +8 -0
  2. package/models/email/Attachment.js +3 -0
  3. package/models/email/Attachment.js.map +1 -0
  4. package/models/email/EmailContent.d.ts +6 -0
  5. package/models/email/EmailContent.js +3 -0
  6. package/models/email/EmailContent.js.map +1 -0
  7. package/models/email/Template.d.ts +7 -0
  8. package/models/email/Template.js +3 -0
  9. package/models/email/Template.js.map +1 -0
  10. package/models/email/index.d.ts +3 -0
  11. package/models/email/index.js +3 -0
  12. package/models/email/index.js.map +1 -0
  13. package/models/enum/Environment.d.ts +6 -0
  14. package/models/enum/Environment.js +10 -0
  15. package/models/enum/Environment.js.map +1 -0
  16. package/models/errors/email/EmailValidationError.d.ts +5 -0
  17. package/models/errors/email/EmailValidationError.js +14 -0
  18. package/models/errors/email/EmailValidationError.js.map +1 -0
  19. package/models/errors/email/TemplateNotFoundError.d.ts +5 -0
  20. package/models/errors/email/TemplateNotFoundError.js +14 -0
  21. package/models/errors/email/TemplateNotFoundError.js.map +1 -0
  22. package/models/errors/email/index.d.ts +2 -0
  23. package/models/errors/email/index.js +11 -0
  24. package/models/errors/email/index.js.map +1 -0
  25. package/package.json +6 -5
  26. package/providers/auth0.js +1 -0
  27. package/providers/auth0.js.map +1 -1
  28. package/providers/aws.js.map +1 -1
  29. package/providers/email.d.ts +17 -0
  30. package/providers/email.js +59 -0
  31. package/providers/email.js.map +1 -0
  32. package/services/aws/dynamodb/utils/operators/And.js +1 -1
  33. package/services/aws/dynamodb/utils/operators/And.js.map +1 -1
  34. package/services/client/AxiosClient.js +8 -4
  35. package/services/client/AxiosClient.js.map +1 -1
  36. package/services/email/EmailClient/index.d.ts +10 -0
  37. package/services/email/EmailClient/index.js +39 -0
  38. package/services/email/EmailClient/index.js.map +1 -0
  39. package/services/email/EmailClient/models.d.ts +16 -0
  40. package/services/email/EmailClient/models.js +3 -0
  41. package/services/email/EmailClient/models.js.map +1 -0
  42. package/services/email/NodemailerEmailClient.d.ts +19 -0
  43. package/services/email/NodemailerEmailClient.js +55 -0
  44. package/services/email/NodemailerEmailClient.js.map +1 -0
  45. package/services/email/SESTemplateClient.d.ts +16 -0
  46. package/services/email/SESTemplateClient.js +62 -0
  47. package/services/email/SESTemplateClient.js.map +1 -0
  48. package/services/email/TemplateClient.d.ts +6 -0
  49. package/services/email/TemplateClient.js +12 -0
  50. package/services/email/TemplateClient.js.map +1 -0
  51. package/services/email/__tests__/NodemailerEmailClient.spec.d.ts +1 -0
  52. package/services/email/__tests__/NodemailerEmailClient.spec.js +83 -0
  53. package/services/email/__tests__/NodemailerEmailClient.spec.js.map +1 -0
  54. package/services/email/__tests__/SESTemplateClient.spec.d.ts +1 -0
  55. package/services/email/__tests__/SESTemplateClient.spec.js +55 -0
  56. package/services/email/__tests__/SESTemplateClient.spec.js.map +1 -0
  57. package/services/email/index.d.ts +4 -0
  58. package/services/email/index.js +15 -0
  59. package/services/email/index.js.map +1 -0
  60. package/services/queue/QueueClient/models.d.ts +1 -0
  61. package/services/queue/SNSQueueClient.d.ts +2 -1
  62. package/services/queue/SNSQueueClient.js +31 -12
  63. package/services/queue/SNSQueueClient.js.map +1 -1
  64. package/utils/caching/GlobalAtomicCache.js +13 -0
  65. package/utils/caching/GlobalAtomicCache.js.map +1 -1
  66. package/utils/caching/SecretCache.js +7 -0
  67. package/utils/caching/SecretCache.js.map +1 -1
@@ -0,0 +1,8 @@
1
+ /// <reference types="node" />
2
+ import { MimeType } from '../enum';
3
+ interface Attachment {
4
+ fileName: string;
5
+ data: Buffer;
6
+ mimeType: MimeType;
7
+ }
8
+ export default Attachment;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Attachment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Attachment.js","sourceRoot":"","sources":["../../../models/email/Attachment.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ interface EmailContent {
2
+ html?: string;
3
+ text?: string;
4
+ subject?: string;
5
+ }
6
+ export default EmailContent;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=EmailContent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailContent.js","sourceRoot":"","sources":["../../../models/email/EmailContent.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ interface Template {
2
+ name: string;
3
+ subject?: string;
4
+ html?: string;
5
+ text?: string;
6
+ }
7
+ export default Template;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=Template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Template.js","sourceRoot":"","sources":["../../../models/email/Template.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export { default as Attachment } from './Attachment';
2
+ export { default as EmailContent } from './EmailContent';
3
+ export { default as Template } from './Template';
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../models/email/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ declare enum Environment {
2
+ Dev = "dev",
3
+ QA = "qa",
4
+ Prod = "prod"
5
+ }
6
+ export default Environment;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var Environment;
4
+ (function (Environment) {
5
+ Environment["Dev"] = "dev";
6
+ Environment["QA"] = "qa";
7
+ Environment["Prod"] = "prod";
8
+ })(Environment || (Environment = {}));
9
+ exports.default = Environment;
10
+ //# sourceMappingURL=Environment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Environment.js","sourceRoot":"","sources":["../../../models/enum/Environment.ts"],"names":[],"mappings":";;AAAA,IAAK,WAIJ;AAJD,WAAK,WAAW;IACd,0BAAW,CAAA;IACX,wBAAS,CAAA;IACT,4BAAa,CAAA;AACf,CAAC,EAJI,WAAW,KAAX,WAAW,QAIf;AAED,kBAAe,WAAW,CAAA"}
@@ -0,0 +1,5 @@
1
+ import ErrorBase from '../ErrorBase';
2
+ declare class EmailValidationError extends ErrorBase {
3
+ constructor();
4
+ }
5
+ export default EmailValidationError;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ErrorBase_1 = __importDefault(require("../ErrorBase"));
7
+ class EmailValidationError extends ErrorBase_1.default {
8
+ constructor() {
9
+ super();
10
+ this.message = `Email is either missing a subject and/or a body, or recipient/s are from an invalid domain.`;
11
+ }
12
+ }
13
+ exports.default = EmailValidationError;
14
+ //# sourceMappingURL=EmailValidationError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EmailValidationError.js","sourceRoot":"","sources":["../../../../models/errors/email/EmailValidationError.ts"],"names":[],"mappings":";;;;;AAAA,6DAAoC;AAEpC,MAAM,oBAAqB,SAAQ,mBAAS;IAC1C;QACE,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,OAAO,GAAG,6FAA6F,CAAA;IAC9G,CAAC;CACF;AAED,kBAAe,oBAAoB,CAAA"}
@@ -0,0 +1,5 @@
1
+ import ErrorBase from '../ErrorBase';
2
+ declare class TemplateNotFoundError extends ErrorBase {
3
+ constructor(identifier: string);
4
+ }
5
+ export default TemplateNotFoundError;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const ErrorBase_1 = __importDefault(require("../ErrorBase"));
7
+ class TemplateNotFoundError extends ErrorBase_1.default {
8
+ constructor(identifier) {
9
+ super();
10
+ this.message = `The template: ${identifier} could not be found.`;
11
+ }
12
+ }
13
+ exports.default = TemplateNotFoundError;
14
+ //# sourceMappingURL=TemplateNotFoundError.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateNotFoundError.js","sourceRoot":"","sources":["../../../../models/errors/email/TemplateNotFoundError.ts"],"names":[],"mappings":";;;;;AAAA,6DAAoC;AAEpC,MAAM,qBAAsB,SAAQ,mBAAS;IAC3C,YAAmB,UAAkB;QACnC,KAAK,EAAE,CAAA;QAEP,IAAI,CAAC,OAAO,GAAG,iBAAiB,UAAU,sBAAsB,CAAA;IAClE,CAAC;CACF;AAED,kBAAe,qBAAqB,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { default as NoEmailBodyError } from './EmailValidationError';
2
+ export { default as TemplateNotFoundError } from './TemplateNotFoundError';
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TemplateNotFoundError = exports.NoEmailBodyError = void 0;
7
+ var EmailValidationError_1 = require("./EmailValidationError");
8
+ Object.defineProperty(exports, "NoEmailBodyError", { enumerable: true, get: function () { return __importDefault(EmailValidationError_1).default; } });
9
+ var TemplateNotFoundError_1 = require("./TemplateNotFoundError");
10
+ Object.defineProperty(exports, "TemplateNotFoundError", { enumerable: true, get: function () { return __importDefault(TemplateNotFoundError_1).default; } });
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../models/errors/email/index.ts"],"names":[],"mappings":";;;;;;AAAA,+DAAoE;AAA3D,yIAAA,OAAO,OAAoB;AACpC,iEAA0E;AAAjE,+IAAA,OAAO,OAAyB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@trunkrs/common",
3
- "version": "1.5.7",
3
+ "version": "1.5.11",
4
4
  "description": "Common standards library for development in Trunkrs",
5
5
  "types": "./index.d.ts",
6
6
  "repository": "https://github.com/Trunkrs/common.git",
@@ -12,21 +12,22 @@
12
12
  "deepmerge": "^4.2.2"
13
13
  },
14
14
  "devDependencies": {
15
- "@types/aws-lambda": "^8.10.83",
15
+ "@types/aws-lambda": "^8.10.92",
16
16
  "@types/faker": "^5.5.8",
17
17
  "@types/jest": "^27.0.1",
18
18
  "@types/joi": "^17.2.3",
19
19
  "@types/node": "^14.11.2",
20
+ "@types/nodemailer": "^6.4.4",
20
21
  "@types/qs": "^6.9.7",
21
22
  "@types/typescript": "^2.0.0",
22
23
  "@types/uuid": "^8.3.1",
23
24
  "@typescript-eslint/eslint-plugin": "^4.0.1",
24
25
  "@typescript-eslint/parser": "^4.0.1",
25
- "eslint-config-airbnb-base-typescript-prettier": "^3.1.1",
26
- "eslint-config-airbnb-typescript-prettier": "^4.1.0",
27
26
  "aws-lambda": "^1.0.6",
28
27
  "concurrently": "^6.2.1",
29
28
  "eslint": "^7.10.0",
29
+ "eslint-config-airbnb-base-typescript-prettier": "^3.1.1",
30
+ "eslint-config-airbnb-typescript-prettier": "^4.1.0",
30
31
  "faker": "^5.5.3",
31
32
  "husky": "^4.3.0",
32
33
  "jest": "^27.0.5",
@@ -46,7 +47,7 @@
46
47
  "peerDependencies": {
47
48
  "@typescript-eslint/eslint-plugin": ">=4 || <5",
48
49
  "@typescript-eslint/parser": ">=4 || <5",
49
- "aws-sdk": ">2.900.0 || <3",
50
+ "aws-sdk": ">2.1000.0 || <3",
50
51
  "date-fns": ">=2 || <3",
51
52
  "eslint": ">=7.2.0",
52
53
  "eslint-config-airbnb-base-typescript-prettier": ">=3.1 || <4",
@@ -34,6 +34,7 @@ exports.Auth0MachineTokenClient = service_provider_1.default.createSymbol('Auth0
34
34
  const configureAuth0Service = (baseUrl, appClientSecretName, tokenCacheStoreName, tokenCacheMountPath) => {
35
35
  const serviceProvider = new service_provider_1.default((0, caching_1.configureDailyTokenCache)(tokenCacheStoreName, tokenCacheMountPath));
36
36
  serviceProvider.register(exports.Auth0MachineTokenClient, service_provider_1.Lifecycle.Singleton, () => new client_1.MachineTokenClient(appClientSecretName, aws_1.default.provide(aws_2.SecretsClient), utils_1.default.provide(client_1.OAuthClient), utils_1.default.provide(utils_1.Serializer)));
37
+ utils_1.default.provide(utils_1.Logger);
37
38
  serviceProvider.register(exports.Auth0MachineClient, service_provider_1.Lifecycle.Singleton, () => new client_1.MachineClient(serviceProvider.provide(exports.Auth0MachineTokenClient), utils_1.default.provide(utils_1.HttpClient), serviceProvider.provide(caching_1.DailyTokenCache), appClientSecretName, baseUrl));
38
39
  return serviceProvider;
39
40
  };
@@ -1 +1 @@
1
- {"version":3,"file":"auth0.js","sourceRoot":"","sources":["../../providers/auth0.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8EAAsE;AAEtE,+CAI2B;AAC3B,iDAA+D;AAE/D,uCAAqE;AACrE,gDAA+B;AAC/B,yCAA+C;AAElC,QAAA,kBAAkB,GAC7B,0BAAe,CAAC,YAAY,CAAgB,oBAAoB,CAAC,CAAA;AAEtD,QAAA,uBAAuB,GAClC,0BAAe,CAAC,YAAY,CAAqB,yBAAyB,CAAC,CAAA;AAStE,MAAM,qBAAqB,GAAG,CACnC,OAAe,EACf,mBAA2B,EAC3B,mBAA2B,EAC3B,mBAA2B,EACV,EAAE;IACnB,MAAM,eAAe,GAAG,IAAI,0BAAe,CACzC,IAAA,kCAAwB,EAAC,mBAAmB,EAAE,mBAAmB,CAAC,CACnE,CAAA;IAED,eAAe,CAAC,QAAQ,CACtB,+BAAuB,EACvB,4BAAS,CAAC,SAAS,EACnB,GAAG,EAAE,CACH,IAAI,2BAAkB,CACpB,mBAAmB,EACnB,aAAW,CAAC,OAAO,CAAC,mBAAa,CAAC,EAClC,eAAa,CAAC,OAAO,CAAC,oBAAW,CAAC,EAClC,eAAa,CAAC,OAAO,CAAC,kBAAU,CAAC,CAClC,CACJ,CAAA;IAED,eAAe,CAAC,QAAQ,CACtB,0BAAkB,EAClB,4BAAS,CAAC,SAAS,EACnB,GAAG,EAAE,CACH,IAAI,sBAAa,CACf,eAAe,CAAC,OAAO,CAAC,+BAAuB,CAAC,EAChD,eAAa,CAAC,OAAO,CAAC,kBAAU,CAAC,EACjC,eAAe,CAAC,OAAO,CAAC,yBAAe,CAAC,EACxC,mBAAmB,EACnB,OAAO,CACR,CACJ,CAAA;IAED,OAAO,eAAe,CAAA;AACxB,CAAC,CAAA;AApCY,QAAA,qBAAqB,yBAoCjC"}
1
+ {"version":3,"file":"auth0.js","sourceRoot":"","sources":["../../providers/auth0.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8EAAsE;AAEtE,+CAI2B;AAC3B,iDAAuE;AAEvE,uCAAqE;AACrE,gDAA+B;AAC/B,yCAA+C;AAElC,QAAA,kBAAkB,GAC7B,0BAAe,CAAC,YAAY,CAAgB,oBAAoB,CAAC,CAAA;AAEtD,QAAA,uBAAuB,GAClC,0BAAe,CAAC,YAAY,CAAqB,yBAAyB,CAAC,CAAA;AAStE,MAAM,qBAAqB,GAAG,CACnC,OAAe,EACf,mBAA2B,EAC3B,mBAA2B,EAC3B,mBAA2B,EACV,EAAE;IACnB,MAAM,eAAe,GAAG,IAAI,0BAAe,CACzC,IAAA,kCAAwB,EAAC,mBAAmB,EAAE,mBAAmB,CAAC,CACnE,CAAA;IAED,eAAe,CAAC,QAAQ,CACtB,+BAAuB,EACvB,4BAAS,CAAC,SAAS,EACnB,GAAG,EAAE,CACH,IAAI,2BAAkB,CACpB,mBAAmB,EACnB,aAAW,CAAC,OAAO,CAAC,mBAAa,CAAC,EAClC,eAAa,CAAC,OAAO,CAAC,oBAAW,CAAC,EAClC,eAAa,CAAC,OAAO,CAAC,kBAAU,CAAC,CAClC,CACJ,CAAA;IAED,eAAa,CAAC,OAAO,CAAC,cAAM,CAAC,CAAA;IAE7B,eAAe,CAAC,QAAQ,CACtB,0BAAkB,EAClB,4BAAS,CAAC,SAAS,EACnB,GAAG,EAAE,CACH,IAAI,sBAAa,CACf,eAAe,CAAC,OAAO,CAAC,+BAAuB,CAAC,EAChD,eAAa,CAAC,OAAO,CAAC,kBAAU,CAAC,EACjC,eAAe,CAAC,OAAO,CAAC,yBAAe,CAAC,EACxC,mBAAmB,EACnB,OAAO,CACR,CACJ,CAAA;IAED,OAAO,eAAe,CAAA;AACxB,CAAC,CAAA;AAtCY,QAAA,qBAAqB,yBAsCjC"}
@@ -1 +1 @@
1
- {"version":3,"file":"aws.js","sourceRoot":"","sources":["../../providers/aws.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAAA,8EAAsE;AAEtE,kFAAyD;AACzD,8CAA8C;AAE9C,oDAAmC;AAEnC,MAAM,WAAW,GAAG,IAAI,0BAAe,EAAE,CAAA;AAEzC,WAAW,CAAC,QAAQ,CAClB,uBAAa,EACb,4BAAS,CAAC,SAAS,EACnB,GAAG,EAAE,CAAC,IAAI,uBAAa,CAAC,eAAa,CAAC,OAAO,CAAC,qBAAW,CAAC,CAAC,CAC5D,CAAA;AAED,kBAAe,WAAW,CAAA"}
1
+ {"version":3,"file":"aws.js","sourceRoot":"","sources":["../../providers/aws.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AACA,8EAAsE;AAEtE,kFAAyD;AACzD,8CAA8C;AAE9C,oDAAmC;AAEnC,MAAM,WAAW,GAAG,IAAI,0BAAe,EAAE,CAAA;AAEzC,WAAW,CAAC,QAAQ,CAClB,uBAAa,EACb,4BAAS,CAAC,SAAS,EACnB,GAAG,EAAE,CAAC,IAAI,uBAAa,CAAC,eAAa,CAAC,OAAO,CAAC,qBAAW,CAAC,CAAC,CAC5D,CAAA;AAED,kBAAe,WAAW,CAAA"}
@@ -0,0 +1,17 @@
1
+ import ServiceProvider from '../utils/service-provider';
2
+ import { RecipientValidationConfig } from '../services/email/EmailClient/models';
3
+ import Environment from '../models/enum/Environment';
4
+ export interface ConfigureEmailClientsRequest {
5
+ from: string;
6
+ templateCacheMountPath: string;
7
+ sesRegion: string;
8
+ stage: Environment;
9
+ requireBody?: boolean;
10
+ requireSubject?: boolean;
11
+ sourceArn?: string;
12
+ validateRecipientDomains?: RecipientValidationConfig;
13
+ }
14
+ export declare const NodemailerClient: symbol;
15
+ export declare const SesNodemailerClient: symbol;
16
+ export declare const TemplateFileCache: symbol;
17
+ export declare const configureEmailClients: (request: ConfigureEmailClientsRequest) => ServiceProvider;
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5
+ }) : (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ o[k2] = m[k];
8
+ }));
9
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
11
+ }) : function(o, v) {
12
+ o["default"] = v;
13
+ });
14
+ var __importStar = (this && this.__importStar) || function (mod) {
15
+ if (mod && mod.__esModule) return mod;
16
+ var result = {};
17
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18
+ __setModuleDefault(result, mod);
19
+ return result;
20
+ };
21
+ var __importDefault = (this && this.__importDefault) || function (mod) {
22
+ return (mod && mod.__esModule) ? mod : { "default": mod };
23
+ };
24
+ Object.defineProperty(exports, "__esModule", { value: true });
25
+ exports.configureEmailClients = exports.TemplateFileCache = exports.SesNodemailerClient = exports.NodemailerClient = void 0;
26
+ const nodemailer_1 = require("nodemailer");
27
+ const aws_sdk_1 = require("aws-sdk");
28
+ const service_provider_1 = __importStar(require("../utils/service-provider"));
29
+ const aws_1 = __importDefault(require("./aws"));
30
+ const email_1 = require("../services/email");
31
+ const caching_1 = require("../utils/caching");
32
+ const utils_1 = __importStar(require("./utils"));
33
+ exports.NodemailerClient = service_provider_1.default.createSymbol('NodemailerClient');
34
+ exports.SesNodemailerClient = service_provider_1.default.createSymbol('SesNodemailerClient');
35
+ exports.TemplateFileCache = service_provider_1.default.createSymbol('TemplateCache');
36
+ const configureEmailClients = (request) => {
37
+ const serviceProvider = new service_provider_1.default();
38
+ serviceProvider.register(exports.NodemailerClient, service_provider_1.Lifecycle.Singleton, () => (0, nodemailer_1.createTransport)({
39
+ SES: aws_1.default.provide(aws_sdk_1.SES),
40
+ }));
41
+ serviceProvider.register(exports.TemplateFileCache, service_provider_1.Lifecycle.Singleton, () => new caching_1.FileCache(utils_1.default.provide(utils_1.Serializer), 7200000, null, request.templateCacheMountPath));
42
+ aws_1.default.register(aws_sdk_1.SES, service_provider_1.Lifecycle.Singleton, () => new aws_sdk_1.SES({
43
+ region: request.sesRegion,
44
+ }));
45
+ serviceProvider.register(email_1.SESTemplateClient, service_provider_1.Lifecycle.Singleton, () => new email_1.SESTemplateClient(aws_1.default.provide(aws_sdk_1.SES), serviceProvider.provide(exports.TemplateFileCache)));
46
+ serviceProvider.register(exports.SesNodemailerClient, service_provider_1.Lifecycle.Singleton, () => new email_1.NodemailerEmailClient({
47
+ mailer: serviceProvider.provide(exports.NodemailerClient),
48
+ templateClient: serviceProvider.provide(email_1.SESTemplateClient),
49
+ stage: request.stage,
50
+ from: request.from,
51
+ requireBody: request.requireBody || true,
52
+ requireSubject: request.requireSubject || true,
53
+ sourceArn: request.sourceArn,
54
+ validateRecipientDomains: request.validateRecipientDomains,
55
+ }));
56
+ return serviceProvider;
57
+ };
58
+ exports.configureEmailClients = configureEmailClients;
59
+ //# sourceMappingURL=email.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"email.js","sourceRoot":"","sources":["../../providers/email.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA4C;AAE5C,qCAA6B;AAC7B,8EAAsE;AAEtE,gDAA+B;AAC/B,6CAI0B;AAC1B,8CAAmD;AACnD,iDAAmD;AActC,QAAA,gBAAgB,GAC3B,0BAAe,CAAC,YAAY,CAAO,kBAAkB,CAAC,CAAA;AAE3C,QAAA,mBAAmB,GAAG,0BAAe,CAAC,YAAY,CAC7D,qBAAqB,CACtB,CAAA;AAEY,QAAA,iBAAiB,GAC5B,0BAAe,CAAC,YAAY,CAAQ,eAAe,CAAC,CAAA;AAE/C,MAAM,qBAAqB,GAAG,CACnC,OAAqC,EACpB,EAAE;IACnB,MAAM,eAAe,GAAG,IAAI,0BAAe,EAAE,CAAA;IAE7C,eAAe,CAAC,QAAQ,CAAC,wBAAgB,EAAE,4BAAS,CAAC,SAAS,EAAE,GAAG,EAAE,CACnE,IAAA,4BAAe,EAAC;QACd,GAAG,EAAE,aAAW,CAAC,OAAO,CAAC,aAAG,CAAC;KAC9B,CAAC,CACH,CAAA;IAED,eAAe,CAAC,QAAQ,CACtB,yBAAiB,EACjB,4BAAS,CAAC,SAAS,EACnB,GAAG,EAAE,CACH,IAAI,mBAAS,CACX,eAAa,CAAC,OAAO,CAAC,kBAAU,CAAC,EACjC,OAAO,EACP,IAAI,EACJ,OAAO,CAAC,sBAAsB,CAC/B,CACJ,CAAA;IAED,aAAW,CAAC,QAAQ,CAClB,aAAG,EACH,4BAAS,CAAC,SAAS,EACnB,GAAG,EAAE,CACH,IAAI,aAAG,CAAC;QACN,MAAM,EAAE,OAAO,CAAC,SAAS;KAC1B,CAAC,CACL,CAAA;IAED,eAAe,CAAC,QAAQ,CACtB,yBAAiB,EACjB,4BAAS,CAAC,SAAS,EACnB,GAAG,EAAE,CACH,IAAI,yBAAiB,CACnB,aAAW,CAAC,OAAO,CAAC,aAAG,CAAC,EACxB,eAAe,CAAC,OAAO,CAAC,yBAAiB,CAAC,CAC3C,CACJ,CAAA;IAED,eAAe,CAAC,QAAQ,CACtB,2BAAmB,EACnB,4BAAS,CAAC,SAAS,EACnB,GAAG,EAAE,CACH,IAAI,6BAAqB,CAAC;QACxB,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC,wBAAgB,CAAC;QACjD,cAAc,EAAE,eAAe,CAAC,OAAO,CAAC,yBAAiB,CAAC;QAC1D,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,WAAW,EAAE,OAAO,CAAC,WAAW,IAAI,IAAI;QACxC,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,IAAI;QAC9C,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,wBAAwB,EAAE,OAAO,CAAC,wBAAwB;KAC3D,CAAC,CACL,CAAA;IAED,OAAO,eAAe,CAAA;AACxB,CAAC,CAAA;AA3DY,QAAA,qBAAqB,yBA2DjC"}
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const DynamoOperator_1 = __importDefault(require("./DynamoOperator"));
7
7
  class And extends DynamoOperator_1.default {
8
8
  constructor(innerOperators) {
9
- super([]);
9
+ super(innerOperators.flatMap((op) => op.attributeValues));
10
10
  this.innerOperators = innerOperators;
11
11
  }
12
12
  render(attributeName) {
@@ -1 +1 @@
1
- {"version":3,"file":"And.js","sourceRoot":"","sources":["../../../../../../services/aws/dynamodb/utils/operators/And.ts"],"names":[],"mappings":";;;;;AAAA,sEAA6C;AAE7C,MAAM,GAAI,SAAQ,wBAAc;IAC9B,YAAoC,cAAgC;QAClE,KAAK,CAAC,EAAE,CAAC,CAAA;QADyB,mBAAc,GAAd,cAAc,CAAkB;IAEpE,CAAC;IAED,MAAM,CAAC,aAAqB;QAC1B,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc;aACnC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAChB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;YACrD,MAAM,IAAI,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAA;YAEzC,OAAO,MAAM,CAAA;QACf,CAAC,CAAC;aACD,IAAI,CAAC,OAAO,CAAC,CAAA;QAEhB,OAAO,IAAI,UAAU,GAAG,CAAA;IAC1B,CAAC;CACF;AAED,kBAAe,GAAG,CAAA"}
1
+ {"version":3,"file":"And.js","sourceRoot":"","sources":["../../../../../../services/aws/dynamodb/utils/operators/And.ts"],"names":[],"mappings":";;;;;AAAA,sEAA6C;AAE7C,MAAM,GAAI,SAAQ,wBAAc;IAC9B,YAAoC,cAAgC;QAClE,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAA;QADvB,mBAAc,GAAd,cAAc,CAAkB;IAEpE,CAAC;IAED,MAAM,CAAC,aAAqB;QAC1B,IAAI,MAAM,GAAG,CAAC,CAAA;QACd,MAAM,UAAU,GAAG,IAAI,CAAC,cAAc;aACnC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAChB,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;YACrD,MAAM,IAAI,QAAQ,CAAC,eAAe,CAAC,MAAM,CAAA;YAEzC,OAAO,MAAM,CAAA;QACf,CAAC,CAAC;aACD,IAAI,CAAC,OAAO,CAAC,CAAA;QAEhB,OAAO,IAAI,UAAU,GAAG,CAAA;IAC1B,CAAC;CACF;AAED,kBAAe,GAAG,CAAA"}
@@ -19,13 +19,14 @@ class AxiosClient {
19
19
  return new errors_1.HttpRequestError(axiosError, request, (_a = axiosError.response) === null || _a === void 0 ? void 0 : _a.status, (_b = axiosError.response) === null || _b === void 0 ? void 0 : _b.headers, (_c = axiosError.response) === null || _c === void 0 ? void 0 : _c.data);
20
20
  }
21
21
  async get(request) {
22
- var _a;
22
+ var _a, _b;
23
23
  try {
24
24
  const response = await this.axiosClient.get(request.url, {
25
25
  auth: request.authentication,
26
26
  params: request.params,
27
27
  headers: request.headers,
28
28
  timeout: (_a = request.timeout) !== null && _a !== void 0 ? _a : defaultTimeout,
29
+ responseType: (_b = request.responseType) !== null && _b !== void 0 ? _b : 'json',
29
30
  });
30
31
  return response.data;
31
32
  }
@@ -34,12 +35,13 @@ class AxiosClient {
34
35
  }
35
36
  }
36
37
  async post(request) {
37
- var _a;
38
+ var _a, _b;
38
39
  try {
39
40
  const response = await this.axiosClient.post(request.url, request.params, {
40
41
  auth: request.authentication,
41
42
  headers: request.headers,
42
43
  timeout: (_a = request.timeout) !== null && _a !== void 0 ? _a : defaultTimeout,
44
+ responseType: (_b = request.responseType) !== null && _b !== void 0 ? _b : 'json',
43
45
  });
44
46
  return response.data;
45
47
  }
@@ -48,12 +50,13 @@ class AxiosClient {
48
50
  }
49
51
  }
50
52
  async put(request) {
51
- var _a;
53
+ var _a, _b;
52
54
  try {
53
55
  const response = await this.axiosClient.put(request.url, request.params, {
54
56
  auth: request.authentication,
55
57
  headers: request.headers,
56
58
  timeout: (_a = request.timeout) !== null && _a !== void 0 ? _a : defaultTimeout,
59
+ responseType: (_b = request.responseType) !== null && _b !== void 0 ? _b : 'json',
57
60
  });
58
61
  return response.data;
59
62
  }
@@ -62,13 +65,14 @@ class AxiosClient {
62
65
  }
63
66
  }
64
67
  async delete(request) {
65
- var _a;
68
+ var _a, _b;
66
69
  try {
67
70
  await this.axiosClient.delete(request.url, {
68
71
  auth: request.authentication,
69
72
  params: request.params,
70
73
  headers: request.headers,
71
74
  timeout: (_a = request.timeout) !== null && _a !== void 0 ? _a : defaultTimeout,
75
+ responseType: (_b = request.responseType) !== null && _b !== void 0 ? _b : 'json',
72
76
  });
73
77
  }
74
78
  catch (error) {
@@ -1 +1 @@
1
- {"version":3,"file":"AxiosClient.js","sourceRoot":"","sources":["../../../services/client/AxiosClient.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AxiosClient.js","sourceRoot":"","sources":["../../../services/client/AxiosClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { EmailClientConfig, SendTemplatedEmailRequest } from './models';
2
+ declare abstract class EmailClient<TConfig extends EmailClientConfig = EmailClientConfig> {
3
+ protected readonly config: TConfig;
4
+ protected constructor(config: TConfig);
5
+ sendTemplatedEmail<TValues>(params: SendTemplatedEmailRequest<TValues>): Promise<void>;
6
+ protected abstract sendEmail<TValues>(params: SendTemplatedEmailRequest<TValues>): Promise<void>;
7
+ private validateRecipientDomains;
8
+ private areRecipientDomainsInvalid;
9
+ }
10
+ export default EmailClient;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const EmailValidationError_1 = __importDefault(require("../../../models/errors/email/EmailValidationError"));
7
+ class EmailClient {
8
+ constructor(config) {
9
+ this.config = config;
10
+ }
11
+ async sendTemplatedEmail(params) {
12
+ this.validateRecipientDomains(params.to);
13
+ await this.sendEmail(params);
14
+ }
15
+ validateRecipientDomains(to) {
16
+ const { stage, validateRecipientDomains } = this.config;
17
+ if (!validateRecipientDomains) {
18
+ return;
19
+ }
20
+ const isValidationDisabled = validateRecipientDomains.disableOnEnvironment &&
21
+ validateRecipientDomains.disableOnEnvironment.includes(stage);
22
+ if (isValidationDisabled) {
23
+ return;
24
+ }
25
+ const { allowedDomains } = validateRecipientDomains;
26
+ const hasInvalidRecipientDomains = allowedDomains && this.areRecipientDomainsInvalid(to, allowedDomains);
27
+ if (hasInvalidRecipientDomains) {
28
+ throw new EmailValidationError_1.default();
29
+ }
30
+ }
31
+ areRecipientDomainsInvalid(addresses, allowedDomains) {
32
+ return addresses.some((address) => {
33
+ const [, domain] = address.split('@');
34
+ return !allowedDomains.includes(domain);
35
+ });
36
+ }
37
+ }
38
+ exports.default = EmailClient;
39
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../services/email/EmailClient/index.ts"],"names":[],"mappings":";;;;;AACA,6GAAoF;AAEpF,MAAe,WAAW;IAGxB,YAAyC,MAAe;QAAf,WAAM,GAAN,MAAM,CAAS;IAAG,CAAC;IASrD,KAAK,CAAC,kBAAkB,CAC7B,MAA0C;QAE1C,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAExC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC9B,CAAC;IAMO,wBAAwB,CAAC,EAAY;QAC3C,MAAM,EAAE,KAAK,EAAE,wBAAwB,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAEvD,IAAI,CAAC,wBAAwB,EAAE;YAC7B,OAAM;SACP;QAED,MAAM,oBAAoB,GACxB,wBAAwB,CAAC,oBAAoB;YAC7C,wBAAwB,CAAC,oBAAoB,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QAE/D,IAAI,oBAAoB,EAAE;YACxB,OAAM;SACP;QACD,MAAM,EAAE,cAAc,EAAE,GAAG,wBAAwB,CAAA;QAEnD,MAAM,0BAA0B,GAC9B,cAAc,IAAI,IAAI,CAAC,0BAA0B,CAAC,EAAE,EAAE,cAAc,CAAC,CAAA;QAEvE,IAAI,0BAA0B,EAAE;YAC9B,MAAM,IAAI,8BAAoB,EAAE,CAAA;SACjC;IACH,CAAC;IAEO,0BAA0B,CAChC,SAAmB,EACnB,cAAwB;QAExB,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YAChC,MAAM,CAAC,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAErC,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;QACzC,CAAC,CAAC,CAAA;IACJ,CAAC;CACF;AAED,kBAAe,WAAW,CAAA"}
@@ -0,0 +1,16 @@
1
+ import Environment from '../../../models/enum/Environment';
2
+ import Attachment from '../../../models/email/Attachment';
3
+ export interface RecipientValidationConfig {
4
+ allowedDomains: string[];
5
+ disableOnEnvironment?: Environment[];
6
+ }
7
+ export interface EmailClientConfig {
8
+ stage: Environment;
9
+ validateRecipientDomains?: RecipientValidationConfig;
10
+ }
11
+ export interface SendTemplatedEmailRequest<TValues> {
12
+ to: string[];
13
+ templateName: string;
14
+ templateValues: TValues;
15
+ attachments?: Attachment[];
16
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../services/email/EmailClient/models.ts"],"names":[],"mappings":""}
@@ -0,0 +1,19 @@
1
+ import Mail from 'nodemailer/lib/mailer';
2
+ import EmailClient from './EmailClient';
3
+ import { EmailClientConfig, SendTemplatedEmailRequest } from './EmailClient/models';
4
+ import SESTemplateClient from './SESTemplateClient';
5
+ export interface NodemailerConfig extends EmailClientConfig {
6
+ mailer: Mail;
7
+ templateClient: SESTemplateClient;
8
+ from: string;
9
+ requireBody?: boolean;
10
+ requireSubject?: boolean;
11
+ sourceArn?: string;
12
+ }
13
+ declare class NodemailerEmailClient extends EmailClient<NodemailerConfig> {
14
+ constructor(config: NodemailerConfig);
15
+ protected sendEmail<TValues>(params: SendTemplatedEmailRequest<TValues>): Promise<void>;
16
+ private prepareMailerOptions;
17
+ private validateEmailContent;
18
+ }
19
+ export default NodemailerEmailClient;
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const EmailClient_1 = __importDefault(require("./EmailClient"));
7
+ const EmailValidationError_1 = __importDefault(require("../../models/errors/email/EmailValidationError"));
8
+ class NodemailerEmailClient extends EmailClient_1.default {
9
+ constructor(config) {
10
+ super(config);
11
+ }
12
+ async sendEmail(params) {
13
+ const { to, templateName, templateValues, attachments } = params;
14
+ const { mailer, templateClient } = this.config;
15
+ const email = await templateClient.createEmailFromTemplate(templateName, templateValues);
16
+ this.validateEmailContent(email);
17
+ const mailOptions = this.prepareMailerOptions(to, email, attachments);
18
+ await mailer.sendMail(mailOptions);
19
+ }
20
+ prepareMailerOptions(to, email, attachments) {
21
+ const mailerAttachments = attachments &&
22
+ attachments.map((attachment) => ({
23
+ filename: attachment.fileName,
24
+ contentType: attachment.mimeType,
25
+ content: attachment.data,
26
+ }));
27
+ const { from } = this.config;
28
+ const mailOptions = {
29
+ from,
30
+ to,
31
+ attachments: mailerAttachments,
32
+ ...email,
33
+ };
34
+ const { sourceArn } = this.config;
35
+ if (sourceArn) {
36
+ mailOptions.ses = {
37
+ SourceArn: sourceArn,
38
+ FromArn: sourceArn,
39
+ };
40
+ }
41
+ return mailOptions;
42
+ }
43
+ validateEmailContent(content) {
44
+ const { html, text, subject } = content;
45
+ const { requireSubject, requireBody } = this.config;
46
+ const hasEmailBody = html || text;
47
+ const noEmailBodyErrorCondition = !hasEmailBody && requireBody;
48
+ const noSubjectErrorCondition = !subject && requireSubject;
49
+ if (noEmailBodyErrorCondition || noSubjectErrorCondition) {
50
+ throw new EmailValidationError_1.default();
51
+ }
52
+ }
53
+ }
54
+ exports.default = NodemailerEmailClient;
55
+ //# sourceMappingURL=NodemailerEmailClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodemailerEmailClient.js","sourceRoot":"","sources":["../../../services/email/NodemailerEmailClient.ts"],"names":[],"mappings":";;;;;AAGA,gEAAuC;AAOvC,0GAAiF;AAWjF,MAAM,qBAAsB,SAAQ,qBAA6B;IAC/D,YAAmB,MAAwB;QACzC,KAAK,CAAC,MAAM,CAAC,CAAA;IACf,CAAC;IAUS,KAAK,CAAC,SAAS,CACvB,MAA0C;QAE1C,MAAM,EAAE,EAAE,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,MAAM,CAAA;QAChE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAE9C,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,uBAAuB,CACxD,YAAY,EACZ,cAAc,CACf,CAAA;QACD,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAA;QAEhC,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,CAAA;QAErE,MAAM,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAA;IACpC,CAAC;IAEO,oBAAoB,CAC1B,EAAY,EACZ,KAAmB,EACnB,WAA0B;QAE1B,MAAM,iBAAiB,GACrB,WAAW;YACX,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;gBAC/B,QAAQ,EAAE,UAAU,CAAC,QAAQ;gBAC7B,WAAW,EAAE,UAAU,CAAC,QAAQ;gBAChC,OAAO,EAAE,UAAU,CAAC,IAAI;aACzB,CAAC,CAAC,CAAA;QAEL,MAAM,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAC5B,MAAM,WAAW,GAAgB;YAC/B,IAAI;YACJ,EAAE;YACF,WAAW,EAAE,iBAAiB;YAC9B,GAAG,KAAK;SACT,CAAA;QAED,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAEjC,IAAI,SAAS,EAAE;YACb,WAAW,CAAC,GAAG,GAAG;gBAChB,SAAS,EAAE,SAAS;gBACpB,OAAO,EAAE,SAAS;aACnB,CAAA;SACF;QAED,OAAO,WAAW,CAAA;IACpB,CAAC;IAEO,oBAAoB,CAAC,OAAqB;QAChD,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;QACvC,MAAM,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QAEnD,MAAM,YAAY,GAAG,IAAI,IAAI,IAAI,CAAA;QACjC,MAAM,yBAAyB,GAAG,CAAC,YAAY,IAAI,WAAW,CAAA;QAC9D,MAAM,uBAAuB,GAAG,CAAC,OAAO,IAAI,cAAc,CAAA;QAE1D,IAAI,yBAAyB,IAAI,uBAAuB,EAAE;YACxD,MAAM,IAAI,8BAAoB,EAAE,CAAA;SACjC;IACH,CAAC;CACF;AAED,kBAAe,qBAAqB,CAAA"}
@@ -0,0 +1,16 @@
1
+ import Template from '../../models/email/Template';
2
+ import EmailContent from '../../models/email/EmailContent';
3
+ import TemplateClient from './TemplateClient';
4
+ import { SES } from 'aws-sdk';
5
+ import { Cache } from '../../utils/caching';
6
+ declare class SESTemplateClient extends TemplateClient {
7
+ private readonly sesClient;
8
+ private readonly cache;
9
+ constructor(sesClient: SES, cache: Cache);
10
+ createEmailFromTemplate<TValues>(templateName: string, templateValues: TValues): Promise<EmailContent>;
11
+ getTemplate(templateName: string): Promise<Template>;
12
+ private assignTemplateValues;
13
+ private moveSesTemplateToCache;
14
+ private static sesTemplateToTemplate;
15
+ }
16
+ export default SESTemplateClient;
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const TemplateClient_1 = __importDefault(require("./TemplateClient"));
7
+ const TemplateNotFoundError_1 = __importDefault(require("../../models/errors/email/TemplateNotFoundError"));
8
+ class SESTemplateClient extends TemplateClient_1.default {
9
+ constructor(sesClient, cache) {
10
+ super();
11
+ this.sesClient = sesClient;
12
+ this.cache = cache;
13
+ }
14
+ async createEmailFromTemplate(templateName, templateValues) {
15
+ const template = await this.getTemplate(templateName);
16
+ return this.assignTemplateValues(template, templateValues);
17
+ }
18
+ async getTemplate(templateName) {
19
+ const template = await this.cache.get(templateName);
20
+ return template || this.moveSesTemplateToCache(templateName);
21
+ }
22
+ assignTemplateValues(template, values) {
23
+ const templateParts = {
24
+ html: template.html,
25
+ text: template.text,
26
+ subject: template.subject,
27
+ };
28
+ return Object.keys(templateParts).reduce((email, emailPartKey) => {
29
+ const templateKey = emailPartKey;
30
+ if (!template[templateKey]) {
31
+ return email;
32
+ }
33
+ const templateData = SESTemplateClient.replaceTemplateValues(template[templateKey], values);
34
+ return {
35
+ ...email,
36
+ [emailPartKey]: templateData,
37
+ };
38
+ }, {});
39
+ }
40
+ async moveSesTemplateToCache(templateName) {
41
+ const { Template: sesTemplate } = await this.sesClient
42
+ .getTemplate({ TemplateName: templateName })
43
+ .promise();
44
+ if (!sesTemplate) {
45
+ throw new TemplateNotFoundError_1.default(templateName);
46
+ }
47
+ const template = SESTemplateClient.sesTemplateToTemplate(sesTemplate);
48
+ const { name } = template;
49
+ await this.cache.add(name, template);
50
+ return template;
51
+ }
52
+ static sesTemplateToTemplate(sesTemplate) {
53
+ return {
54
+ name: sesTemplate.TemplateName,
55
+ subject: sesTemplate.SubjectPart,
56
+ text: sesTemplate.TextPart,
57
+ html: sesTemplate.HtmlPart,
58
+ };
59
+ }
60
+ }
61
+ exports.default = SESTemplateClient;
62
+ //# sourceMappingURL=SESTemplateClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SESTemplateClient.js","sourceRoot":"","sources":["../../../services/email/SESTemplateClient.ts"],"names":[],"mappings":";;;;;AAGA,sEAA6C;AAG7C,4GAAmF;AAEnF,MAAM,iBAAkB,SAAQ,wBAAc;IAC5C,YAA6B,SAAc,EAAmB,KAAY;QACxE,KAAK,EAAE,CAAA;QADoB,cAAS,GAAT,SAAS,CAAK;QAAmB,UAAK,GAAL,KAAK,CAAO;IAE1E,CAAC;IAQM,KAAK,CAAC,uBAAuB,CAClC,YAAoB,EACpB,cAAuB;QAEvB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAA;QAErD,OAAO,IAAI,CAAC,oBAAoB,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;IAC5D,CAAC;IASM,KAAK,CAAC,WAAW,CAAC,YAAoB;QAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAW,YAAY,CAAC,CAAA;QAE7D,OAAO,QAAQ,IAAI,IAAI,CAAC,sBAAsB,CAAC,YAAY,CAAC,CAAA;IAC9D,CAAC;IAEO,oBAAoB,CAC1B,QAAkB,EAClB,MAAe;QAEf,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;SAC1B,CAAA;QAED,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CACtC,CAAC,KAAmB,EAAE,YAAoB,EAAE,EAAE;YAC5C,MAAM,WAAW,GAAG,YAA8B,CAAA;YAElD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE;gBAC1B,OAAO,KAAK,CAAA;aACb;YAED,MAAM,YAAY,GAAG,iBAAiB,CAAC,qBAAqB,CAC1D,QAAQ,CAAC,WAAW,CAAW,EAC/B,MAAM,CACP,CAAA;YAED,OAAO;gBACL,GAAG,KAAK;gBACR,CAAC,YAAY,CAAC,EAAE,YAAY;aAC7B,CAAA;QACH,CAAC,EACD,EAAkB,CACnB,CAAA;IACH,CAAC;IAEO,KAAK,CAAC,sBAAsB,CAClC,YAAoB;QAEpB,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS;aACnD,WAAW,CAAC,EAAE,YAAY,EAAE,YAAY,EAAE,CAAC;aAC3C,OAAO,EAAE,CAAA;QAEZ,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,IAAI,+BAAqB,CAAC,YAAY,CAAC,CAAA;SAC9C;QAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,qBAAqB,CAAC,WAAW,CAAC,CAAA;QAErE,MAAM,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAA;QACzB,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAW,IAAI,EAAE,QAAQ,CAAC,CAAA;QAE9C,OAAO,QAAQ,CAAA;IACjB,CAAC;IAEO,MAAM,CAAC,qBAAqB,CAAC,WAAyB;QAC5D,OAAO;YACL,IAAI,EAAE,WAAW,CAAC,YAAY;YAC9B,OAAO,EAAE,WAAW,CAAC,WAAW;YAChC,IAAI,EAAE,WAAW,CAAC,QAAQ;YAC1B,IAAI,EAAE,WAAW,CAAC,QAAQ;SAC3B,CAAA;IACH,CAAC;CACF;AAED,kBAAe,iBAAiB,CAAA"}
@@ -0,0 +1,6 @@
1
+ import EmailContent from '../../models/email/EmailContent';
2
+ declare abstract class TemplateClient {
3
+ abstract createEmailFromTemplate<TValues>(templateName: string, templateValues: TValues): Promise<EmailContent>;
4
+ protected static replaceTemplateValues<TValues = unknown>(template: string, values: TValues): string;
5
+ }
6
+ export default TemplateClient;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ class TemplateClient {
4
+ static replaceTemplateValues(template, values) {
5
+ const expression = /\{\{([a-zA-Z0-9\\-]+)\}\}/g;
6
+ return template.replace(expression, (match, key) => {
7
+ return String(values[key] || match);
8
+ });
9
+ }
10
+ }
11
+ exports.default = TemplateClient;
12
+ //# sourceMappingURL=TemplateClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateClient.js","sourceRoot":"","sources":["../../../services/email/TemplateClient.ts"],"names":[],"mappings":";;AAEA,MAAe,cAAc;IAejB,MAAM,CAAC,qBAAqB,CACpC,QAAgB,EAChB,MAAe;QAEf,MAAM,UAAU,GAAG,4BAA4B,CAAA;QAC/C,OAAO,QAAQ,CAAC,OAAO,CACrB,UAAU,EACV,CAA6B,KAAa,EAAE,GAAS,EAAE,EAAE;YACvD,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAA;QACrC,CAAC,CACF,CAAA;IACH,CAAC;CACF;AAED,kBAAe,cAAc,CAAA"}
@@ -0,0 +1,83 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const faker_1 = require("faker");
7
+ const NodemailerEmailClient_1 = __importDefault(require("../NodemailerEmailClient"));
8
+ const Environment_1 = __importDefault(require("../../../models/enum/Environment"));
9
+ const EmailValidationError_1 = __importDefault(require("../../../models/errors/email/EmailValidationError"));
10
+ const createMockMailer = () => ({
11
+ sendMail: jest.fn(),
12
+ });
13
+ const emailContent = {
14
+ subject: 'A subject',
15
+ html: `<html><body>An email from ${faker_1.name.firstName()} </body></html>`,
16
+ };
17
+ const createMockSESTemplateClient = () => ({
18
+ createEmailFromTemplate: jest.fn().mockResolvedValue(emailContent),
19
+ });
20
+ describe('NodemailerEmailClient', () => {
21
+ let mockMailer;
22
+ let mockSESTemplateClient;
23
+ let sut;
24
+ let config;
25
+ const createConfig = (from, stage, validateRecipientDomains) => {
26
+ mockMailer = createMockMailer();
27
+ mockSESTemplateClient = createMockSESTemplateClient();
28
+ return {
29
+ mailer: mockMailer,
30
+ templateClient: mockSESTemplateClient,
31
+ from,
32
+ stage,
33
+ validateRecipientDomains,
34
+ requireBody: true,
35
+ requireSubject: true,
36
+ };
37
+ };
38
+ describe('sendTemplatedEmail', () => {
39
+ beforeEach(() => {
40
+ config = createConfig('foo@bar.baz', Environment_1.default.Dev);
41
+ sut = new NodemailerEmailClient_1.default(config);
42
+ });
43
+ it('Should send an email if a recipient validation rule is set but the environment is exempted', async () => {
44
+ config = createConfig('foo@bar.baz', Environment_1.default.Prod, {
45
+ allowedDomains: ['bar.baz'],
46
+ disableOnEnvironment: [Environment_1.default.Prod],
47
+ });
48
+ sut = new NodemailerEmailClient_1.default(config);
49
+ await sut.sendTemplatedEmail({
50
+ to: ['bar@bar.baz'],
51
+ templateName: 'a template',
52
+ templateValues: { name: 'sender' },
53
+ });
54
+ expect(mockMailer.sendMail).toBeCalledTimes(1);
55
+ });
56
+ it('Should throw an error if the email created from the template does not contain neither a subject nor body', async () => {
57
+ const params = {
58
+ to: ['bar@bar.baz'],
59
+ templateName: 'a template',
60
+ templateValues: { name: 'sender' },
61
+ };
62
+ mockSESTemplateClient.createEmailFromTemplate.mockResolvedValueOnce({});
63
+ await expect(async () => sut.sendTemplatedEmail(params)).rejects.toThrow(EmailValidationError_1.default);
64
+ mockSESTemplateClient.createEmailFromTemplate.mockResolvedValueOnce({
65
+ text: 'A body',
66
+ });
67
+ await expect(async () => sut.sendTemplatedEmail(params)).rejects.toThrow(EmailValidationError_1.default);
68
+ });
69
+ it('Should throw an error if attempting to send an email from a non-whitelisted domain.', async () => {
70
+ config = createConfig('foo@bar.baz', Environment_1.default.Dev, {
71
+ allowedDomains: ['bar.baz'],
72
+ });
73
+ sut = new NodemailerEmailClient_1.default(config);
74
+ const params = {
75
+ to: ['bar@forbidden.email'],
76
+ templateName: 'a template',
77
+ templateValues: { name: 'sender' },
78
+ };
79
+ await expect(async () => sut.sendTemplatedEmail(params)).rejects.toThrow(EmailValidationError_1.default);
80
+ });
81
+ });
82
+ });
83
+ //# sourceMappingURL=NodemailerEmailClient.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodemailerEmailClient.spec.js","sourceRoot":"","sources":["../../../../services/email/__tests__/NodemailerEmailClient.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const faker_1 = require("faker");
4
+ const __1 = require("..");
5
+ const createMockCache = () => ({
6
+ get: jest.fn(),
7
+ add: jest.fn(),
8
+ });
9
+ const createMockSES = () => ({
10
+ getTemplate: jest.fn(),
11
+ });
12
+ describe('SESTemplateClient', () => {
13
+ let mockCache;
14
+ let mockSES;
15
+ let sut;
16
+ describe('createEmailFromTemplate', () => {
17
+ mockCache = createMockCache();
18
+ const templateName = 'The template name';
19
+ const sesTemplate = {
20
+ Template: {
21
+ TemplateName: templateName,
22
+ SubjectPart: 'An email subject from {{name}}',
23
+ HtmlPart: '<html><body> An email body from {{name}} of {{company}} </body></html>',
24
+ },
25
+ };
26
+ const templateValues = {
27
+ name: faker_1.name.firstName(),
28
+ company: faker_1.company.companyName(),
29
+ };
30
+ const expected = {
31
+ subject: `An email subject from ${templateValues.name}`,
32
+ html: `<html><body> An email body from ${templateValues.name} of ${templateValues.company} </body></html>`,
33
+ };
34
+ it('Should create valid email content from an SES template', async () => {
35
+ mockSES = createMockSES();
36
+ mockSES.getTemplate.mockImplementation(() => ({
37
+ promise: jest.fn().mockResolvedValue(sesTemplate),
38
+ }));
39
+ sut = new __1.SESTemplateClient(mockSES, mockCache);
40
+ const email = await sut.createEmailFromTemplate(templateName, templateValues);
41
+ expect(email).toEqual(expected);
42
+ });
43
+ it('Should create valid email content from a template retrieved from the cache', async () => {
44
+ const template = {
45
+ name: templateName,
46
+ subject: 'An email subject from {{name}}',
47
+ html: '<html><body> An email body from {{name}} of {{company}} </body></html>',
48
+ };
49
+ mockCache.get.mockResolvedValueOnce(template);
50
+ const email = await sut.createEmailFromTemplate(templateName, templateValues);
51
+ expect(email).toEqual(expected);
52
+ });
53
+ });
54
+ });
55
+ //# sourceMappingURL=SESTemplateClient.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SESTemplateClient.spec.js","sourceRoot":"","sources":["../../../../services/email/__tests__/SESTemplateClient.spec.ts"],"names":[],"mappings":";;AAAA,iCAAqC;AAErC,0BAAsC;AAGtC,MAAM,eAAe,GAAG,GAAG,EAAE,CAAC,CAAC;IAC7B,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;IACd,GAAG,EAAE,IAAI,CAAC,EAAE,EAAE;CACf,CAAC,CAAA;AAEF,MAAM,aAAa,GAAG,GAAG,EAAE,CAAC,CAAC;IAC3B,WAAW,EAAE,IAAI,CAAC,EAAE,EAAE;CACvB,CAAC,CAAA;AAEF,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,IAAI,SAA6C,CAAA;IACjD,IAAI,OAAyC,CAAA;IAC7C,IAAI,GAAsB,CAAA;IAE1B,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,SAAS,GAAG,eAAe,EAAE,CAAA;QAC7B,MAAM,YAAY,GAAG,mBAAmB,CAAA;QACxC,MAAM,WAAW,GAAG;YAClB,QAAQ,EAAE;gBACR,YAAY,EAAE,YAAY;gBAC1B,WAAW,EAAE,gCAAgC;gBAC7C,QAAQ,EACN,wEAAwE;aAC3E;SACF,CAAA;QAED,MAAM,cAAc,GAAG;YACrB,IAAI,EAAE,YAAI,CAAC,SAAS,EAAE;YACtB,OAAO,EAAE,eAAO,CAAC,WAAW,EAAE;SAC/B,CAAA;QAED,MAAM,QAAQ,GAAG;YACf,OAAO,EAAE,yBAAyB,cAAc,CAAC,IAAI,EAAE;YACvD,IAAI,EAAE,mCAAmC,cAAc,CAAC,IAAI,OAAO,cAAc,CAAC,OAAO,iBAAiB;SAC3G,CAAA;QAED,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;YACtE,OAAO,GAAG,aAAa,EAAE,CAAA;YACzB,OAAO,CAAC,WAAW,CAAC,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;gBAC5C,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC;aAClD,CAAC,CAAC,CAAA;YAEH,GAAG,GAAG,IAAI,qBAAiB,CACzB,OAAyB,EACzB,SAA6B,CAC9B,CAAA;YAED,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,uBAAuB,CAC7C,YAAY,EACZ,cAAc,CACf,CAAA;YAED,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;QAEF,EAAE,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;YAC1F,MAAM,QAAQ,GAAG;gBACf,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,gCAAgC;gBACzC,IAAI,EAAE,wEAAwE;aAC/E,CAAA;YAED,SAAS,CAAC,GAAG,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAA;YAE7C,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,uBAAuB,CAC7C,YAAY,EACZ,cAAc,CACf,CAAA;YAED,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QACjC,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { default as EmailClient } from './EmailClient';
2
+ export { default as NodemailerEmailClient } from './NodemailerEmailClient';
3
+ export { default as SESTemplateClient } from './SESTemplateClient';
4
+ export { default as TemplateClient } from './TemplateClient';
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TemplateClient = exports.SESTemplateClient = exports.NodemailerEmailClient = exports.EmailClient = void 0;
7
+ var EmailClient_1 = require("./EmailClient");
8
+ Object.defineProperty(exports, "EmailClient", { enumerable: true, get: function () { return __importDefault(EmailClient_1).default; } });
9
+ var NodemailerEmailClient_1 = require("./NodemailerEmailClient");
10
+ Object.defineProperty(exports, "NodemailerEmailClient", { enumerable: true, get: function () { return __importDefault(NodemailerEmailClient_1).default; } });
11
+ var SESTemplateClient_1 = require("./SESTemplateClient");
12
+ Object.defineProperty(exports, "SESTemplateClient", { enumerable: true, get: function () { return __importDefault(SESTemplateClient_1).default; } });
13
+ var TemplateClient_1 = require("./TemplateClient");
14
+ Object.defineProperty(exports, "TemplateClient", { enumerable: true, get: function () { return __importDefault(TemplateClient_1).default; } });
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../services/email/index.ts"],"names":[],"mappings":";;;;;;AAAA,6CAAsD;AAA7C,2HAAA,OAAO,OAAe;AAC/B,iEAA0E;AAAjE,+IAAA,OAAO,OAAyB;AACzC,yDAAkE;AAAzD,uIAAA,OAAO,OAAqB;AACrC,mDAA4D;AAAnD,iIAAA,OAAO,OAAkB"}
@@ -5,6 +5,7 @@ export interface SQSMessageOptions {
5
5
  export interface SNSMessageOptions {
6
6
  deduplicationId?: string;
7
7
  messageGroupId?: string;
8
+ messageDeduplicationId?: string;
8
9
  attributes?: {
9
10
  [key: string]: string | number | boolean;
10
11
  };
@@ -4,9 +4,10 @@ declare class SNSQueueClient implements QueueClient {
4
4
  private readonly topicArn;
5
5
  private readonly serializer;
6
6
  private static translateJStypeToSNSType;
7
+ private static translateAttributesToSNSAttributes;
7
8
  private readonly client;
8
9
  constructor(topicArn: string, serializer: Serializer);
9
10
  sendMessage<TMessage>(request: QueueMessageRequest<TMessage, SNSMessageOptions>): Promise<void>;
10
- sendBatchMessage<TMessage>(request: QueueBatchMessageRequest<TMessage>): Promise<void>;
11
+ sendBatchMessage<TMessage>(request: QueueBatchMessageRequest<TMessage, SNSMessageOptions>): Promise<void>;
11
12
  }
12
13
  export default SNSQueueClient;
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const aws_sdk_1 = require("aws-sdk");
4
+ const uuid_1 = require("uuid");
4
5
  class SNSQueueClient {
5
6
  constructor(topicArn, serializer) {
6
7
  this.topicArn = topicArn;
@@ -19,32 +20,50 @@ class SNSQueueClient {
19
20
  return 'String';
20
21
  }
21
22
  }
23
+ static translateAttributesToSNSAttributes(attributes) {
24
+ return Object.keys(attributes).reduce((keyMap, attrKey) => Object.assign(keyMap, {
25
+ [attrKey]: {
26
+ DataType: SNSQueueClient.translateJStypeToSNSType(typeof attributes[attrKey]),
27
+ StringValue: String(attributes[attrKey]),
28
+ },
29
+ }), {});
30
+ }
22
31
  async sendMessage(request) {
23
32
  var _a, _b, _c, _d;
24
33
  const attributes = ((_a = request.options) === null || _a === void 0 ? void 0 : _a.attributes)
25
- ? Object.keys((_b = request.options) === null || _b === void 0 ? void 0 : _b.attributes).reduce((keyMap, attrKey) => {
26
- var _a, _b, _c, _d;
27
- return Object.assign(keyMap, {
28
- [attrKey]: {
29
- DataType: SNSQueueClient.translateJStypeToSNSType(typeof ((_b = (_a = request.options) === null || _a === void 0 ? void 0 : _a.attributes) === null || _b === void 0 ? void 0 : _b[attrKey])),
30
- StringValue: String((_d = (_c = request.options) === null || _c === void 0 ? void 0 : _c.attributes) === null || _d === void 0 ? void 0 : _d[attrKey]),
31
- },
32
- });
33
- }, {})
34
+ ? SNSQueueClient.translateAttributesToSNSAttributes((_b = request.options) === null || _b === void 0 ? void 0 : _b.attributes)
34
35
  : {};
35
36
  await this.client
36
37
  .publish({
37
38
  TopicArn: this.topicArn,
38
39
  Message: this.serializer.serialize(request.message, 'string'),
39
40
  MessageGroupId: (_c = request.options) === null || _c === void 0 ? void 0 : _c.messageGroupId,
40
- MessageDeduplicationId: (_d = request.options) === null || _d === void 0 ? void 0 : _d.messageGroupId,
41
+ MessageDeduplicationId: (_d = request.options) === null || _d === void 0 ? void 0 : _d.messageDeduplicationId,
41
42
  MessageAttributes: attributes,
42
43
  })
43
44
  .promise();
44
45
  }
45
46
  async sendBatchMessage(request) {
46
- const batchSendMessagePromises = request.messages.map((message) => this.sendMessage({ message, options: request.options }));
47
- await Promise.all(batchSendMessagePromises);
47
+ var _a, _b;
48
+ const attributes = ((_a = request.options) === null || _a === void 0 ? void 0 : _a.attributes)
49
+ ? SNSQueueClient.translateAttributesToSNSAttributes((_b = request.options) === null || _b === void 0 ? void 0 : _b.attributes)
50
+ : {};
51
+ const batchSendMessageEntries = request.messages.map((message) => {
52
+ var _a, _b;
53
+ return ({
54
+ Id: (0, uuid_1.v1)(),
55
+ Message: this.serializer.serialize(message, 'string'),
56
+ MessageGroupId: (_a = request.options) === null || _a === void 0 ? void 0 : _a.messageGroupId,
57
+ MessageDeduplicationId: (_b = request.options) === null || _b === void 0 ? void 0 : _b.messageDeduplicationId,
58
+ MessageAttributes: attributes,
59
+ });
60
+ });
61
+ await this.client
62
+ .publishBatch({
63
+ TopicArn: this.topicArn,
64
+ PublishBatchRequestEntries: batchSendMessageEntries,
65
+ })
66
+ .promise();
48
67
  }
49
68
  }
50
69
  exports.default = SNSQueueClient;
@@ -1 +1 @@
1
- {"version":3,"file":"SNSQueueClient.js","sourceRoot":"","sources":["../../../services/queue/SNSQueueClient.ts"],"names":[],"mappings":";;AAAA,qCAA6B;AAW7B,MAAM,cAAc;IAgBlB,YAImB,QAAgB,EAIhB,UAAsB;QAJtB,aAAQ,GAAR,QAAQ,CAAQ;QAIhB,eAAU,GAAV,UAAU,CAAY;QAVxB,WAAM,GAAG,IAAI,aAAG,EAAE,CAAA;IAWhC,CAAC;IAxBI,MAAM,CAAC,wBAAwB,CAAC,QAAgB;QACtD,QAAQ,QAAQ,EAAE;YAChB,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAA;YACjB,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAA;YACjB,KAAK,SAAS;gBACZ,OAAO,SAAS,CAAA;YAClB;gBACE,OAAO,QAAQ,CAAA;SAClB;IACH,CAAC;IAeM,KAAK,CAAC,WAAW,CACtB,OAAyD;;QAGzD,MAAM,UAAU,GAAG,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,UAAU;YAC5C,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAA,OAAO,CAAC,OAAO,0CAAE,UAAU,CAAC,CAAC,MAAM,CAC7C,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;;gBAClB,OAAA,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;oBACpB,CAAC,OAAO,CAAC,EAAE;wBACT,QAAQ,EAAE,cAAc,CAAC,wBAAwB,CAC/C,OAAO,CAAA,MAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,UAAU,0CAAG,OAAO,CAAC,CAAA,CAC9C;wBACD,WAAW,EAAE,MAAM,CAAC,MAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,UAAU,0CAAG,OAAO,CAAC,CAAC;qBAC5D;iBACF,CAAC,CAAA;aAAA,EACJ,EAAwD,CACzD;YACH,CAAC,CAAC,EAAE,CAAA;QAEN,MAAM,IAAI,CAAC,MAAM;aACd,OAAO,CAAC;YACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;YAC7D,cAAc,EAAE,MAAA,OAAO,CAAC,OAAO,0CAAE,cAAc;YAC/C,sBAAsB,EAAE,MAAA,OAAO,CAAC,OAAO,0CAAE,cAAc;YACvD,iBAAiB,EAAE,UAAU;SAC9B,CAAC;aACD,OAAO,EAAE,CAAA;IACd,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAC3B,OAA2C;QAE3C,MAAM,wBAAwB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAChE,IAAI,CAAC,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CACxD,CAAA;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAA;IAC7C,CAAC;CACF;AAED,kBAAe,cAAc,CAAA"}
1
+ {"version":3,"file":"SNSQueueClient.js","sourceRoot":"","sources":["../../../services/queue/SNSQueueClient.ts"],"names":[],"mappings":";;AAAA,qCAA6B;AAC7B,+BAAmC;AAWnC,MAAM,cAAc;IAkClB,YAImB,QAAgB,EAIhB,UAAsB;QAJtB,aAAQ,GAAR,QAAQ,CAAQ;QAIhB,eAAU,GAAV,UAAU,CAAY;QAVxB,WAAM,GAAG,IAAI,aAAG,EAAE,CAAA;IAWhC,CAAC;IA1CI,MAAM,CAAC,wBAAwB,CAAC,QAAgB;QACtD,QAAQ,QAAQ,EAAE;YAChB,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAA;YACjB,KAAK,QAAQ;gBACX,OAAO,QAAQ,CAAA;YACjB,KAAK,SAAS;gBACZ,OAAO,SAAS,CAAA;YAClB;gBACE,OAAO,QAAQ,CAAA;SAClB;IACH,CAAC;IAEO,MAAM,CAAC,kCAAkC,CAAC,UAEjD;QAEC,OAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,MAAM,CACnC,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAClB,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;YACpB,CAAC,OAAO,CAAC,EAAE;gBACT,QAAQ,EAAE,cAAc,CAAC,wBAAwB,CAC/C,OAAO,UAAU,CAAC,OAAO,CAAC,CAC3B;gBACD,WAAW,EAAE,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;aACzC;SACF,CAAC,EACJ,EAAwD,CACzD,CAAA;IACH,CAAC;IAeM,KAAK,CAAC,WAAW,CACtB,OAAyD;;QAEzD,MAAM,UAAU,GAAG,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,UAAU;YAC5C,CAAC,CAAC,cAAc,CAAC,kCAAkC,CAC/C,MAAA,OAAO,CAAC,OAAO,0CAAE,UAAU,CAC5B;YACH,CAAC,CAAC,EAAE,CAAA;QAEN,MAAM,IAAI,CAAC,MAAM;aACd,OAAO,CAAC;YACP,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC;YAC7D,cAAc,EAAE,MAAA,OAAO,CAAC,OAAO,0CAAE,cAAc;YAC/C,sBAAsB,EAAE,MAAA,OAAO,CAAC,OAAO,0CAAE,sBAAsB;YAC/D,iBAAiB,EAAE,UAAU;SAC9B,CAAC;aACD,OAAO,EAAE,CAAA;IACd,CAAC;IAEM,KAAK,CAAC,gBAAgB,CAC3B,OAA8D;;QAE9D,MAAM,UAAU,GAAG,CAAA,MAAA,OAAO,CAAC,OAAO,0CAAE,UAAU;YAC5C,CAAC,CAAC,cAAc,CAAC,kCAAkC,CAC/C,MAAA,OAAO,CAAC,OAAO,0CAAE,UAAU,CAC5B;YACH,CAAC,CAAC,EAAE,CAAA;QAEN,MAAM,uBAAuB,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;;YAAC,OAAA,CAAC;gBACjE,EAAE,EAAE,IAAA,SAAM,GAAE;gBACZ,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC;gBACrD,cAAc,EAAE,MAAA,OAAO,CAAC,OAAO,0CAAE,cAAc;gBAC/C,sBAAsB,EAAE,MAAA,OAAO,CAAC,OAAO,0CAAE,sBAAsB;gBAC/D,iBAAiB,EAAE,UAAU;aAC9B,CAAC,CAAA;SAAA,CAAC,CAAA;QAEH,MAAM,IAAI,CAAC,MAAM;aACd,YAAY,CAAC;YACZ,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,0BAA0B,EAAE,uBAAuB;SACpD,CAAC;aACD,OAAO,EAAE,CAAA;IACd,CAAC;CACF;AAED,kBAAe,cAAc,CAAA"}
@@ -34,6 +34,10 @@ class GlobalAtomicCache extends Cache_1.default {
34
34
  this.fetchers = new Map();
35
35
  }
36
36
  getLockFilePath(key) {
37
+ const lockfilePath = path.join(this.mountPath, `portal-${this.storeName}-${key}.lck`);
38
+ this.logger.info('[GlobalAtomicCache] - Getting lockfile path', {
39
+ lockfilePath,
40
+ });
37
41
  return path.join(this.mountPath, `portal-${this.storeName}-${key}.lck`);
38
42
  }
39
43
  async isLockFilePresent(key) {
@@ -69,10 +73,12 @@ class GlobalAtomicCache extends Cache_1.default {
69
73
  async waitOrDeleteLock(key) {
70
74
  const watcher = (0, fs_1.watch)(this.getLockFilePath(key));
71
75
  const watchPromise = new Promise((resolve) => {
76
+ this.logger.info('[GlobalAtomicCache] - Deleting lockfile', { key });
72
77
  watcher.on('change', async () => {
73
78
  const isLockFilePresent = await this.isLockFilePresent(key);
74
79
  if (!isLockFilePresent) {
75
80
  resolve(true);
81
+ this.logger.info('[GlobalAtomicCache] - Lockfile deleted', { key });
76
82
  }
77
83
  });
78
84
  });
@@ -85,6 +91,9 @@ class GlobalAtomicCache extends Cache_1.default {
85
91
  }
86
92
  async executeFactoryAtomically(key, factory) {
87
93
  const isLockFilePresent = await this.isLockFilePresent(key);
94
+ this.logger.info('[GlobalAtomicCache] - Checking file existence', {
95
+ isLockFilePresent,
96
+ });
88
97
  if (isLockFilePresent) {
89
98
  await this.waitOrDeleteLock(key);
90
99
  return this.getOrAdd(key, factory);
@@ -105,6 +114,10 @@ class GlobalAtomicCache extends Cache_1.default {
105
114
  }
106
115
  async getOrAdd(key, factory) {
107
116
  const fetcher = this.fetchers.get(key);
117
+ this.logger.info('[GlobalAtomicCache] - Getting or adding cached value', {
118
+ fetchers: this.fetchers,
119
+ key,
120
+ });
108
121
  if (fetcher) {
109
122
  return fetcher;
110
123
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GlobalAtomicCache.js","sourceRoot":"","sources":["../../../utils/caching/GlobalAtomicCache.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GlobalAtomicCache.js","sourceRoot":"","sources":["../../../utils/caching/GlobalAtomicCache.ts"],"names":[],"mappings":"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"}
@@ -24,6 +24,7 @@ class SecretCache extends GlobalAtomicCache_1.default {
24
24
  },
25
25
  },
26
26
  ];
27
+ this.logger.info('[SecretCache] - Saving SSM Parameter', key, value);
27
28
  await this.ssmClient
28
29
  .putParameter({
29
30
  Name: this.getFullParameterName(key),
@@ -33,15 +34,20 @@ class SecretCache extends GlobalAtomicCache_1.default {
33
34
  Tier: 'Advanced',
34
35
  })
35
36
  .promise();
37
+ this.logger.info('SSM parameter saved!');
36
38
  }
37
39
  async get(key) {
38
40
  try {
41
+ this.logger.info('[SecretCache] - Fetching parameter');
39
42
  const parameter = await this.ssmClient
40
43
  .getParameter({
41
44
  Name: this.getFullParameterName(key),
42
45
  WithDecryption: true,
43
46
  })
44
47
  .promise();
48
+ this.logger.info('[SecretCache] - Fetched parameter', {
49
+ parameter: parameter === null || parameter === void 0 ? void 0 : parameter.Parameter,
50
+ });
45
51
  if (!parameter.Parameter) {
46
52
  return null;
47
53
  }
@@ -49,6 +55,7 @@ class SecretCache extends GlobalAtomicCache_1.default {
49
55
  return secretValue ? JSON.parse(secretValue) : null;
50
56
  }
51
57
  catch (e) {
58
+ this.logger.error('[SecretCache] - Error', { error: e });
52
59
  return null;
53
60
  }
54
61
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SecretCache.js","sourceRoot":"","sources":["../../../utils/caching/SecretCache.ts"],"names":[],"mappings":";;;;;AAAA,qCAA6B;AAC7B,qEAA4C;AAK5C,4EAAmD;AAEnD,MAAM,WAAY,SAAQ,2BAAiB;IAGzC,YACE,SAAiB,EACjB,SAAiB,EACE,gBAAwB,EAC3C,MAAc,EACN,cAAc,OAAO;QAE7B,KAAK,CAAC,gBAAgB,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;QAJlC,qBAAgB,GAAhB,gBAAgB,CAAQ;QAEnC,gBAAW,GAAX,WAAW,CAAU;QAPd,cAAS,GAAG,IAAI,aAAG,EAAE,CAAA;IAUtC,CAAC;IAEM,KAAK,CAAC,GAAG,CAAS,GAAW,EAAE,KAAa;QACjD,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACrC,MAAM,gBAAgB,GAAG;YACvB;gBACE,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,KAAK;gBACd,UAAU,EAAE;oBACV,SAAS,EAAE,MAAM,CAAC,UAAU,CAAC,WAAW,EAAE;iBAC3C;aACF;SACF,CAAA;QAED,MAAM,IAAI,CAAC,SAAS;aACjB,YAAY,CAAC;YACZ,IAAI,EAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;YACpC,IAAI,EAAE,cAAc;YACpB,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;YAC1C,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;YACnC,IAAI,EAAE,UAAU;SACjB,CAAC;aACD,OAAO,EAAE,CAAA;IACd,CAAC;IAEM,KAAK,CAAC,GAAG,CAAS,GAAW;QAClC,IAAI;YACF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,SAAS;iBACnC,YAAY,CAAC;gBACZ,IAAI,EAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;gBACpC,cAAc,EAAE,IAAI;aACrB,CAAC;iBACD,OAAO,EAAE,CAAA;YAEZ,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE;gBACxB,OAAO,IAAI,CAAA;aACZ;YAED,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC,SAAS,CAAA;YAElD,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;SACpD;QAAC,OAAO,CAAC,EAAE;YACV,OAAO,IAAI,CAAA;SACZ;IACH,CAAC;IAEM,KAAK,CAAC,KAAK;QAChB,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,CAAC,SAAS;aACpD,mBAAmB,CAAC;YACnB,IAAI,EAAE,iBAAiB,IAAI,CAAC,SAAS,EAAE;SACxC,CAAC;aACD,OAAO,EAAE,CAAA;QAEZ,IAAI,CAAC,UAAU,EAAE;YACf,OAAM;SACP;QACD,MAAM,KAAK,GAAG,UAAU;aACrB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;aAChC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QAE7B,MAAM,IAAI,CAAC,SAAS;aACjB,gBAAgB,CAAC;YAChB,KAAK,EAAE,KAAK;SACb,CAAC;aACD,OAAO,EAAE,CAAA;IACd,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW;QAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;QAElC,OAAO,CAAC,CAAC,MAAM,CAAA;IACjB,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,GAAW;QAC7B,MAAM,IAAI,CAAC,SAAS;aACjB,eAAe,CAAC;YACf,IAAI,EAAE,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC;SACrC,CAAC;aACD,OAAO,EAAE,CAAA;IACd,CAAC;IAEO,oBAAoB,CAAC,GAAW;QACtC,OAAO,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,IAAI,GAAG,EAAE,CAAA;IACxD,CAAC;IAES,UAAU,CAAS,QAAgB;QAC3C,OAAO;YACL,UAAU,EAAE,IAAA,oBAAU,EAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC;YACzD,KAAK,EAAE,QAAQ;SAChB,CAAA;IACH,CAAC;CACF;AAED,kBAAe,WAAW,CAAA"}
1
+ {"version":3,"file":"SecretCache.js","sourceRoot":"","sources":["../../../utils/caching/SecretCache.ts"],"names":[],"mappings":"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"}