@bopen-io/messagebox-server 1.2.2 → 1.2.4

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/out/knexfile.js +25 -0
  2. package/out/knexfile.js.map +1 -0
  3. package/out/src/__tests/compose.test.js +25 -0
  4. package/out/src/__tests/compose.test.js.map +1 -0
  5. package/out/src/app.js +162 -0
  6. package/out/src/app.js.map +1 -0
  7. package/out/src/compose.js +239 -0
  8. package/out/src/compose.js.map +1 -0
  9. package/out/src/config/firebase.js +150 -0
  10. package/out/src/config/firebase.js.map +1 -0
  11. package/out/src/context.js +23 -0
  12. package/out/src/context.js.map +1 -0
  13. package/out/src/index.js +311 -0
  14. package/out/src/index.js.map +1 -0
  15. package/out/src/migrations/2022-12-28-001-initial-migration.js +28 -0
  16. package/out/src/migrations/2022-12-28-001-initial-migration.js.map +1 -0
  17. package/out/src/migrations/2023-01-17-messages-update.js +11 -0
  18. package/out/src/migrations/2023-01-17-messages-update.js.map +1 -0
  19. package/out/src/migrations/2024-03-05-001-messageID-upgrade.js +21 -0
  20. package/out/src/migrations/2024-03-05-001-messageID-upgrade.js.map +1 -0
  21. package/out/src/migrations/2025-01-31-001-notification-permissions.js +59 -0
  22. package/out/src/migrations/2025-01-31-001-notification-permissions.js.map +1 -0
  23. package/out/src/migrations/2025-01-31-002-device-registrations.js +24 -0
  24. package/out/src/migrations/2025-01-31-002-device-registrations.js.map +1 -0
  25. package/out/src/routes/__tests/acknowledgeMessage.test.js +135 -0
  26. package/out/src/routes/__tests/acknowledgeMessage.test.js.map +1 -0
  27. package/out/src/routes/__tests/listMessages.test.js +217 -0
  28. package/out/src/routes/__tests/listMessages.test.js.map +1 -0
  29. package/out/src/routes/__tests/sendMessage.test.js +313 -0
  30. package/out/src/routes/__tests/sendMessage.test.js.map +1 -0
  31. package/out/src/routes/acknowledgeMessage.js +133 -0
  32. package/out/src/routes/acknowledgeMessage.js.map +1 -0
  33. package/out/src/routes/index.js +17 -0
  34. package/out/src/routes/index.js.map +1 -0
  35. package/out/src/routes/listDevices.js +63 -0
  36. package/out/src/routes/listDevices.js.map +1 -0
  37. package/out/src/routes/listMessages.js +176 -0
  38. package/out/src/routes/listMessages.js.map +1 -0
  39. package/out/src/routes/permissions/getPermission.js +138 -0
  40. package/out/src/routes/permissions/getPermission.js.map +1 -0
  41. package/out/src/routes/permissions/getQuote.js +165 -0
  42. package/out/src/routes/permissions/getQuote.js.map +1 -0
  43. package/out/src/routes/permissions/index.js +12 -0
  44. package/out/src/routes/permissions/index.js.map +1 -0
  45. package/out/src/routes/permissions/listPermissions.js +179 -0
  46. package/out/src/routes/permissions/listPermissions.js.map +1 -0
  47. package/out/src/routes/permissions/setPermission.js +137 -0
  48. package/out/src/routes/permissions/setPermission.js.map +1 -0
  49. package/out/src/routes/registerDevice.js +139 -0
  50. package/out/src/routes/registerDevice.js.map +1 -0
  51. package/out/src/routes/sendMessage.js +438 -0
  52. package/out/src/routes/sendMessage.js.map +1 -0
  53. package/out/src/runtimeDeps.js +15 -0
  54. package/out/src/runtimeDeps.js.map +1 -0
  55. package/out/src/swagger.js +48 -0
  56. package/out/src/swagger.js.map +1 -0
  57. package/out/src/telemetry.js +134 -0
  58. package/out/src/telemetry.js.map +1 -0
  59. package/out/src/types/messagePermissions.js +2 -0
  60. package/out/src/types/messagePermissions.js.map +1 -0
  61. package/out/src/types/notifications.js +2 -0
  62. package/out/src/types/notifications.js.map +1 -0
  63. package/out/src/utils/logger.js +90 -0
  64. package/out/src/utils/logger.js.map +1 -0
  65. package/out/src/utils/messagePermissions.js +115 -0
  66. package/out/src/utils/messagePermissions.js.map +1 -0
  67. package/out/src/utils/sendFCMNotification.js +110 -0
  68. package/out/src/utils/sendFCMNotification.js.map +1 -0
  69. package/out/tsconfig.tsbuildinfo +1 -0
  70. package/out/types/jest.config.d.ts +4 -0
  71. package/out/types/jest.config.d.ts.map +1 -0
  72. package/out/types/jest.config.integration.d.ts +5 -0
  73. package/out/types/jest.config.integration.d.ts.map +1 -0
  74. package/out/types/knexfile.d.ts +6 -0
  75. package/out/types/knexfile.d.ts.map +1 -0
  76. package/out/types/src/__tests/compose.test.d.ts +2 -0
  77. package/out/types/src/__tests/compose.test.d.ts.map +1 -0
  78. package/out/types/src/app.d.ts +63 -0
  79. package/out/types/src/app.d.ts.map +1 -0
  80. package/out/types/src/compose.d.ts +22 -0
  81. package/out/types/src/compose.d.ts.map +1 -0
  82. package/out/types/src/config/firebase.d.ts +34 -0
  83. package/out/types/src/config/firebase.d.ts.map +1 -0
  84. package/out/types/src/context.d.ts +23 -0
  85. package/out/types/src/context.d.ts.map +1 -0
  86. package/out/types/src/index.d.ts +43 -0
  87. package/out/types/src/index.d.ts.map +1 -0
  88. package/out/types/src/migrations/2022-12-28-001-initial-migration.d.ts +4 -0
  89. package/out/types/src/migrations/2022-12-28-001-initial-migration.d.ts.map +1 -0
  90. package/out/types/src/migrations/2023-01-17-messages-update.d.ts +4 -0
  91. package/out/types/src/migrations/2023-01-17-messages-update.d.ts.map +1 -0
  92. package/out/types/src/migrations/2024-03-05-001-messageID-upgrade.d.ts +4 -0
  93. package/out/types/src/migrations/2024-03-05-001-messageID-upgrade.d.ts.map +1 -0
  94. package/out/types/src/migrations/2025-01-31-001-notification-permissions.d.ts +4 -0
  95. package/out/types/src/migrations/2025-01-31-001-notification-permissions.d.ts.map +1 -0
  96. package/out/types/src/migrations/2025-01-31-002-device-registrations.d.ts +4 -0
  97. package/out/types/src/migrations/2025-01-31-002-device-registrations.d.ts.map +1 -0
  98. package/out/types/src/routes/__tests/acknowledgeMessage.test.d.ts +2 -0
  99. package/out/types/src/routes/__tests/acknowledgeMessage.test.d.ts.map +1 -0
  100. package/out/types/src/routes/__tests/listMessages.test.d.ts +2 -0
  101. package/out/types/src/routes/__tests/listMessages.test.d.ts.map +1 -0
  102. package/out/types/src/routes/__tests/sendMessage.test.d.ts +2 -0
  103. package/out/types/src/routes/__tests/sendMessage.test.d.ts.map +1 -0
  104. package/out/types/src/routes/acknowledgeMessage.d.ts +100 -0
  105. package/out/types/src/routes/acknowledgeMessage.d.ts.map +1 -0
  106. package/out/types/src/routes/index.d.ts +11 -0
  107. package/out/types/src/routes/index.d.ts.map +1 -0
  108. package/out/types/src/routes/listDevices.d.ts +19 -0
  109. package/out/types/src/routes/listDevices.d.ts.map +1 -0
  110. package/out/types/src/routes/listMessages.d.ts +124 -0
  111. package/out/types/src/routes/listMessages.d.ts.map +1 -0
  112. package/out/types/src/routes/permissions/getPermission.d.ts +46 -0
  113. package/out/types/src/routes/permissions/getPermission.d.ts.map +1 -0
  114. package/out/types/src/routes/permissions/getQuote.d.ts +50 -0
  115. package/out/types/src/routes/permissions/getQuote.d.ts.map +1 -0
  116. package/out/types/src/routes/permissions/index.d.ts +18 -0
  117. package/out/types/src/routes/permissions/index.d.ts.map +1 -0
  118. package/out/types/src/routes/permissions/listPermissions.d.ts +106 -0
  119. package/out/types/src/routes/permissions/listPermissions.d.ts.map +1 -0
  120. package/out/types/src/routes/permissions/setPermission.d.ts +53 -0
  121. package/out/types/src/routes/permissions/setPermission.d.ts.map +1 -0
  122. package/out/types/src/routes/registerDevice.d.ts +67 -0
  123. package/out/types/src/routes/registerDevice.d.ts.map +1 -0
  124. package/out/types/src/routes/sendMessage.d.ts +140 -0
  125. package/out/types/src/routes/sendMessage.d.ts.map +1 -0
  126. package/out/types/src/runtimeDeps.d.ts +17 -0
  127. package/out/types/src/runtimeDeps.d.ts.map +1 -0
  128. package/out/types/src/swagger.d.ts +3 -0
  129. package/out/types/src/swagger.d.ts.map +1 -0
  130. package/out/types/src/telemetry.d.ts +2 -0
  131. package/out/types/src/telemetry.d.ts.map +1 -0
  132. package/out/types/src/types/messagePermissions.d.ts +15 -0
  133. package/out/types/src/types/messagePermissions.d.ts.map +1 -0
  134. package/out/types/src/types/notifications.d.ts +20 -0
  135. package/out/types/src/types/notifications.d.ts.map +1 -0
  136. package/out/types/src/utils/logger.d.ts +17 -0
  137. package/out/types/src/utils/logger.d.ts.map +1 -0
  138. package/out/types/src/utils/messagePermissions.d.ts +29 -0
  139. package/out/types/src/utils/messagePermissions.d.ts.map +1 -0
  140. package/out/types/src/utils/sendFCMNotification.d.ts +22 -0
  141. package/out/types/src/utils/sendFCMNotification.d.ts.map +1 -0
  142. package/package.json +1 -1
  143. package/src/utils/logger.ts +6 -2
