@triproject/nestjs-core 1.0.5

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 (91) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +140 -0
  3. package/dist/bootstrap.d.ts +2 -0
  4. package/dist/bootstrap.js +43 -0
  5. package/dist/config.d.ts +46 -0
  6. package/dist/config.js +50 -0
  7. package/dist/controllers/controller.d.ts +8 -0
  8. package/dist/controllers/controller.js +56 -0
  9. package/dist/drivers/cache/cache.d.ts +18 -0
  10. package/dist/drivers/cache/cache.driver.d.ts +2 -0
  11. package/dist/drivers/cache/cache.driver.js +22 -0
  12. package/dist/drivers/cache/cache.js +92 -0
  13. package/dist/drivers/cache/index.d.ts +3 -0
  14. package/dist/drivers/cache/index.js +19 -0
  15. package/dist/drivers/cache/redis.d.ts +10 -0
  16. package/dist/drivers/cache/redis.js +52 -0
  17. package/dist/drivers/db/db.helper.d.ts +55 -0
  18. package/dist/drivers/db/db.helper.js +217 -0
  19. package/dist/drivers/db/db.module.d.ts +2 -0
  20. package/dist/drivers/db/db.module.js +44 -0
  21. package/dist/drivers/db/db.service.d.ts +10 -0
  22. package/dist/drivers/db/db.service.js +49 -0
  23. package/dist/drivers/db/index.d.ts +5 -0
  24. package/dist/drivers/db/index.js +21 -0
  25. package/dist/drivers/db/migration.d.ts +42 -0
  26. package/dist/drivers/db/migration.js +81 -0
  27. package/dist/drivers/db/repository.d.ts +41 -0
  28. package/dist/drivers/db/repository.js +255 -0
  29. package/dist/drivers/encryptions/encryption.d.ts +8 -0
  30. package/dist/drivers/encryptions/encryption.js +50 -0
  31. package/dist/drivers/encryptions/encryption.module.d.ts +2 -0
  32. package/dist/drivers/encryptions/encryption.module.js +24 -0
  33. package/dist/drivers/encryptions/index.d.ts +3 -0
  34. package/dist/drivers/encryptions/index.js +19 -0
  35. package/dist/drivers/encryptions/jwt.d.ts +6 -0
  36. package/dist/drivers/encryptions/jwt.js +46 -0
  37. package/dist/drivers/encryptions/password-hash.d.ts +11 -0
  38. package/dist/drivers/encryptions/password-hash.js +38 -0
  39. package/dist/drivers/encryptions/snap.signature.d.ts +32 -0
  40. package/dist/drivers/encryptions/snap.signature.js +110 -0
  41. package/dist/drivers/logger/app.logger.d.ts +23 -0
  42. package/dist/drivers/logger/app.logger.js +183 -0
  43. package/dist/drivers/logger/index.d.ts +2 -0
  44. package/dist/drivers/logger/index.js +18 -0
  45. package/dist/drivers/logger/slack.logger.d.ts +4 -0
  46. package/dist/drivers/logger/slack.logger.js +24 -0
  47. package/dist/drivers/mail/index.d.ts +6 -0
  48. package/dist/drivers/mail/index.js +22 -0
  49. package/dist/drivers/mail/mail-template.d.ts +8 -0
  50. package/dist/drivers/mail/mail-template.js +74 -0
  51. package/dist/drivers/mail/mail.config.d.ts +18 -0
  52. package/dist/drivers/mail/mail.config.js +4 -0
  53. package/dist/drivers/mail/mail.d.ts +23 -0
  54. package/dist/drivers/mail/mail.js +98 -0
  55. package/dist/drivers/mail/mail.module.d.ts +2 -0
  56. package/dist/drivers/mail/mail.module.js +26 -0
  57. package/dist/drivers/mail/mail.queue.d.ts +9 -0
  58. package/dist/drivers/mail/mail.queue.js +37 -0
  59. package/dist/drivers/mail/mailer.d.ts +13 -0
  60. package/dist/drivers/mail/mailer.js +62 -0
  61. package/dist/drivers/notifications/index.d.ts +5 -0
  62. package/dist/drivers/notifications/index.js +21 -0
  63. package/dist/drivers/notifications/notification.config.d.ts +8 -0
  64. package/dist/drivers/notifications/notification.config.js +4 -0
  65. package/dist/drivers/notifications/notification.module.d.ts +2 -0
  66. package/dist/drivers/notifications/notification.module.js +25 -0
  67. package/dist/drivers/notifications/notification.queue.d.ts +9 -0
  68. package/dist/drivers/notifications/notification.queue.js +37 -0
  69. package/dist/drivers/notifications/push-notification.d.ts +10 -0
  70. package/dist/drivers/notifications/push-notification.js +75 -0
  71. package/dist/drivers/notifications/slack.d.ts +15 -0
  72. package/dist/drivers/notifications/slack.js +95 -0
  73. package/dist/drivers/queues/app.queue.d.ts +11 -0
  74. package/dist/drivers/queues/app.queue.js +66 -0
  75. package/dist/drivers/queues/index.d.ts +2 -0
  76. package/dist/drivers/queues/index.js +18 -0
  77. package/dist/drivers/queues/queue.module.d.ts +2 -0
  78. package/dist/drivers/queues/queue.module.js +41 -0
  79. package/dist/helpers/exception.helper.d.ts +35 -0
  80. package/dist/helpers/exception.helper.js +71 -0
  81. package/dist/helpers/http.helper.d.ts +23 -0
  82. package/dist/helpers/http.helper.js +134 -0
  83. package/dist/helpers/swagger.helper.d.ts +20 -0
  84. package/dist/helpers/swagger.helper.js +287 -0
  85. package/dist/helpers/totp.helper.d.ts +16 -0
  86. package/dist/helpers/totp.helper.js +30 -0
  87. package/dist/index.d.ts +8 -0
  88. package/dist/index.js +24 -0
  89. package/dist/middlewares/log.middleware.d.ts +9 -0
  90. package/dist/middlewares/log.middleware.js +59 -0
  91. package/package.json +145 -0
