diff --git a/designer/server/src/lib/dead-letter-queue.js b/designer/server/src/lib/dead-letter-queue.js index 6cc2123f8..fef767fa2 100644 --- a/designer/server/src/lib/dead-letter-queue.js +++ b/designer/server/src/lib/dead-letter-queue.js @@ -57,7 +57,14 @@ export async function getDeadLetterQueueMessages(dlq, token) { const { body } = await getJsonByType(requestUrl, getHeaders(token)) - return body + // Dedupe in case of duplicate messages + // Ensure the last occurrence of the same MessageId is used as this will contain the valid ReceiptHandle + // (older ReceiptHandles for the same message will not be valid) + const uniqueMessages = new Map() + for (const message of body.messages) { + uniqueMessages.set(message.MessageId, message) + } + return uniqueMessages.values().toArray() } /** diff --git a/designer/server/src/lib/dead-letter-queue.test.js b/designer/server/src/lib/dead-letter-queue.test.js index 27fa7bac0..30d99eccb 100644 --- a/designer/server/src/lib/dead-letter-queue.test.js +++ b/designer/server/src/lib/dead-letter-queue.test.js @@ -57,7 +57,7 @@ describe('dead-letter queue lib functions', () => { new URL('http://localhost:3002/admin/deadletter/form-submissions/view'), expect.anything() ) - expect(res.messages).toEqual(['message1']) + expect(res).toEqual(['message1']) }) }) diff --git a/designer/server/src/routes/admin/dead-letter-queues.js b/designer/server/src/routes/admin/dead-letter-queues.js index afbb12212..abf39dd07 100644 --- a/designer/server/src/routes/admin/dead-letter-queues.js +++ b/designer/server/src/routes/admin/dead-letter-queues.js @@ -88,7 +88,7 @@ export async function getMessageCounts(token) { const radioItems = [] for (const dlq of Object.values(DeadLetterQueues)) { try { - const { messages } = await getDeadLetterQueueMessages(dlq, token) + const messages = await getDeadLetterQueueMessages(dlq, token) const countSuffix = messages.length === 1 ? 'message' : 'messages' radioItems.push({ value: dlq, @@ -217,7 +217,7 @@ export default [ const navigation = buildAdminNavigation(ADMIN_TOOLS) - const { messages } = await getDeadLetterQueueMessages(dlq, token) + const messages = await getDeadLetterQueueMessages(dlq, token) const mappedMessages = dlqMessageMapper(messages) diff --git a/designer/server/src/routes/admin/dead-letter-queues.test.js b/designer/server/src/routes/admin/dead-letter-queues.test.js index 5c9ef611c..0508bbf4d 100644 --- a/designer/server/src/routes/admin/dead-letter-queues.test.js +++ b/designer/server/src/routes/admin/dead-letter-queues.test.js @@ -35,12 +35,12 @@ describe('Dead-letter queues routes', () => { test('should render form with radio options with counts', async () => { jest .mocked(getDeadLetterQueueMessages) - .mockResolvedValueOnce({ messages: [] }) + .mockResolvedValueOnce([]) // @ts-expect-error - invalid response to throw error .mockResolvedValueOnce(undefined) - .mockResolvedValueOnce({ messages: [{}, {}] }) - .mockResolvedValueOnce({ messages: [{}, {}, {}] }) - .mockResolvedValueOnce({ messages: [{}, {}, {}, {}] }) + .mockResolvedValueOnce([{}, {}]) + .mockResolvedValueOnce([{}, {}, {}]) + .mockResolvedValueOnce([{}, {}, {}, {}]) const options = { method: 'get', url: '/admin/dead-letter-queues', @@ -121,15 +121,13 @@ describe('Dead-letter queues routes', () => { }) test('should redirect to next screen if valid queue selected and display queue messages', async () => { - jest.mocked(getDeadLetterQueueMessages).mockResolvedValue({ - messages: [ - { - MessageId: 'message-id', - Body: '{ "field1": "value1" }', - ReceiptHandle: 'rec-handle' - } - ] - }) + jest.mocked(getDeadLetterQueueMessages).mockResolvedValue([ + { + MessageId: 'message-id', + Body: '{ "field1": "value1" }', + ReceiptHandle: 'rec-handle' + } + ]) const options = { method: 'post', url: '/admin/dead-letter-queues', @@ -146,15 +144,13 @@ describe('Dead-letter queues routes', () => { }) test('should render form with messages and redrive button', async () => { - jest.mocked(getDeadLetterQueueMessages).mockResolvedValue({ - messages: [ - { - MessageId: 'message-id', - Body: '{ "field1": "value1" }', - ReceiptHandle: 'rec-handle' - } - ] - }) + jest.mocked(getDeadLetterQueueMessages).mockResolvedValue([ + { + MessageId: 'message-id', + Body: '{ "field1": "value1" }', + ReceiptHandle: 'rec-handle' + } + ]) const options = { method: 'get',