Skip to content

Commit 048ed84

Browse files
committed
Added 'delete DLQ message'
1 parent b7fd438 commit 048ed84

4 files changed

Lines changed: 81 additions & 3 deletions

File tree

src/messaging/event.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ export function receiveDlqMessages() {
4040
const command = new ReceiveMessageCommand({
4141
QueueUrl: deadLetterQueueUrl,
4242
MaxNumberOfMessages: 10,
43-
VisibilityTimeout: 5
43+
VisibilityTimeout: 1,
44+
WaitTimeSeconds: 0
4445
})
4546
return sqsClient.send(command)
4647
}
@@ -56,6 +57,20 @@ export function redriveDlqMessages() {
5657
return sqsClient.send(command)
5758
}
5859

60+
/**
61+
* Delete DLQ message
62+
* @param {string} receiptHandle
63+
* @returns {Promise<DeleteMessageCommandOutput>}
64+
*/
65+
export function deleteDlqMessage(receiptHandle) {
66+
const command = new DeleteMessageCommand({
67+
QueueUrl: deadLetterQueueUrl,
68+
ReceiptHandle: receiptHandle
69+
})
70+
71+
return sqsClient.send(command)
72+
}
73+
5974
/**
6075
* Delete event message
6176
* @param {Message} message

src/messaging/event.test.js

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { mockClient } from 'aws-sdk-client-mock'
88

99
import 'aws-sdk-client-mock-jest'
1010
import {
11+
deleteDlqMessage,
1112
deleteEventMessage,
1213
receiveDlqMessages,
1314
receiveEventMessages,
@@ -67,7 +68,8 @@ describe('event', () => {
6768
await receiveDlqMessages()
6869
expect(snsMock).toHaveReceivedCommandWith(ReceiveMessageCommand, {
6970
QueueUrl: expect.any(String),
70-
VisibilityTimeout: 5
71+
VisibilityTimeout: 1,
72+
WaitTimeSeconds: 0
7173
})
7274
})
7375
})
@@ -89,6 +91,24 @@ describe('event', () => {
8991
})
9092
})
9193
})
94+
95+
describe('deleteDlqMessage', () => {
96+
it('should delete event message', async () => {
97+
/**
98+
* @type {DeleteMessageCommandOutput}
99+
*/
100+
const deleteResult = {
101+
$metadata: {}
102+
}
103+
104+
snsMock.on(DeleteMessageCommand).resolves(deleteResult)
105+
await deleteDlqMessage(messageStub.ReceiptHandle)
106+
expect(snsMock).toHaveReceivedCommandWith(DeleteMessageCommand, {
107+
QueueUrl: expect.any(String),
108+
ReceiptHandle: receiptHandle
109+
})
110+
})
111+
})
92112
})
93113

94114
/**

src/routes/admin.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
import { Scopes } from '@defra/forms-model'
2+
import Joi from 'joi'
23

34
import {
5+
deleteDlqMessage,
46
receiveDlqMessages,
57
redriveDlqMessages
68
} from '~/src/messaging/event.js'
79

810
const OK_RESPONSE = 200
911

12+
const receiptHandleSchema = Joi.object({
13+
receiptHandle: Joi.string().required()
14+
})
15+
1016
/**
1117
* @type {ServerRoute[]}
1218
*/
@@ -16,7 +22,7 @@ export default [
1622
path: '/admin/deadletter/view',
1723
async handler(_request, h) {
1824
const messages = await receiveDlqMessages()
19-
return h.response({ messages: messages.Messages }).code(OK_RESPONSE)
25+
return h.response({ messages: messages.Messages ?? [] }).code(OK_RESPONSE)
2026
},
2127
options: {
2228
auth: {
@@ -40,6 +46,27 @@ export default [
4046
scope: [`+${Scopes.DeadLetterQueues}`]
4147
}
4248
}
49+
},
50+
51+
/**
52+
* @type {ServerRoute}
53+
*/
54+
{
55+
method: 'DELETE',
56+
path: '/admin/deadletter/{receiptHandle}',
57+
async handler(request, h) {
58+
const { params } = request
59+
await deleteDlqMessage(params.receiptHandle)
60+
return h.response({ message: 'success' }).code(OK_RESPONSE)
61+
},
62+
options: {
63+
auth: {
64+
scope: [`+${Scopes.DeadLetterQueues}`]
65+
},
66+
validate: {
67+
params: receiptHandleSchema
68+
}
69+
}
4370
}
4471
]
4572

src/routes/admin.test.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { createServer } from '~/src/api/server.js'
22
import {
3+
deleteDlqMessage,
34
receiveDlqMessages,
45
redriveDlqMessages
56
} from '~/src/messaging/event.js'
@@ -55,6 +56,21 @@ describe('Admin routes', () => {
5556
expect(redriveDlqMessages).toHaveBeenCalled()
5657
})
5758
})
59+
60+
describe('DELETE', () => {
61+
test('/admin/dead-letter/receiptHandle route returns 200', async () => {
62+
const response = await server.inject({
63+
method: 'DELETE',
64+
url: '/admin/deadletter/receipt-handle',
65+
auth
66+
})
67+
68+
expect(response.statusCode).toEqual(okStatusCode)
69+
expect(response.headers['content-type']).toContain(jsonContentType)
70+
expect(response.result).toEqual({ message: 'success' })
71+
expect(deleteDlqMessage).toHaveBeenCalled()
72+
})
73+
})
5874
})
5975

6076
/**

0 commit comments

Comments
 (0)