nesthub 1.0.0

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 (143) hide show
  1. package/README.md +108 -0
  2. package/dist/cache/README.md +91 -0
  3. package/dist/cache/index.d.ts +10 -0
  4. package/dist/cache/index.js +75 -0
  5. package/dist/cache/index.js.map +1 -0
  6. package/dist/cache/index.spec.d.ts +1 -0
  7. package/dist/cache/index.spec.js +61 -0
  8. package/dist/cache/index.spec.js.map +1 -0
  9. package/dist/excel/README.md +132 -0
  10. package/dist/excel/excel.module.d.ts +2 -0
  11. package/dist/excel/excel.module.js +21 -0
  12. package/dist/excel/excel.module.js.map +1 -0
  13. package/dist/excel/excel.service.d.ts +23 -0
  14. package/dist/excel/excel.service.js +124 -0
  15. package/dist/excel/excel.service.js.map +1 -0
  16. package/dist/excel/index.d.ts +2 -0
  17. package/dist/excel/index.js +8 -0
  18. package/dist/excel/index.js.map +1 -0
  19. package/dist/excel/interfaces.d.ts +19 -0
  20. package/dist/excel/interfaces.js +3 -0
  21. package/dist/excel/interfaces.js.map +1 -0
  22. package/dist/index.d.ts +1 -0
  23. package/dist/index.js +5 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/index.spec.d.ts +1 -0
  26. package/dist/index.spec.js +11 -0
  27. package/dist/index.spec.js.map +1 -0
  28. package/dist/notification/README.md +237 -0
  29. package/dist/notification/channels/channel.interface.d.ts +10 -0
  30. package/dist/notification/channels/channel.interface.js +3 -0
  31. package/dist/notification/channels/channel.interface.js.map +1 -0
  32. package/dist/notification/channels/email.channel.d.ts +11 -0
  33. package/dist/notification/channels/email.channel.js +58 -0
  34. package/dist/notification/channels/email.channel.js.map +1 -0
  35. package/dist/notification/channels/firebase.channel.d.ts +11 -0
  36. package/dist/notification/channels/firebase.channel.js +69 -0
  37. package/dist/notification/channels/firebase.channel.js.map +1 -0
  38. package/dist/notification/channels/index.d.ts +5 -0
  39. package/dist/notification/channels/index.js +12 -0
  40. package/dist/notification/channels/index.js.map +1 -0
  41. package/dist/notification/channels/sms.channel.d.ts +8 -0
  42. package/dist/notification/channels/sms.channel.js +90 -0
  43. package/dist/notification/channels/sms.channel.js.map +1 -0
  44. package/dist/notification/channels/telegram.channel.d.ts +10 -0
  45. package/dist/notification/channels/telegram.channel.js +59 -0
  46. package/dist/notification/channels/telegram.channel.js.map +1 -0
  47. package/dist/notification/email/index.d.ts +62 -0
  48. package/dist/notification/email/index.js +253 -0
  49. package/dist/notification/email/index.js.map +1 -0
  50. package/dist/notification/email/index.spec.d.ts +1 -0
  51. package/dist/notification/email/index.spec.js +121 -0
  52. package/dist/notification/email/index.spec.js.map +1 -0
  53. package/dist/notification/entities/notification-log.entity.d.ts +15 -0
  54. package/dist/notification/entities/notification-log.entity.js +82 -0
  55. package/dist/notification/entities/notification-log.entity.js.map +1 -0
  56. package/dist/notification/firebase/index.d.ts +52 -0
  57. package/dist/notification/firebase/index.js +261 -0
  58. package/dist/notification/firebase/index.js.map +1 -0
  59. package/dist/notification/firebase/index.spec.d.ts +1 -0
  60. package/dist/notification/firebase/index.spec.js +114 -0
  61. package/dist/notification/firebase/index.spec.js.map +1 -0
  62. package/dist/notification/index.d.ts +12 -0
  63. package/dist/notification/index.js +26 -0
  64. package/dist/notification/index.js.map +1 -0
  65. package/dist/notification/index.spec.d.ts +1 -0
  66. package/dist/notification/index.spec.js +336 -0
  67. package/dist/notification/index.spec.js.map +1 -0
  68. package/dist/notification/interfaces.d.ts +98 -0
  69. package/dist/notification/interfaces.js +3 -0
  70. package/dist/notification/interfaces.js.map +1 -0
  71. package/dist/notification/notification.constants.d.ts +4 -0
  72. package/dist/notification/notification.constants.js +8 -0
  73. package/dist/notification/notification.constants.js.map +1 -0
  74. package/dist/notification/notification.module.d.ts +10 -0
  75. package/dist/notification/notification.module.js +160 -0
  76. package/dist/notification/notification.module.js.map +1 -0
  77. package/dist/notification/notification.service.d.ts +14 -0
  78. package/dist/notification/notification.service.js +184 -0
  79. package/dist/notification/notification.service.js.map +1 -0
  80. package/dist/notification/queue/index.d.ts +2 -0
  81. package/dist/notification/queue/index.js +6 -0
  82. package/dist/notification/queue/index.js.map +1 -0
  83. package/dist/notification/queue/notification-queue.service.d.ts +31 -0
  84. package/dist/notification/queue/notification-queue.service.js +134 -0
  85. package/dist/notification/queue/notification-queue.service.js.map +1 -0
  86. package/dist/notification/services/index.d.ts +1 -0
  87. package/dist/notification/services/index.js +6 -0
  88. package/dist/notification/services/index.js.map +1 -0
  89. package/dist/notification/services/template.service.d.ts +13 -0
  90. package/dist/notification/services/template.service.js +75 -0
  91. package/dist/notification/services/template.service.js.map +1 -0
  92. package/dist/notification/shared.d.ts +48 -0
  93. package/dist/notification/shared.js +95 -0
  94. package/dist/notification/shared.js.map +1 -0
  95. package/dist/notification/sms/index.d.ts +52 -0
  96. package/dist/notification/sms/index.js +234 -0
  97. package/dist/notification/sms/index.js.map +1 -0
  98. package/dist/notification/sms/index.spec.d.ts +1 -0
  99. package/dist/notification/sms/index.spec.js +123 -0
  100. package/dist/notification/sms/index.spec.js.map +1 -0
  101. package/dist/notification/telegram/index.d.ts +50 -0
  102. package/dist/notification/telegram/index.js +248 -0
  103. package/dist/notification/telegram/index.js.map +1 -0
  104. package/dist/notification/telegram/index.spec.d.ts +1 -0
  105. package/dist/notification/telegram/index.spec.js +108 -0
  106. package/dist/notification/telegram/index.spec.js.map +1 -0
  107. package/dist/notification/typeorm-storage.d.ts +28 -0
  108. package/dist/notification/typeorm-storage.js +56 -0
  109. package/dist/notification/typeorm-storage.js.map +1 -0
  110. package/dist/notification/unified.d.ts +47 -0
  111. package/dist/notification/unified.js +207 -0
  112. package/dist/notification/unified.js.map +1 -0
  113. package/dist/queue/README.md +82 -0
  114. package/dist/queue/index.d.ts +14 -0
  115. package/dist/queue/index.js +17 -0
  116. package/dist/queue/index.js.map +1 -0
  117. package/dist/queue/index.spec.d.ts +1 -0
  118. package/dist/queue/index.spec.js +76 -0
  119. package/dist/queue/index.spec.js.map +1 -0
  120. package/dist/tsconfig.build.tsbuildinfo +1 -0
  121. package/dist/tsconfig.tsbuildinfo +1 -0
  122. package/dist/typeorm/README.md +197 -0
  123. package/dist/typeorm/crud-controller.d.ts +4 -0
  124. package/dist/typeorm/crud-controller.js +81 -0
  125. package/dist/typeorm/crud-controller.js.map +1 -0
  126. package/dist/typeorm/crud-service.d.ts +6 -0
  127. package/dist/typeorm/crud-service.js +53 -0
  128. package/dist/typeorm/crud-service.js.map +1 -0
  129. package/dist/typeorm/crud.interface.d.ts +9 -0
  130. package/dist/typeorm/crud.interface.js +3 -0
  131. package/dist/typeorm/crud.interface.js.map +1 -0
  132. package/dist/typeorm/index.d.ts +23 -0
  133. package/dist/typeorm/index.js +66 -0
  134. package/dist/typeorm/index.js.map +1 -0
  135. package/dist/typeorm/index.spec.d.ts +1 -0
  136. package/dist/typeorm/index.spec.js +109 -0
  137. package/dist/typeorm/index.spec.js.map +1 -0
  138. package/package.json +229 -0
  139. package/src/cache/README.md +91 -0
  140. package/src/excel/README.md +132 -0
  141. package/src/notification/README.md +237 -0
  142. package/src/queue/README.md +82 -0
  143. package/src/typeorm/README.md +197 -0