@@ -0,0 +1,183 @@
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.AppLogger = void 0;
7
+ const common_1 = require("@nestjs/common");
8
+ const helpers_1 = require("@triproject/helpers");
9
+ const os_1 = __importDefault(require("os"));
10
+ const util_1 = require("util");
11
+ const config_1 = require("../../config");
12
+ const slack_logger_1 = require("./slack.logger");
13
+ const bgLog = (option, log) => {
14
+ return (0, util_1.styleText)('reset', (0, util_1.styleText)('bold', (0, util_1.styleText)(option, (0, util_1.styleText)('black', ` ${log} `))));
15
+ };
16
+ const logWarnBg = (log) => bgLog('bgYellow', log);
17
+ const logErrorBg = (log) => bgLog('bgRed', log);
18
+ const logInfoBg = (log) => bgLog('bgGreen', log);
19
+ const logDebugBg = (log) => bgLog('bgMagenta', log);
20
+ const logWarn = (log) => (0, util_1.styleText)('yellow', log);
21
+ const logError = (log) => (0, util_1.styleText)('red', log);
22
+ class LoggerInit {
23
+ host = os_1.default.hostname();
24
+ slackError;
25
+ constructor() {
26
+ if (config_1.SLACK_ERROR_WEBHOOK_URL)
27
+ this.slackError = new slack_logger_1.SlackLogger(config_1.SLACK_ERROR_WEBHOOK_URL);
28
+ }
29
+ }
30
+ const loggerInit = new LoggerInit();
31
+ class AppLogger extends common_1.ConsoleLogger {
32
+ context;
33
+ LOG_STACKS = 3;
34
+ constructor(context = '') {
35
+ super(context);
36
+ this.context = context;
37
+ }
38
+ _notifyError(...args) {
39
+ if (loggerInit.slackError)
40
+ loggerInit.slackError.send(args);
41
+ }
42
+ excludeContexts = [
43
+ 'RoutesResolver',
44
+ 'InstanceLoader',
45
+ 'RouterExplorer',
46
+ 'Nest Application',
47
+ 'Module',
48
+ 'NestApplication',
49
+ ];
50
+ _excludeContext(context) {
51
+ return this.excludeContexts.includes(context);
52
+ }
53
+ _sanitizePolicyData(object) {
54
+ if (!object)
55
+ return undefined;
56
+ if (Array.isArray(object)) {
57
+ return object.map((d) => (typeof d !== 'object' ? d : this._sanitizePolicyData(d)));
58
+ }
59
+ else {
60
+ return Object.keys(object).reduce((acc, key) => {
61
+ let value = object[key];
62
+ if (helpers_1.sanitizeRequests.includes(key)) {
63
+ // @ts-ignore
64
+ value = '***';
65
+ }
66
+ else if (typeof value === 'object') {
67
+ // @ts-ignore
68
+ value = this._sanitizePolicyData(value);
69
+ }
70
+ return { ...acc, [key]: value };
71
+ }, {});
72
+ }
73
+ }
74
+ _formatBgLevel(level, ...args) {
75
+ const msg = args.join(' ╱ ');
76
+ switch (level) {
77
+ case 'log':
78
+ return logInfoBg(msg);
79
+ case 'warn':
80
+ return logWarnBg(msg);
81
+ case 'error':
82
+ return logErrorBg(msg);
83
+ case 'fatal':
84
+ return logErrorBg(msg);
85
+ case 'debug':
86
+ return logDebugBg(msg);
87
+ default:
88
+ return logInfoBg(msg);
89
+ }
90
+ }
91
+ _formatException(error) {
92
+ const stacks = (error?.stack ?? '')
93
+ ?.split('\n')
94
+ .map((o) => o.trim().replace?.(error.name + ': ', ''))
95
+ .slice(0, config_1.NODE_ENV === 'development' ? undefined : this.LOG_STACKS);
96
+ return (error?.name ?? 'UnknownErrorException') + ' ' + stacks.join(`\n`);
97
+ }
98
+ _parseMessage(arg) {
99
+ if (arg instanceof Error)
100
+ return ['error', this._formatException(arg)];
101
+ if (typeof arg === 'object')
102
+ return ['object', JSON.stringify(this._sanitizePolicyData(arg), null, 2)];
103
+ return ['string', arg?.toString()];
104
+ }
105
+ _mapLog(level, ...args) {
106
+ if (this._excludeContext(this.context) ||
107
+ (typeof args[1] !== 'undefined' && this.excludeContexts.some((d) => args[1] === d))) {
108
+ return;
109
+ }
110
+ const message = [];
111
+ for (const arg of args?.flat()?.flat()) {
112
+ if (!arg)
113
+ continue;
114
+ message.push(this._parseMessage(arg));
115
+ }
116
+ return {
117
+ level,
118
+ env: config_1.NODE_ENV.toUpperCase(),
119
+ context: this.context ?? 'App Logger',
120
+ timestamp: (0, helpers_1.dateUtil)().utc().format('YYYY-MM-DD HH:mm:ss.SSS'),
121
+ host: loggerInit.host?.substring(0, 20),
122
+ message,
123
+ };
124
+ }
125
+ _formatConsoleError(error) {
126
+ return error
127
+ .split('\n')
128
+ .map((d) => d.endsWith('Exception')
129
+ ? d.replace(/(.*)Exception(.*)/, logErrorBg('$1Exception') + logError('$2'))
130
+ : logError(d))
131
+ .join('\n ');
132
+ }
133
+ _console(logMeta) {
134
+ const log = this._formatBgLevel(logMeta.level, logMeta.timestamp, logMeta.host?.substring(0, 20), logMeta.level.toUpperCase(), logMeta?.context) +
135
+ (0, util_1.styleText)('reset', ' ') +
136
+ logMeta.message
137
+ .map((d) => {
138
+ if (d[0] === 'error')
139
+ return logError(this._formatConsoleError(d[1]));
140
+ if (d[0] === 'object')
141
+ return logWarn(logWarnBg('Object') + ' ' + d[1].split('\n').join('\n '));
142
+ return (0, helpers_1.chunkArray)(d[1].split(' '), 10)
143
+ .map((d) => d.join(' '))
144
+ .join('\n ');
145
+ })
146
+ .join('\n ');
147
+ return console.log('\n' + log);
148
+ }
149
+ log(...args) {
150
+ const logMeta = this._mapLog('log', ...args);
151
+ if (logMeta)
152
+ this._console(logMeta);
153
+ }
154
+ error(...args) {
155
+ if (config_1.NODE_ENV.toUpperCase() === 'DEVELOPMENT') {
156
+ console.error('\x1b[31m', ...args);
157
+ return;
158
+ }
159
+ const logMeta = this._mapLog('error', ...args);
160
+ if (!logMeta)
161
+ return;
162
+ this._console(logMeta);
163
+ this._notifyError(logMeta);
164
+ }
165
+ fatal(...args) {
166
+ const logMeta = this._mapLog('fatal', ...args);
167
+ if (!logMeta)
168
+ return;
169
+ this._console(logMeta);
170
+ this._notifyError(args);
171
+ }
172
+ warn(...args) {
173
+ const logMeta = this._mapLog('warn', ...args);
174
+ if (logMeta)
175
+ this._console(logMeta);
176
+ }
177
+ debug(...args) {
178
+ const logMeta = this._mapLog('debug', ...args);
179
+ if (logMeta)
180
+ this._console(logMeta);
181
+ }
182
+ }
183
+ exports.AppLogger = AppLogger;
@@ -0,0 +1,2 @@
1
+ export * from './app.logger';
2
+ export * from './slack.logger';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./app.logger"), exports);
18
+ __exportStar(require("./slack.logger"), exports);
@@ -0,0 +1,4 @@
1
+ import { Slack } from '../notifications/slack';
2
+ export declare class SlackLogger extends Slack {
3
+ constructor(webhookUrl: string);
4
+ }
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.SlackLogger = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const slack_1 = require("../notifications/slack");
15
+ let SlackLogger = class SlackLogger extends slack_1.Slack {
16
+ constructor(webhookUrl) {
17
+ super({ webhookUrl });
18
+ }
19
+ };
20
+ exports.SlackLogger = SlackLogger;
21
+ exports.SlackLogger = SlackLogger = __decorate([
22
+ (0, common_1.Injectable)(),
23
+ __metadata("design:paramtypes", [String])
24
+ ], SlackLogger);
@@ -0,0 +1,6 @@
1
+ export * from './mail';
2
+ export * from './mail-template';
3
+ export * from './mail.config';
4
+ export * from './mail.module';
5
+ export * from './mail.queue';
6
+ export * from './mailer';
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mail"), exports);
18
+ __exportStar(require("./mail-template"), exports);
19
+ __exportStar(require("./mail.config"), exports);
20
+ __exportStar(require("./mail.module"), exports);
21
+ __exportStar(require("./mail.queue"), exports);
22
+ __exportStar(require("./mailer"), exports);
@@ -0,0 +1,8 @@
1
+ export declare class MailTemplate {
2
+ private THEME_COLOR;
3
+ private MAX_WIDTH;
4
+ private logo;
5
+ private header;
6
+ private get FOOTER();
7
+ html(content: string): string;
8
+ }
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MailTemplate = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const config_1 = require("../../config");
12
+ let MailTemplate = class MailTemplate {
13
+ // @ts-ignore
14
+ THEME_COLOR = '#3968FE';
15
+ MAX_WIDTH = '530px';
16
+ logo() {
17
+ return `<div style="padding:1em 1.3em 0 1.3em;">
18
+ <a href="${config_1.LANDING_PAGE_URL}" title="${config_1.APP_NAME}" style="underline:none;color:${this.THEME_COLOR};text-decoration:none;">
19
+ ${config_1.APP_LOGO_URL
20
+ ? `<img src="${config_1.APP_LOGO_URL}" alt="${config_1.APP_NAME}" width="100" />`
21
+ : `<b style="font-size:1.5em;letter-spacing:0.1em;line-height:1.6;">${config_1.APP_NAME}</b>`}
22
+ </a>
23
+ </div>`;
24
+ }
25
+ header() {
26
+ return `<div style="
27
+ width:100%;
28
+ max-width:${this.MAX_WIDTH};margin:1.5em auto 0;
29
+ position:relative;
30
+ font-size:14px;padding:0.5em 0;">
31
+ ${this.logo()}
32
+ </div>`;
33
+ }
34
+ get FOOTER() {
35
+ return `<div style="font-size:12px;color:#868686;text-align:center;padding:0 1.5em">
36
+ <div style="border-top:1px solid #eee;padding:1.5em 0 2em;text-align:center">
37
+ ${new Date().getFullYear()} &copy; ${config_1.APP_NAME}
38
+ </div>
39
+ </div>`;
40
+ }
41
+ html(content) {
42
+ return `<!DOCTYPE htmlPUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
43
+ <html>
44
+ <head>
45
+ <meta http-equiv="Content-Type" CONTENT="text/html charset=UTF-8" />
46
+ <style>{
47
+ p {margin: 1.25em 0}
48
+ img {max-width:100%}
49
+ a {color: ${this.THEME_COLOR}}
50
+ }</style>
51
+ </head>
52
+ <table style="width:100%;background-color:#e5e7eb;color:#374151;font-family: Work Sans, Public Sans, Helvetica Now, Helvetica, Arial, sans-serif;" align="center" border="0" cellPadding="0" cellSpacing="0" role="presentation">
53
+ <tbody>
54
+ <tr>
55
+ <td>
56
+ <div><!--[if mso | IE]><table role="presentation" width="100%" align="center" style="max-width:${this.MAX_WIDTH};margin:0 auto;width:100%;max-width:${this.MAX_WIDTH};"><tr><td></td><td style="width:100%;max-width:${this.MAX_WIDTH};padding:0 1em;"><![endif]--></div>
57
+ <div style="border-radius:10px;background-color:white;width:100%;max-width:${this.MAX_WIDTH};margin:0 auto 1em;line-height:1.6;font-size:14px;">
58
+ ${this.header()}
59
+ <div style="padding: 1em 2em .5em;">${content}</div>
60
+ ${this.FOOTER}
61
+ </div>
62
+ <div>
63
+ <!--[if mso | IE]></td><td></td></tr></table><![endif]--></div>
64
+ </td>
65
+ </tr>
66
+ </tbody>
67
+ </table>
68
+ </html>`.replace(/ +/g, ' ');
69
+ }
70
+ };
71
+ exports.MailTemplate = MailTemplate;
72
+ exports.MailTemplate = MailTemplate = __decorate([
73
+ (0, common_1.Injectable)()
74
+ ], MailTemplate);
@@ -0,0 +1,18 @@
1
+ import { Mail } from './mail';
2
+ export interface MailerQueueDto {
3
+ email: string;
4
+ name: string;
5
+ subject: string;
6
+ mail: Mail;
7
+ cc?: string[];
8
+ bcc?: string[];
9
+ }
10
+ export interface SendEmailDto {
11
+ from: string;
12
+ to: string;
13
+ subject: string;
14
+ cc?: string[];
15
+ bcc?: string[];
16
+ html: string;
17
+ }
18
+ export declare const mailerQueue = "MAILER:QUEUE";
@@ -0,0 +1,4 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mailerQueue = void 0;
4
+ exports.mailerQueue = 'MAILER:QUEUE';
@@ -0,0 +1,23 @@
1
+ interface EmailListDetail {
2
+ title: string;
3
+ list: {
4
+ name: string;
5
+ value: string | number | bigint;
6
+ style?: string;
7
+ }[];
8
+ }
9
+ export declare class Mail {
10
+ private CONTENT;
11
+ caption(content: string): this;
12
+ p(content: string, style?: string): this;
13
+ ln(content: string): this;
14
+ a(title: string, href?: string): this;
15
+ otp(code: string | number): this;
16
+ title(title: string, style?: string): this;
17
+ action(title: string, href: string): this;
18
+ listDetail(list: EmailListDetail['list'], title?: string): this;
19
+ list(list: string[], type?: 'numbered' | 'bulleted'): this;
20
+ hr(): this;
21
+ toString(): string;
22
+ }
23
+ export {};
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Mail = void 0;
4
+ class Mail {
5
+ CONTENT = '';
6
+ caption(content) {
7
+ this.CONTENT += `<div style="margin:0 0 1.5em 0;">${content.replace(/((http:|https:)[^\s]+[\w])/g, '<a href="$1" target="_blank" style="color:#3D96FF;font-weight:500">$1</a>')}</div>`;
8
+ return this;
9
+ }
10
+ p(content, style = '') {
11
+ this.CONTENT += `<p style="
12
+ font-family: sans-serif;
13
+ font-weight: 400;
14
+ font-size: 1.2em;
15
+ margin: 1.25em 0;
16
+ ${style}">${content.replace(/((http:|https:)[^\s]+[\w])/g, '<a href="$1" target="_blank" style="color:#3D96FF;font-weight:500">$1</a>')}</p>`;
17
+ return this;
18
+ }
19
+ ln(content) {
20
+ this.CONTENT += `${content}\n`;
21
+ return this;
22
+ }
23
+ a(title, href) {
24
+ this.CONTENT += `<a href="${href ?? title}" title="${title}" style="color:#3D96FF;font-weight:500">${title}</a>`;
25
+ return this;
26
+ }
27
+ otp(code) {
28
+ this.CONTENT += `<p style="padding:1em 2em;text-align:center;font-weight:bold;font-size:30px;background-color:#eee;letter-spacing: 0.2em;border-radius:5px;">
29
+ ${code}
30
+ </p>`;
31
+ return this;
32
+ }
33
+ title(title, style = '') {
34
+ this.CONTENT += `<h1 style="
35
+ font-family: sans-serif;
36
+ font-weight: 600;
37
+ font-size: 18px;
38
+ ${style}">${title}</h1>`;
39
+ return this;
40
+ }
41
+ action(title, href) {
42
+ this.CONTENT += `<p style="margin: 2em 0"><a href="${href}" title="${title}" style="
43
+ display:block;
44
+ background: #3968FE;
45
+ color: white;
46
+ text-align: center;
47
+ padding: 12px 25px;
48
+ font-size: 14px;
49
+ border-radius: 5px;
50
+ font-weight: bold;
51
+ text-decoration: none;
52
+ font-family: sans-serif;">
53
+ ${title}</a></p>`;
54
+ return this;
55
+ }
56
+ listDetail(list, title = '') {
57
+ const parsedList = list
58
+ .map((li) => {
59
+ return `<div style="margin-bottom:8px;display:flex;justify-CONTENT:space-between;${li?.style ?? ''}">
60
+ <div style="margin-right:0.75em">${li.name}</div>
61
+ <div style="text-align:right;font-weight:bold">${li.value}</div>
62
+ </div>`;
63
+ })
64
+ .join(' ');
65
+ this.CONTENT += `<p style="text-align:center;">
66
+ ${title &&
67
+ `<div style="background-color:#F6F6F6;padding:8px 10px;border-radius:5px;font-weight:bold;margin-bottom:1em">${title}</div>`}
68
+ <div style="margin-top:5px;font-size:95%;${title ? 'padding: 0 0.75em' : ''}">
69
+ ${parsedList}
70
+ </div>
71
+ </p>`;
72
+ return this;
73
+ }
74
+ list(list, type = 'bulleted') {
75
+ const listStyleType = type === 'numbered' ? 'decimal' : 'disc';
76
+ const parsedList = list
77
+ .map((li) => {
78
+ return `<li style="margin-bottom:8px;">
79
+ <span>${li}</span>
80
+ </li>`;
81
+ })
82
+ .join('');
83
+ this.CONTENT += `<p style="text-align:center;">
84
+ <ul style="list-style-type:${listStyleType}; padding-left: 20px; margin-top:5px; font-size:100%;">
85
+ ${parsedList}
86
+ </ul>
87
+ </p>`;
88
+ return this;
89
+ }
90
+ hr() {
91
+ this.CONTENT += `<hr style="margin: 2em 0">`;
92
+ return this;
93
+ }
94
+ toString() {
95
+ return this.CONTENT;
96
+ }
97
+ }
98
+ exports.Mail = Mail;
@@ -0,0 +1,2 @@
1
+ export declare class MailModule {
2
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MailModule = void 0;
10
+ const bull_1 = require("@nestjs/bull");
11
+ const common_1 = require("@nestjs/common");
12
+ const mail_template_1 = require("./mail-template");
13
+ const mail_config_1 = require("./mail.config");
14
+ const mail_queue_1 = require("./mail.queue");
15
+ const mailer_1 = require("./mailer");
16
+ let MailModule = class MailModule {
17
+ };
18
+ exports.MailModule = MailModule;
19
+ exports.MailModule = MailModule = __decorate([
20
+ (0, common_1.Global)(),
21
+ (0, common_1.Module)({
22
+ providers: [mailer_1.Mailer, mail_template_1.MailTemplate, mail_queue_1.MailQueue],
23
+ exports: [mailer_1.Mailer, mail_template_1.MailTemplate],
24
+ imports: [bull_1.BullModule.registerQueue({ name: mail_config_1.mailerQueue })],
25
+ })
26
+ ], MailModule);
@@ -0,0 +1,9 @@
1
+ import { Job } from 'bull';
2
+ import { AppQueue } from '../queues/app.queue';
3
+ import { SendEmailDto } from './mail.config';
4
+ import { Mailer } from './mailer';
5
+ export declare class MailQueue extends AppQueue {
6
+ private mailer;
7
+ constructor(mailer: Mailer);
8
+ addLog({ data }: Job<SendEmailDto>): Promise<void>;
9
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.MailQueue = void 0;
13
+ const bull_1 = require("@nestjs/bull");
14
+ const app_queue_1 = require("../queues/app.queue");
15
+ const mail_config_1 = require("./mail.config");
16
+ const mailer_1 = require("./mailer");
17
+ let MailQueue = class MailQueue extends app_queue_1.AppQueue {
18
+ mailer;
19
+ constructor(mailer) {
20
+ super();
21
+ this.mailer = mailer;
22
+ }
23
+ async addLog({ data }) {
24
+ await this.mailer.send(data, false);
25
+ }
26
+ };
27
+ exports.MailQueue = MailQueue;
28
+ __decorate([
29
+ (0, bull_1.Process)({ name: mail_config_1.mailerQueue, concurrency: 4 }),
30
+ __metadata("design:type", Function),
31
+ __metadata("design:paramtypes", [Object]),
32
+ __metadata("design:returntype", Promise)
33
+ ], MailQueue.prototype, "addLog", null);
34
+ exports.MailQueue = MailQueue = __decorate([
35
+ (0, bull_1.Processor)(mail_config_1.mailerQueue),
36
+ __metadata("design:paramtypes", [mailer_1.Mailer])
37
+ ], MailQueue);
@@ -0,0 +1,13 @@
1
+ import { Queue } from 'bull';
2
+ import { MailTemplate } from './mail-template';
3
+ import { MailerQueueDto, SendEmailDto } from './mail.config';
4
+ export declare class Mailer {
5
+ private mailTemplate;
6
+ private mailerQueue;
7
+ private EMAIL_FROM;
8
+ private mailer;
9
+ constructor(mailTemplate: MailTemplate, mailerQueue: Queue);
10
+ private _queue;
11
+ send(params: SendEmailDto, shouldQueue: boolean): Promise<void>;
12
+ send(params: MailerQueueDto): Promise<void>;
13
+ }
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.Mailer = void 0;
16
+ const bull_1 = require("@nestjs/bull");
17
+ const common_1 = require("@nestjs/common");
18
+ const helpers_1 = require("@triproject/helpers");
19
+ const nodemailer_1 = require("nodemailer");
20
+ const config_1 = require("../../config");
21
+ const mail_template_1 = require("./mail-template");
22
+ const mail_config_1 = require("./mail.config");
23
+ let Mailer = class Mailer {
24
+ mailTemplate;
25
+ mailerQueue;
26
+ EMAIL_FROM;
27
+ mailer;
28
+ constructor(mailTemplate, mailerQueue) {
29
+ this.mailTemplate = mailTemplate;
30
+ this.mailerQueue = mailerQueue;
31
+ this.EMAIL_FROM = config_1.MAIL_FROM_EMAIL;
32
+ this.mailer = (0, nodemailer_1.createTransport)({
33
+ host: config_1.MAIL_HOST,
34
+ port: config_1.MAIL_PORT,
35
+ auth: { user: config_1.MAIL_USERNAME, pass: config_1.MAIL_PASSWORD },
36
+ });
37
+ }
38
+ async _queue(params) {
39
+ const data = {
40
+ from: this.EMAIL_FROM,
41
+ to: `${params.name} <${params.email}>`,
42
+ cc: params.cc,
43
+ bcc: params.bcc,
44
+ subject: params.subject,
45
+ html: this.mailTemplate.html(params.mail.toString()),
46
+ };
47
+ await this.mailerQueue.add(mail_config_1.mailerQueue, data, {
48
+ jobId: (0, helpers_1.generateId)(),
49
+ });
50
+ }
51
+ async send(params, shouldQueue = true) {
52
+ if (shouldQueue)
53
+ return await this._queue(params);
54
+ return await this.mailer.sendMail(params);
55
+ }
56
+ };
57
+ exports.Mailer = Mailer;
58
+ exports.Mailer = Mailer = __decorate([
59
+ (0, common_1.Injectable)(),
60
+ __param(1, (0, bull_1.InjectQueue)(mail_config_1.mailerQueue)),
61
+ __metadata("design:paramtypes", [mail_template_1.MailTemplate, Object])
62
+ ], Mailer);
@@ -0,0 +1,5 @@
1
+ export * from './notification.config';
2
+ export * from './notification.module';
3
+ export * from './notification.queue';
4
+ export * from './push-notification';
5
+ export * from './slack';