@@ -0,0 +1,313 @@
1
+ /* eslint-env jest */
2
+ import sendMessage, { calculateMessagePrice } from '../sendMessage.js';
3
+ import mockKnex from 'mock-knex';
4
+ import knexLib from 'knex';
5
+ import knexConfig from '../../../knexfile.js';
6
+ import { bindMessageBoxRuntime } from '../../runtimeDeps.js';
7
+ import { Logger } from '../../utils/logger.js';
8
+ import axios from 'axios';
9
+ import AxiosMockAdapter from 'axios-mock-adapter';
10
+ global.fetch = jest.fn();
11
+ const testKnex = knexLib.default?.(knexConfig.development) ??
12
+ knexLib(knexConfig.development);
13
+ bindMessageBoxRuntime({ knex: testKnex });
14
+ const knex = sendMessage.knex;
15
+ let queryTracker;
16
+ let axiosMock;
17
+ // Define Mock Express Response Object
18
+ const mockRes = {
19
+ status: jest.fn().mockReturnThis(),
20
+ json: jest.fn().mockReturnThis(),
21
+ sendStatus: jest.fn().mockReturnThis(),
22
+ send: jest.fn().mockReturnThis(),
23
+ end: jest.fn().mockReturnThis(),
24
+ setHeader: jest.fn().mockReturnThis(),
25
+ getHeader: jest.fn(),
26
+ getHeaders: jest.fn(),
27
+ header: jest.fn().mockReturnThis(),
28
+ type: jest.fn().mockReturnThis(),
29
+ format: jest.fn(),
30
+ location: jest.fn().mockReturnThis(),
31
+ redirect: jest.fn().mockReturnThis(),
32
+ append: jest.fn().mockReturnThis(),
33
+ render: jest.fn(),
34
+ vary: jest.fn().mockReturnThis(),
35
+ cookie: jest.fn().mockReturnThis(),
36
+ clearCookie: jest.fn().mockReturnThis()
37
+ };
38
+ let validReq;
39
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
40
+ let validRes;
41
+ let validMessageBox;
42
+ describe('sendMessage', () => {
43
+ // Capture original console methods
44
+ const originalError = console.error;
45
+ const originalLog = console.log;
46
+ const originalWarn = console.warn;
47
+ beforeAll(() => {
48
+ mockKnex.mock(knex);
49
+ });
50
+ beforeEach(() => {
51
+ Logger.enable();
52
+ jest.spyOn(console, 'error').mockImplementation((...args) => originalError(...args));
53
+ jest.spyOn(console, 'log').mockImplementation((...args) => originalLog(...args));
54
+ jest.spyOn(console, 'warn').mockImplementation((...args) => originalWarn(...args));
55
+ const instance = axios;
56
+ // eslint-disable-next-line @typescript-eslint/prefer-ts-expect-error
57
+ // @ts-ignore
58
+ axiosMock = new AxiosMockAdapter(instance);
59
+ queryTracker = mockKnex.getTracker();
60
+ queryTracker.install();
61
+ // Mock Data
62
+ validRes = {
63
+ status: 'success'
64
+ };
65
+ validMessageBox = {
66
+ messageBoxId: 42,
67
+ type: 'payment_inbox'
68
+ };
69
+ validReq = {
70
+ auth: {
71
+ identityKey: 'mockIdKey'
72
+ },
73
+ body: {
74
+ message: {
75
+ messageId: 'mock-message-id',
76
+ recipient: '028d37b941208cd6b8a4c28288eda5f2f16c2b3ab0fcb6d13c18b47fe37b971fc1',
77
+ messageBox: 'payment_inbox',
78
+ body: JSON.stringify({})
79
+ }
80
+ },
81
+ get: jest.fn(),
82
+ header: jest.fn()
83
+ };
84
+ });
85
+ afterEach(() => {
86
+ jest.clearAllMocks();
87
+ if (queryTracker !== null && queryTracker !== undefined) {
88
+ queryTracker.uninstall();
89
+ }
90
+ axiosMock?.restore();
91
+ });
92
+ afterAll(() => {
93
+ mockKnex.unmock(knex);
94
+ });
95
+ it('Throws an error if message is missing', async () => {
96
+ validReq.body = {}; // Ensure body exists, but message is missing
97
+ await sendMessage.func(validReq, mockRes);
98
+ expect(mockRes.status).toHaveBeenCalledWith(400);
99
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
100
+ status: 'error',
101
+ code: 'ERR_MESSAGE_REQUIRED',
102
+ description: 'Please provide a valid message to send!'
103
+ }));
104
+ });
105
+ it('Throws an error if message is not an object', async () => {
106
+ validReq.body.message = 'My message to send';
107
+ await sendMessage.func(validReq, mockRes);
108
+ expect(mockRes.status).toHaveBeenCalledWith(400);
109
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
110
+ status: 'error',
111
+ code: 'ERR_INVALID_MESSAGEBOX',
112
+ description: 'Invalid message box.'
113
+ }));
114
+ });
115
+ it('Throws an error if recipient is missing', async () => {
116
+ if (validReq.body.message !== null && validReq.body.message !== undefined) {
117
+ validReq.body.message.recipient = undefined;
118
+ }
119
+ await sendMessage.func(validReq, mockRes);
120
+ expect(mockRes.status).toHaveBeenCalledWith(400);
121
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
122
+ status: 'error',
123
+ code: 'ERR_RECIPIENT_REQUIRED',
124
+ description: 'Missing recipient(s). Provide "recipient" or "recipients".'
125
+ }));
126
+ });
127
+ it('Throws an error if recipient is not a string', async () => {
128
+ if (validReq.body.message !== null && validReq.body.message !== undefined) {
129
+ validReq.body.message.recipient = 123;
130
+ }
131
+ await sendMessage.func(validReq, mockRes);
132
+ expect(mockRes.status).toHaveBeenCalledWith(400);
133
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
134
+ status: 'error',
135
+ code: 'ERR_INVALID_RECIPIENT_KEY'
136
+ }));
137
+ });
138
+ it('Returns error if messageBox is missing', async () => {
139
+ if (validReq.body.message !== null && validReq.body.message !== undefined) {
140
+ validReq.body.message.messageBox = undefined;
141
+ }
142
+ await sendMessage.func(validReq, mockRes);
143
+ expect(mockRes.status).toHaveBeenCalledWith(400);
144
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
145
+ status: 'error',
146
+ code: 'ERR_INVALID_MESSAGEBOX'
147
+ }));
148
+ });
149
+ it('Throws an error if messageBox is not a string', async () => {
150
+ if (validReq.body.message !== null && validReq.body.message !== undefined) {
151
+ validReq.body.message.messageBox = 123;
152
+ }
153
+ await sendMessage.func(validReq, mockRes);
154
+ expect(mockRes.status).toHaveBeenCalledWith(400);
155
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
156
+ status: 'error',
157
+ code: 'ERR_INVALID_MESSAGEBOX',
158
+ description: 'Invalid message box.'
159
+ }));
160
+ });
161
+ it('Throws an error if the message body is not a string', async () => {
162
+ if (validReq.body.message !== null && validReq.body.message !== undefined) {
163
+ validReq.body.message.body = 42;
164
+ }
165
+ await sendMessage.func(validReq, mockRes);
166
+ expect(mockRes.status).toHaveBeenCalledWith(400);
167
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
168
+ status: 'error',
169
+ code: 'ERR_INVALID_MESSAGE_BODY',
170
+ description: 'Invalid message body.'
171
+ }));
172
+ });
173
+ it('Returns error if message body is missing', async () => {
174
+ if (validReq.body.message !== null && validReq.body.message !== undefined) {
175
+ validReq.body.message.body = undefined;
176
+ }
177
+ await sendMessage.func(validReq, mockRes);
178
+ expect(mockRes.status).toHaveBeenCalledWith(400);
179
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
180
+ status: 'error',
181
+ code: 'ERR_INVALID_MESSAGE_BODY',
182
+ description: 'Invalid message body.'
183
+ }));
184
+ });
185
+ it('Returns base price for an empty message', () => {
186
+ const price = calculateMessagePrice('');
187
+ expect(price).toBe(2); // Base price only
188
+ });
189
+ it('Calculates price for a small message (below 1KB)', () => {
190
+ const price = calculateMessagePrice('Hello, world!');
191
+ expect(price).toBe(5); // Base price only
192
+ });
193
+ it('Calculates price for a 2KB message', () => {
194
+ const message = 'a'.repeat(2048); // 2KB
195
+ const price = calculateMessagePrice(message);
196
+ expect(price).toBe(8); // Base price + 2KB
197
+ });
198
+ it('Adds priority fee when enabled', () => {
199
+ const price = calculateMessagePrice('Hello', true);
200
+ expect(price).toBe(5); // Base price
201
+ });
202
+ it('Handles large messages (5KB)', () => {
203
+ const message = 'a'.repeat(5120); // 5KB
204
+ const price = calculateMessagePrice(message);
205
+ expect(price).toBe(17); // Base price + 5KB
206
+ });
207
+ it('Handles edge case of exactly 1KB message', () => {
208
+ const message = 'a'.repeat(1024); // Exactly 1KB
209
+ const price = calculateMessagePrice(message);
210
+ expect(price).toBe(5); // Base price + 1KB
211
+ });
212
+ it('Handles edge case of 1KB + 1 byte message', () => {
213
+ const message = 'a'.repeat(1025); // 1KB + 1 byte
214
+ const price = calculateMessagePrice(message);
215
+ expect(price).toBe(8); // Rounded up to 2KB
216
+ });
217
+ it('Handles messages larger than 10KB', () => {
218
+ const message = 'a'.repeat(10240); // 10KB
219
+ const price = calculateMessagePrice(message);
220
+ expect(price).toBe(32); // Base price + 10KB
221
+ });
222
+ it('Returns error if messageId is missing', async () => {
223
+ if (validReq.body.message !== undefined && validReq.body.message !== null) {
224
+ validReq.body.message.messageId = undefined;
225
+ }
226
+ await sendMessage.func(validReq, mockRes);
227
+ expect(mockRes.status).toHaveBeenCalledWith(400);
228
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
229
+ status: 'error',
230
+ code: 'ERR_MESSAGEID_REQUIRED',
231
+ description: 'Missing messageId.'
232
+ }));
233
+ });
234
+ it('Creates a messageBox when it does not exist', async () => {
235
+ queryTracker.on('query', (q, step) => {
236
+ if (step === 1) {
237
+ q.response(0); // Simulate that the messageBox does not exist
238
+ }
239
+ else if (step === 2) {
240
+ q.response([validMessageBox]); // Simulate messageBox being inserted
241
+ }
242
+ else if (step === 3) {
243
+ q.response([validMessageBox]); // Simulate finding a valid messageBoxId
244
+ }
245
+ else {
246
+ q.response([]); // Default response
247
+ }
248
+ });
249
+ await sendMessage.func(validReq, mockRes);
250
+ expect(mockRes.status).toHaveBeenCalledWith(200);
251
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
252
+ status: 'success'
253
+ }));
254
+ });
255
+ it('Silently ignores duplicate messages via onConflict().ignore()', async () => {
256
+ queryTracker.on('query', (q, step) => {
257
+ if (step === 1) {
258
+ q.response({ messageBoxId: 42, type: 'payment_inbox' }); // messageBox exists
259
+ }
260
+ else if (step === 2) {
261
+ q.response({ messageBoxId: 42 }); // get messageBoxId for insert
262
+ }
263
+ else if (step === 3) {
264
+ q.response(0); // insert with onConflict().ignore() returns 0 rows affected
265
+ }
266
+ else {
267
+ q.response([]);
268
+ }
269
+ });
270
+ await sendMessage.func(validReq, mockRes);
271
+ expect(mockRes.status).toHaveBeenCalledWith(200);
272
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
273
+ status: 'success'
274
+ }));
275
+ });
276
+ it('Returns internal error if unexpected error occurs', async () => {
277
+ jest.spyOn(console, 'error').mockImplementation(() => { });
278
+ jest.spyOn(console, 'log').mockImplementation(() => { });
279
+ queryTracker.on('query', () => {
280
+ throw new Error('Unexpected failure'); // Simulating an unexpected database failure
281
+ });
282
+ await sendMessage.func(validReq, mockRes);
283
+ // Ensure the response status is set
284
+ expect(mockRes.status).toHaveBeenCalledTimes(1);
285
+ expect(mockRes.status).toHaveBeenCalledWith(500);
286
+ // Ensure the response body is set
287
+ expect(mockRes.json).toHaveBeenCalledTimes(1);
288
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
289
+ status: 'error',
290
+ code: 'ERR_INTERNAL'
291
+ }));
292
+ });
293
+ it('creates a new messageBox when one does not exist for recipient', async () => {
294
+ queryTracker.on('query', (q, step) => {
295
+ if (step === 1)
296
+ q.response(undefined); // messageBox not found
297
+ else if (step === 2)
298
+ q.response(1); // messageBox insert
299
+ else if (step === 3)
300
+ q.response({ messageBoxId: 42 }); // get messageBoxId for message insert
301
+ else if (step === 4)
302
+ q.response(1); // insert message
303
+ else
304
+ q.response([]);
305
+ });
306
+ await sendMessage.func(validReq, mockRes);
307
+ expect(mockRes.status).toHaveBeenCalledWith(200);
308
+ expect(mockRes.json).toHaveBeenCalledWith(expect.objectContaining({
309
+ status: 'success'
310
+ }));
311
+ });
312
+ });
313
+ //# sourceMappingURL=sendMessage.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sendMessage.test.js","sourceRoot":"","sources":["../../../../src/routes/__tests/sendMessage.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * @file acknowledgeMessage.ts
3
+ * @description
4
+ * Express route to allow a client to acknowledge receipt of one or more messages.
5
+ * Acknowledged messages are permanently removed from the database for the
6
+ * authenticated identity key (recipient).
7
+ *
8
+ * This is used in the MessageBox system to clear delivered messages once received
9
+ * and handled on the client side (e.g., after syncing or displaying them).
10
+ */
11
+ import { Logger } from '../utils/logger.js';
12
+ import { runtimeDeps } from '../runtimeDeps.js';
13
+ /**
14
+ * @openapi
15
+ * /acknowledgeMessage:
16
+ * post:
17
+ * summary: Acknowledge receipt of one or more messages
18
+ * description: |
19
+ * Removes acknowledged messages from the database for the authenticated identity key.
20
+ * This is used after a client has received and handled messages.
21
+ * tags:
22
+ * - Message
23
+ * requestBody:
24
+ * required: true
25
+ * content:
26
+ * application/json:
27
+ * schema:
28
+ * type: object
29
+ * properties:
30
+ * messageIds:
31
+ * type: array
32
+ * items:
33
+ * type: string
34
+ * description: Array of message IDs to acknowledge
35
+ * responses:
36
+ * 200:
37
+ * description: Successfully acknowledged messages
38
+ * content:
39
+ * application/json:
40
+ * schema:
41
+ * type: object
42
+ * properties:
43
+ * status:
44
+ * type: string
45
+ * example: success
46
+ * 400:
47
+ * description: Invalid input or message not found
48
+ * 500:
49
+ * description: Internal server error
50
+ */
51
+ /**
52
+ * @exports
53
+ * Route definition for acknowledging MessageBox messages.
54
+ * This object is consumed by the Express route loader to register the endpoint.
55
+ */
56
+ export default {
57
+ type: 'post',
58
+ path: '/acknowledgeMessage',
59
+ get knex() { return runtimeDeps.knex; },
60
+ summary: 'Use this route to acknowledge a message has been received',
61
+ parameters: {
62
+ messageIds: ['3301']
63
+ },
64
+ exampleResponse: {
65
+ status: 'success'
66
+ },
67
+ errors: [],
68
+ /**
69
+ * @function func
70
+ * @description
71
+ * Express route handler that processes a POST request to acknowledge messages.
72
+ * Deletes messages from the database where:
73
+ * - recipient matches the authenticated identity key
74
+ * - messageId matches one or more of the provided IDs
75
+ *
76
+ * Returns:
77
+ * - 200 success if deletion occurs
78
+ * - 400 if no messages were found or input is invalid
79
+ * - 500 on internal error
80
+ *
81
+ * @param {AcknowledgeRequest} req - Express request object containing auth and message IDs
82
+ * @param {Response} res - Express response object
83
+ * @returns {Promise<Response>} JSON response with status and optional error codes
84
+ */
85
+ func: async (req, res) => {
86
+ try {
87
+ const { messageIds } = req.body;
88
+ Logger.log('[SERVER] acknowledgeMessage called for messageIds:', messageIds, 'by', req.auth.identityKey);
89
+ // Validate request: must be a non-empty array of strings
90
+ if ((messageIds == null) || (Array.isArray(messageIds) && messageIds.length === 0)) {
91
+ return res.status(400).json({
92
+ status: 'error',
93
+ code: 'ERR_MESSAGE_ID_REQUIRED',
94
+ description: 'Please provide the ID of the message(s) to acknowledge!'
95
+ });
96
+ }
97
+ if (!Array.isArray(messageIds) || messageIds.some(id => typeof id !== 'string')) {
98
+ return res.status(400).json({
99
+ status: 'error',
100
+ code: 'ERR_INVALID_MESSAGE_ID',
101
+ description: 'Message IDs must be formatted as an array of strings!'
102
+ });
103
+ }
104
+ // Delete acknowledged messages for this recipient from the database
105
+ const deleted = await runtimeDeps.knex('messages')
106
+ .where({ recipient: req.auth.identityKey })
107
+ .whereIn('messageId', Array.isArray(messageIds) ? messageIds : [messageIds])
108
+ .del();
109
+ // No matching messages found
110
+ if (deleted === 0) {
111
+ return res.status(400).json({
112
+ status: 'error',
113
+ code: 'ERR_INVALID_ACKNOWLEDGMENT',
114
+ description: 'Message not found!'
115
+ });
116
+ }
117
+ // Deletion failed unexpectedly
118
+ if (deleted < 0) {
119
+ throw new Error('Deletion failed');
120
+ }
121
+ return res.status(200).json({ status: 'success' });
122
+ }
123
+ catch (e) {
124
+ Logger.error(e);
125
+ return res.status(500).json({
126
+ status: 'error',
127
+ code: 'ERR_INTERNAL_ERROR',
128
+ description: 'An internal error has occurred while acknowledging the message'
129
+ });
130
+ }
131
+ }
132
+ };
133
+ //# sourceMappingURL=acknowledgeMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acknowledgeMessage.js","sourceRoot":"","sources":["../../../src/routes/acknowledgeMessage.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import sendMessage from './sendMessage.js';
2
+ import listMessages from './listMessages.js';
3
+ import acknowledgeMessage from './acknowledgeMessage.js';
4
+ import registerDevice from './registerDevice.js';
5
+ import listDevices from './listDevices.js';
6
+ import { permissionRoutes } from './permissions/index.js';
7
+ // Explicitly type the exported arrays to avoid type inference issues
8
+ export const preAuth = [];
9
+ export const postAuth = [
10
+ sendMessage,
11
+ listMessages,
12
+ acknowledgeMessage,
13
+ registerDevice,
14
+ listDevices,
15
+ ...permissionRoutes
16
+ ];
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,kBAAkB,CAAA;AAC1C,OAAO,YAAY,MAAM,mBAAmB,CAAA;AAC5C,OAAO,kBAAkB,MAAM,yBAAyB,CAAA;AACxD,OAAO,cAAc,MAAM,qBAAqB,CAAA;AAChD,OAAO,WAAW,MAAM,kBAAkB,CAAA;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAEzD,qEAAqE;AACrE,MAAM,CAAC,MAAM,OAAO,GAA0D,EAAE,CAAA;AAChF,MAAM,CAAC,MAAM,QAAQ,GAA0D;IAC7E,WAAW;IACX,YAAY;IACZ,kBAAkB;IAClB,cAAc;IACd,WAAW;IACX,GAAG,gBAAgB;CACpB,CAAA"}
@@ -0,0 +1,63 @@
1
+ import { Logger } from '../utils/logger.js';
2
+ import { runtimeDeps } from '../runtimeDeps.js';
3
+ export default {
4
+ type: 'get',
5
+ path: '/devices',
6
+ func: async (req, res) => {
7
+ try {
8
+ Logger.log('[DEBUG] Processing list devices request');
9
+ // Validate authentication
10
+ const identityKey = req.auth?.identityKey;
11
+ if (identityKey == null) {
12
+ Logger.log('[DEBUG] Authentication required for listing devices');
13
+ return res.status(401).json({
14
+ status: 'error',
15
+ code: 'ERR_AUTHENTICATION_REQUIRED',
16
+ description: 'Authentication required.'
17
+ });
18
+ }
19
+ try {
20
+ // Query devices for the authenticated user
21
+ const devices = await runtimeDeps.knex('device_registrations')
22
+ .select([
23
+ 'id',
24
+ 'device_id as deviceId',
25
+ 'platform',
26
+ 'fcm_token as fcmToken',
27
+ 'active',
28
+ 'created_at as createdAt',
29
+ 'updated_at as updatedAt',
30
+ 'last_used as lastUsed'
31
+ ])
32
+ .where('identity_key', identityKey)
33
+ .orderBy('updated_at', 'desc');
34
+ Logger.log(`[DEBUG] Found ${devices.length} registered devices for ${identityKey}`);
35
+ return res.status(200).json({
36
+ status: 'success',
37
+ devices: devices.map(device => ({
38
+ ...device,
39
+ // Truncate FCM token for security (show only last 10 characters)
40
+ fcmToken: `...${device.fcmToken.slice(-10)}`
41
+ }))
42
+ });
43
+ }
44
+ catch (dbError) {
45
+ Logger.error('[ERROR] Database error during device listing:', dbError);
46
+ return res.status(500).json({
47
+ status: 'error',
48
+ code: 'ERR_DATABASE_ERROR',
49
+ description: 'Failed to retrieve devices.'
50
+ });
51
+ }
52
+ }
53
+ catch (error) {
54
+ Logger.error('[ERROR] Internal Server Error in listDevices:', error);
55
+ return res.status(500).json({
56
+ status: 'error',
57
+ code: 'ERR_INTERNAL',
58
+ description: 'An internal error has occurred.'
59
+ });
60
+ }
61
+ }
62
+ };
63
+ //# sourceMappingURL=listDevices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listDevices.js","sourceRoot":"","sources":["../../../src/routes/listDevices.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAA;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAa/C,eAAe;IACb,IAAI,EAAE,KAAK;IACX,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,KAAK,EAAE,GAAgB,EAAE,GAAa,EAAqB,EAAE;QACjE,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;YAErD,0BAA0B;YAC1B,MAAM,WAAW,GAAG,GAAG,CAAC,IAAI,EAAE,WAAW,CAAA;YACzC,IAAI,WAAW,IAAI,IAAI,EAAE,CAAC;gBACxB,MAAM,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAA;gBACjE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE,6BAA6B;oBACnC,WAAW,EAAE,0BAA0B;iBACxC,CAAC,CAAA;YACJ,CAAC;YAED,IAAI,CAAC;gBACH,2CAA2C;gBAC3C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,sBAAsB,CAAC;qBAC3D,MAAM,CAAC;oBACN,IAAI;oBACJ,uBAAuB;oBACvB,UAAU;oBACV,uBAAuB;oBACvB,QAAQ;oBACR,yBAAyB;oBACzB,yBAAyB;oBACzB,uBAAuB;iBACxB,CAAC;qBACD,KAAK,CAAC,cAAc,EAAE,WAAW,CAAC;qBAClC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,CAAA;gBAEhC,MAAM,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,MAAM,2BAA2B,WAAW,EAAE,CAAC,CAAA;gBAEnF,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;wBAC9B,GAAG,MAAM;wBACT,iEAAiE;wBACjE,QAAQ,EAAE,MAAM,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE;qBAC7C,CAAC,CAAC;iBACJ,CAAC,CAAA;YAEJ,CAAC;YAAC,OAAO,OAAY,EAAE,CAAC;gBACtB,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,OAAO,CAAC,CAAA;gBACtE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBAC1B,MAAM,EAAE,OAAO;oBACf,IAAI,EAAE,oBAAoB;oBAC1B,WAAW,EAAE,6BAA6B;iBAC3C,CAAC,CAAA;YACJ,CAAC;QAEH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAA;YACpE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,OAAO;gBACf,IAAI,EAAE,cAAc;gBACpB,WAAW,EAAE,iCAAiC;aAC/C,CAAC,CAAA;QACJ,CAAC;IACH,CAAC;CACF,CAAA"}