@@ -0,0 +1,52 @@
1
+ import type { DynamicModule, InjectionToken, OptionalFactoryDependency } from '@nestjs/common';
2
+ import type { SendMode, SendResult, NotificationStorage, NotificationTemplate } from '../shared';
3
+ export declare const SMS_SERVICE = "SMS_SERVICE";
4
+ export interface SendSmsOptions {
5
+ to: string;
6
+ body?: string;
7
+ template?: string;
8
+ context?: Record<string, unknown>;
9
+ locale?: string;
10
+ from?: string;
11
+ mode?: SendMode;
12
+ expiresAt?: Date | string;
13
+ dedupId?: string;
14
+ }
15
+ export interface ISmsService {
16
+ sendSms(options: SendSmsOptions): Promise<SendResult>;
17
+ cancelJob(dedupId: string): Promise<void>;
18
+ }
19
+ export interface SmsModuleOptions {
20
+ defaultFrom?: string;
21
+ defaultLocale?: string;
22
+ twilio?: {
23
+ accountSid: string;
24
+ authToken: string;
25
+ from?: string;
26
+ };
27
+ queue?: {
28
+ useQueue?: boolean;
29
+ connection?: {
30
+ url: string;
31
+ };
32
+ prefix?: string;
33
+ defaultJobOptions?: Record<string, unknown>;
34
+ worker?: boolean;
35
+ concurrency?: number;
36
+ };
37
+ templates?: {
38
+ dir?: string;
39
+ templates?: Record<string, NotificationTemplate>;
40
+ };
41
+ storage?: {
42
+ provider?: NotificationStorage;
43
+ typeorm?: boolean;
44
+ };
45
+ }
46
+ export declare class SmsModule {
47
+ static forRoot(options?: SmsModuleOptions): DynamicModule;
48
+ static forRootAsync(options: {
49
+ useFactory: (...args: unknown[]) => SmsModuleOptions | Promise<SmsModuleOptions>;
50
+ inject?: (InjectionToken | OptionalFactoryDependency)[];
51
+ }): DynamicModule;
52
+ }
@@ -0,0 +1,234 @@
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
+ var SmsModule_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.SmsModule = exports.SMS_SERVICE = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const shared_1 = require("../shared");
19
+ const typeorm_storage_1 = require("../typeorm-storage");
20
+ exports.SMS_SERVICE = 'SMS_SERVICE';
21
+ let SmsServiceImpl = class SmsServiceImpl {
22
+ options;
23
+ injectedStorage;
24
+ templateService = new shared_1.TemplateService();
25
+ twilioClient;
26
+ queueClient;
27
+ workerClient;
28
+ storage;
29
+ constructor(options, injectedStorage) {
30
+ this.options = options;
31
+ this.injectedStorage = injectedStorage;
32
+ this.storage =
33
+ injectedStorage ??
34
+ options.storage?.provider ??
35
+ new shared_1.ConsoleNotificationStorage();
36
+ }
37
+ async onModuleInit() {
38
+ const { templates, twilio, queue } = this.options;
39
+ if (templates?.dir)
40
+ await this.templateService.loadFromDir(templates.dir);
41
+ if (templates?.templates)
42
+ this.templateService.loadFromRecord(templates.templates);
43
+ if (twilio?.accountSid && twilio?.authToken) {
44
+ try {
45
+ const twilioModule = (await (0, shared_1.dynamicImport)('twilio'));
46
+ this.twilioClient = twilioModule.default(twilio.accountSid, twilio.authToken);
47
+ }
48
+ catch {
49
+ console.warn('[SmsModule] twilio not installed. Falling back to console.');
50
+ }
51
+ }
52
+ if (queue?.useQueue && queue?.connection?.url) {
53
+ try {
54
+ const bullmqModule = (await (0, shared_1.dynamicImport)('bullmq'));
55
+ const queueName = queue.prefix ?? 'sms-notifications';
56
+ this.queueClient = new bullmqModule.Queue(queueName, {
57
+ connection: { url: queue.connection.url },
58
+ defaultJobOptions: queue.defaultJobOptions,
59
+ });
60
+ if (queue.worker !== false) {
61
+ this.workerClient = new bullmqModule.Worker(queueName, async (job) => this.processQueuedJob(job), {
62
+ connection: { url: queue.connection.url },
63
+ concurrency: queue.concurrency ?? 1,
64
+ });
65
+ }
66
+ }
67
+ catch {
68
+ console.warn('[SmsModule] bullmq not installed. Queue mode disabled.');
69
+ }
70
+ }
71
+ }
72
+ async onModuleDestroy() {
73
+ await this.workerClient?.close();
74
+ await this.queueClient?.close();
75
+ }
76
+ async sendSms(options) {
77
+ if ((options.mode ?? 'direct') === 'queue' && this.queueClient) {
78
+ return this.enqueue(options);
79
+ }
80
+ return this.sendNow(options);
81
+ }
82
+ async cancelJob(dedupId) {
83
+ if (!this.queueClient)
84
+ return;
85
+ const record = await this.storage.findByDedupId(dedupId);
86
+ if (!record || record.status !== 'pending')
87
+ return;
88
+ try {
89
+ await this.queueClient.remove(record.id);
90
+ }
91
+ catch {
92
+ }
93
+ await this.storage.update(record.id, { status: 'cancelled' });
94
+ }
95
+ async processQueuedJob(job) {
96
+ const { data } = job;
97
+ if (data.expiresAt && new Date(data.expiresAt) < new Date()) {
98
+ await this.storage.update(job.id, {
99
+ status: 'expired',
100
+ error: 'Expired before processing',
101
+ });
102
+ return;
103
+ }
104
+ if (data.dedupId) {
105
+ const record = await this.storage.findByDedupId(data.dedupId);
106
+ if (record &&
107
+ (record.status === 'cancelled' || record.status === 'expired'))
108
+ return;
109
+ }
110
+ const result = await this.sendNow(data);
111
+ await this.storage.update(job.id, {
112
+ status: result.success ? 'sent' : 'failed',
113
+ messageId: result.messageId,
114
+ error: result.error,
115
+ sentAt: new Date().toISOString(),
116
+ });
117
+ }
118
+ async sendNow(options) {
119
+ try {
120
+ const { to, body, template, context = {}, locale, from } = options;
121
+ const resolvedLocale = locale ?? this.options.defaultLocale ?? 'en';
122
+ const ctx = { ...context, locale: resolvedLocale };
123
+ let resolvedBody = body;
124
+ if (template) {
125
+ const tmplName = this.templateService.resolveName(template, resolvedLocale);
126
+ if (!resolvedBody) {
127
+ resolvedBody =
128
+ this.templateService.render(`body:${tmplName}`, ctx) ||
129
+ this.templateService.render(tmplName, ctx);
130
+ }
131
+ }
132
+ if (!resolvedBody) {
133
+ return { success: false, error: 'No content to send' };
134
+ }
135
+ if (this.twilioClient) {
136
+ const message = await this.twilioClient.messages.create({
137
+ to,
138
+ from: from ?? this.options.twilio?.from ?? this.options.defaultFrom,
139
+ body: resolvedBody,
140
+ });
141
+ return { success: true, messageId: message.sid };
142
+ }
143
+ console.log('[SmsService] SMS:', JSON.stringify({ to, from, body: resolvedBody }));
144
+ return { success: true, messageId: `mock-${Date.now()}` };
145
+ }
146
+ catch (error) {
147
+ const message = error instanceof Error ? error.message : 'Unknown error';
148
+ return { success: false, error: message };
149
+ }
150
+ }
151
+ async enqueue(options) {
152
+ try {
153
+ const jobOpts = {};
154
+ if (options.dedupId)
155
+ jobOpts.deduplication = { id: options.dedupId };
156
+ const job = await this.queueClient.add('send-sms', options, jobOpts);
157
+ await this.storage.save({
158
+ id: job.id ?? '',
159
+ to: options.to,
160
+ body: options.body,
161
+ template: options.template,
162
+ channel: 'sms',
163
+ status: 'pending',
164
+ expiresAt: options.expiresAt
165
+ ? new Date(options.expiresAt).toISOString()
166
+ : undefined,
167
+ dedupId: options.dedupId,
168
+ createdAt: new Date().toISOString(),
169
+ });
170
+ return { success: true, messageId: job.id, jobId: job.id };
171
+ }
172
+ catch (error) {
173
+ const message = error instanceof Error ? error.message : 'Unknown error';
174
+ return { success: false, error: message };
175
+ }
176
+ }
177
+ };
178
+ SmsServiceImpl = __decorate([
179
+ (0, common_1.Injectable)(),
180
+ __param(0, (0, common_1.Inject)('SMS_MODULE_OPTIONS')),
181
+ __param(1, (0, common_1.Optional)()),
182
+ __param(1, (0, common_1.Inject)(shared_1.NOTIFICATION_STORAGE)),
183
+ __metadata("design:paramtypes", [Object, Object])
184
+ ], SmsServiceImpl);
185
+ let SmsModule = SmsModule_1 = class SmsModule {
186
+ static forRoot(options = {}) {
187
+ const providers = [
188
+ { provide: 'SMS_MODULE_OPTIONS', useValue: options },
189
+ { provide: exports.SMS_SERVICE, useClass: SmsServiceImpl },
190
+ ];
191
+ const imports = [];
192
+ if (options.storage?.typeorm) {
193
+ try {
194
+ const { TypeOrmModule, getRepositoryToken } = (0, typeorm_storage_1.getTypeOrmHelpers)();
195
+ const entity = (0, typeorm_storage_1.getOrCreateEntity)();
196
+ imports.push(TypeOrmModule.forFeature([entity]));
197
+ providers.push({
198
+ provide: shared_1.NOTIFICATION_STORAGE,
199
+ useFactory: (repo) => new typeorm_storage_1.TypeOrmNotificationStorage(repo),
200
+ inject: [getRepositoryToken(entity)],
201
+ });
202
+ }
203
+ catch {
204
+ throw new Error('SmsModule: @nestjs/typeorm and typeorm must be installed when storage.typeorm is true');
205
+ }
206
+ }
207
+ return {
208
+ module: SmsModule_1,
209
+ imports,
210
+ providers,
211
+ exports: [exports.SMS_SERVICE],
212
+ };
213
+ }
214
+ static forRootAsync(options) {
215
+ return {
216
+ module: SmsModule_1,
217
+ providers: [
218
+ {
219
+ provide: 'SMS_MODULE_OPTIONS',
220
+ useFactory: options.useFactory,
221
+ inject: options.inject ?? [],
222
+ },
223
+ { provide: exports.SMS_SERVICE, useClass: SmsServiceImpl },
224
+ ],
225
+ exports: [exports.SMS_SERVICE],
226
+ };
227
+ }
228
+ };
229
+ exports.SmsModule = SmsModule;
230
+ exports.SmsModule = SmsModule = SmsModule_1 = __decorate([
231
+ (0, common_1.Global)(),
232
+ (0, common_1.Module)({})
233
+ ], SmsModule);
234
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/notification/sms/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ let nextJobId = 1;
4
+ jest.mock('bullmq', () => ({
5
+ Queue: jest.fn().mockImplementation(() => ({
6
+ add: jest
7
+ .fn()
8
+ .mockImplementation(() => Promise.resolve({ id: `sms-job-${nextJobId++}` })),
9
+ remove: jest.fn().mockResolvedValue(undefined),
10
+ close: jest.fn().mockResolvedValue(undefined),
11
+ })),
12
+ Worker: jest.fn().mockImplementation(() => ({
13
+ close: jest.fn().mockResolvedValue(undefined),
14
+ })),
15
+ }));
16
+ const testing_1 = require("@nestjs/testing");
17
+ const index_1 = require("./index");
18
+ describe('@vn.chemgio/nestjs-utilities/notification/sms', () => {
19
+ let service;
20
+ let module;
21
+ afterEach(async () => {
22
+ if (module)
23
+ await module.close();
24
+ });
25
+ it('should send SMS via console fallback', async () => {
26
+ module = await testing_1.Test.createTestingModule({
27
+ imports: [
28
+ index_1.SmsModule.forRoot({
29
+ twilio: { accountSid: 'sid', authToken: 'token' },
30
+ }),
31
+ ],
32
+ }).compile();
33
+ await module.init();
34
+ service = module.get(index_1.SMS_SERVICE);
35
+ const result = await service.sendSms({ to: '+84123456789', body: 'Hello' });
36
+ expect(result.success).toBe(true);
37
+ expect(result.messageId).toMatch(/^mock-/);
38
+ });
39
+ it('should return no-content error', async () => {
40
+ module = await testing_1.Test.createTestingModule({
41
+ imports: [
42
+ index_1.SmsModule.forRoot({
43
+ twilio: { accountSid: 'sid', authToken: 'token' },
44
+ }),
45
+ ],
46
+ }).compile();
47
+ await module.init();
48
+ service = module.get(index_1.SMS_SERVICE);
49
+ const result = await service.sendSms({ to: '+84123456789' });
50
+ expect(result.success).toBe(false);
51
+ expect(result.error).toBe('No content to send');
52
+ });
53
+ it('should render handlebars template', async () => {
54
+ module = await testing_1.Test.createTestingModule({
55
+ imports: [
56
+ index_1.SmsModule.forRoot({
57
+ twilio: { accountSid: 'sid', authToken: 'token' },
58
+ templates: {
59
+ templates: {
60
+ otp: { body: 'Your code is {{code}}' },
61
+ },
62
+ },
63
+ }),
64
+ ],
65
+ }).compile();
66
+ await module.init();
67
+ service = module.get(index_1.SMS_SERVICE);
68
+ const result = await service.sendSms({
69
+ to: '+84123456789',
70
+ template: 'otp',
71
+ context: { code: '123456' },
72
+ });
73
+ expect(result.success).toBe(true);
74
+ });
75
+ it('should queue SMS and save pending record', async () => {
76
+ module = await testing_1.Test.createTestingModule({
77
+ imports: [
78
+ index_1.SmsModule.forRoot({
79
+ twilio: { accountSid: 'sid', authToken: 'token' },
80
+ queue: {
81
+ useQueue: true,
82
+ connection: { url: 'redis://localhost:6379' },
83
+ worker: false,
84
+ },
85
+ }),
86
+ ],
87
+ }).compile();
88
+ await module.init();
89
+ service = module.get(index_1.SMS_SERVICE);
90
+ const result = await service.sendSms({
91
+ to: '+84123456789',
92
+ body: 'Queued SMS',
93
+ mode: 'queue',
94
+ });
95
+ expect(result.success).toBe(true);
96
+ expect(result.jobId).toMatch(/^sms-job-/);
97
+ });
98
+ it('should cancel a pending job by dedupId', async () => {
99
+ module = await testing_1.Test.createTestingModule({
100
+ imports: [
101
+ index_1.SmsModule.forRoot({
102
+ twilio: { accountSid: 'sid', authToken: 'token' },
103
+ queue: {
104
+ useQueue: true,
105
+ connection: { url: 'redis://localhost:6379' },
106
+ worker: false,
107
+ },
108
+ }),
109
+ ],
110
+ }).compile();
111
+ await module.init();
112
+ service = module.get(index_1.SMS_SERVICE);
113
+ const sendResult = await service.sendSms({
114
+ to: '+84123456789',
115
+ body: 'Cancel test',
116
+ mode: 'queue',
117
+ dedupId: 'sms-cancel-test',
118
+ });
119
+ expect(sendResult.success).toBe(true);
120
+ await service.cancelJob('sms-cancel-test');
121
+ });
122
+ });
123
+ //# sourceMappingURL=index.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.spec.js","sourceRoot":"","sources":["../../../src/notification/sms/index.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { DynamicModule, InjectionToken, OptionalFactoryDependency } from '@nestjs/common';
2
+ import type { SendMode, SendResult, NotificationStorage, NotificationTemplate } from '../shared';
3
+ export declare const TELEGRAM_SERVICE = "TELEGRAM_SERVICE";
4
+ export interface SendTelegramOptions {
5
+ chatId: string | number;
6
+ text?: string;
7
+ parseMode?: 'HTML' | 'MarkdownV2' | 'Markdown';
8
+ disableWebPagePreview?: boolean;
9
+ disableNotification?: boolean;
10
+ replyToMessageId?: number;
11
+ template?: string;
12
+ context?: Record<string, unknown>;
13
+ locale?: string;
14
+ mode?: SendMode;
15
+ expiresAt?: Date | string;
16
+ dedupId?: string;
17
+ }
18
+ export interface ITelegramService {
19
+ sendTelegram(options: SendTelegramOptions): Promise<SendResult>;
20
+ cancelJob(dedupId: string): Promise<void>;
21
+ }
22
+ export interface TelegramModuleOptions {
23
+ botToken: string;
24
+ defaultLocale?: string;
25
+ queue?: {
26
+ useQueue?: boolean;
27
+ connection?: {
28
+ url: string;
29
+ };
30
+ prefix?: string;
31
+ defaultJobOptions?: Record<string, unknown>;
32
+ worker?: boolean;
33
+ concurrency?: number;
34
+ };
35
+ templates?: {
36
+ dir?: string;
37
+ templates?: Record<string, NotificationTemplate>;
38
+ };
39
+ storage?: {
40
+ provider?: NotificationStorage;
41
+ typeorm?: boolean;
42
+ };
43
+ }
44
+ export declare class TelegramModule {
45
+ static forRoot(options: TelegramModuleOptions): DynamicModule;
46
+ static forRootAsync(options: {
47
+ useFactory: (...args: unknown[]) => TelegramModuleOptions | Promise<TelegramModuleOptions>;
48
+ inject?: (InjectionToken | OptionalFactoryDependency)[];
49
+ }): DynamicModule;
50
+ }