@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.
- package/out/knexfile.js +25 -0
- package/out/knexfile.js.map +1 -0
- package/out/src/__tests/compose.test.js +25 -0
- package/out/src/__tests/compose.test.js.map +1 -0
- package/out/src/app.js +162 -0
- package/out/src/app.js.map +1 -0
- package/out/src/compose.js +239 -0
- package/out/src/compose.js.map +1 -0
- package/out/src/config/firebase.js +150 -0
- package/out/src/config/firebase.js.map +1 -0
- package/out/src/context.js +23 -0
- package/out/src/context.js.map +1 -0
- package/out/src/index.js +311 -0
- package/out/src/index.js.map +1 -0
- package/out/src/migrations/2022-12-28-001-initial-migration.js +28 -0
- package/out/src/migrations/2022-12-28-001-initial-migration.js.map +1 -0
- package/out/src/migrations/2023-01-17-messages-update.js +11 -0
- package/out/src/migrations/2023-01-17-messages-update.js.map +1 -0
- package/out/src/migrations/2024-03-05-001-messageID-upgrade.js +21 -0
- package/out/src/migrations/2024-03-05-001-messageID-upgrade.js.map +1 -0
- package/out/src/migrations/2025-01-31-001-notification-permissions.js +59 -0
- package/out/src/migrations/2025-01-31-001-notification-permissions.js.map +1 -0
- package/out/src/migrations/2025-01-31-002-device-registrations.js +24 -0
- package/out/src/migrations/2025-01-31-002-device-registrations.js.map +1 -0
- package/out/src/routes/__tests/acknowledgeMessage.test.js +135 -0
- package/out/src/routes/__tests/acknowledgeMessage.test.js.map +1 -0
- package/out/src/routes/__tests/listMessages.test.js +217 -0
- package/out/src/routes/__tests/listMessages.test.js.map +1 -0
- package/out/src/routes/__tests/sendMessage.test.js +313 -0
- package/out/src/routes/__tests/sendMessage.test.js.map +1 -0
- package/out/src/routes/acknowledgeMessage.js +133 -0
- package/out/src/routes/acknowledgeMessage.js.map +1 -0
- package/out/src/routes/index.js +17 -0
- package/out/src/routes/index.js.map +1 -0
- package/out/src/routes/listDevices.js +63 -0
- package/out/src/routes/listDevices.js.map +1 -0
- package/out/src/routes/listMessages.js +176 -0
- package/out/src/routes/listMessages.js.map +1 -0
- package/out/src/routes/permissions/getPermission.js +138 -0
- package/out/src/routes/permissions/getPermission.js.map +1 -0
- package/out/src/routes/permissions/getQuote.js +165 -0
- package/out/src/routes/permissions/getQuote.js.map +1 -0
- package/out/src/routes/permissions/index.js +12 -0
- package/out/src/routes/permissions/index.js.map +1 -0
- package/out/src/routes/permissions/listPermissions.js +179 -0
- package/out/src/routes/permissions/listPermissions.js.map +1 -0
- package/out/src/routes/permissions/setPermission.js +137 -0
- package/out/src/routes/permissions/setPermission.js.map +1 -0
- package/out/src/routes/registerDevice.js +139 -0
- package/out/src/routes/registerDevice.js.map +1 -0
- package/out/src/routes/sendMessage.js +438 -0
- package/out/src/routes/sendMessage.js.map +1 -0
- package/out/src/runtimeDeps.js +15 -0
- package/out/src/runtimeDeps.js.map +1 -0
- package/out/src/swagger.js +48 -0
- package/out/src/swagger.js.map +1 -0
- package/out/src/telemetry.js +134 -0
- package/out/src/telemetry.js.map +1 -0
- package/out/src/types/messagePermissions.js +2 -0
- package/out/src/types/messagePermissions.js.map +1 -0
- package/out/src/types/notifications.js +2 -0
- package/out/src/types/notifications.js.map +1 -0
- package/out/src/utils/logger.js +90 -0
- package/out/src/utils/logger.js.map +1 -0
- package/out/src/utils/messagePermissions.js +115 -0
- package/out/src/utils/messagePermissions.js.map +1 -0
- package/out/src/utils/sendFCMNotification.js +110 -0
- package/out/src/utils/sendFCMNotification.js.map +1 -0
- package/out/tsconfig.tsbuildinfo +1 -0
- package/out/types/jest.config.d.ts +4 -0
- package/out/types/jest.config.d.ts.map +1 -0
- package/out/types/jest.config.integration.d.ts +5 -0
- package/out/types/jest.config.integration.d.ts.map +1 -0
- package/out/types/knexfile.d.ts +6 -0
- package/out/types/knexfile.d.ts.map +1 -0
- package/out/types/src/__tests/compose.test.d.ts +2 -0
- package/out/types/src/__tests/compose.test.d.ts.map +1 -0
- package/out/types/src/app.d.ts +63 -0
- package/out/types/src/app.d.ts.map +1 -0
- package/out/types/src/compose.d.ts +22 -0
- package/out/types/src/compose.d.ts.map +1 -0
- package/out/types/src/config/firebase.d.ts +34 -0
- package/out/types/src/config/firebase.d.ts.map +1 -0
- package/out/types/src/context.d.ts +23 -0
- package/out/types/src/context.d.ts.map +1 -0
- package/out/types/src/index.d.ts +43 -0
- package/out/types/src/index.d.ts.map +1 -0
- package/out/types/src/migrations/2022-12-28-001-initial-migration.d.ts +4 -0
- package/out/types/src/migrations/2022-12-28-001-initial-migration.d.ts.map +1 -0
- package/out/types/src/migrations/2023-01-17-messages-update.d.ts +4 -0
- package/out/types/src/migrations/2023-01-17-messages-update.d.ts.map +1 -0
- package/out/types/src/migrations/2024-03-05-001-messageID-upgrade.d.ts +4 -0
- package/out/types/src/migrations/2024-03-05-001-messageID-upgrade.d.ts.map +1 -0
- package/out/types/src/migrations/2025-01-31-001-notification-permissions.d.ts +4 -0
- package/out/types/src/migrations/2025-01-31-001-notification-permissions.d.ts.map +1 -0
- package/out/types/src/migrations/2025-01-31-002-device-registrations.d.ts +4 -0
- package/out/types/src/migrations/2025-01-31-002-device-registrations.d.ts.map +1 -0
- package/out/types/src/routes/__tests/acknowledgeMessage.test.d.ts +2 -0
- package/out/types/src/routes/__tests/acknowledgeMessage.test.d.ts.map +1 -0
- package/out/types/src/routes/__tests/listMessages.test.d.ts +2 -0
- package/out/types/src/routes/__tests/listMessages.test.d.ts.map +1 -0
- package/out/types/src/routes/__tests/sendMessage.test.d.ts +2 -0
- package/out/types/src/routes/__tests/sendMessage.test.d.ts.map +1 -0
- package/out/types/src/routes/acknowledgeMessage.d.ts +100 -0
- package/out/types/src/routes/acknowledgeMessage.d.ts.map +1 -0
- package/out/types/src/routes/index.d.ts +11 -0
- package/out/types/src/routes/index.d.ts.map +1 -0
- package/out/types/src/routes/listDevices.d.ts +19 -0
- package/out/types/src/routes/listDevices.d.ts.map +1 -0
- package/out/types/src/routes/listMessages.d.ts +124 -0
- package/out/types/src/routes/listMessages.d.ts.map +1 -0
- package/out/types/src/routes/permissions/getPermission.d.ts +46 -0
- package/out/types/src/routes/permissions/getPermission.d.ts.map +1 -0
- package/out/types/src/routes/permissions/getQuote.d.ts +50 -0
- package/out/types/src/routes/permissions/getQuote.d.ts.map +1 -0
- package/out/types/src/routes/permissions/index.d.ts +18 -0
- package/out/types/src/routes/permissions/index.d.ts.map +1 -0
- package/out/types/src/routes/permissions/listPermissions.d.ts +106 -0
- package/out/types/src/routes/permissions/listPermissions.d.ts.map +1 -0
- package/out/types/src/routes/permissions/setPermission.d.ts +53 -0
- package/out/types/src/routes/permissions/setPermission.d.ts.map +1 -0
- package/out/types/src/routes/registerDevice.d.ts +67 -0
- package/out/types/src/routes/registerDevice.d.ts.map +1 -0
- package/out/types/src/routes/sendMessage.d.ts +140 -0
- package/out/types/src/routes/sendMessage.d.ts.map +1 -0
- package/out/types/src/runtimeDeps.d.ts +17 -0
- package/out/types/src/runtimeDeps.d.ts.map +1 -0
- package/out/types/src/swagger.d.ts +3 -0
- package/out/types/src/swagger.d.ts.map +1 -0
- package/out/types/src/telemetry.d.ts +2 -0
- package/out/types/src/telemetry.d.ts.map +1 -0
- package/out/types/src/types/messagePermissions.d.ts +15 -0
- package/out/types/src/types/messagePermissions.d.ts.map +1 -0
- package/out/types/src/types/notifications.d.ts +20 -0
- package/out/types/src/types/notifications.d.ts.map +1 -0
- package/out/types/src/utils/logger.d.ts +17 -0
- package/out/types/src/utils/logger.d.ts.map +1 -0
- package/out/types/src/utils/messagePermissions.d.ts +29 -0
- package/out/types/src/utils/messagePermissions.d.ts.map +1 -0
- package/out/types/src/utils/sendFCMNotification.d.ts +22 -0
- package/out/types/src/utils/sendFCMNotification.d.ts.map +1 -0
- package/package.json +1 -1
- 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"}
|