SQS: delete batch ключ по Id, валидация DelaySeconds 0-900

This commit is contained in:
Repinoid
2026-10-11 08:54:21 +03:00
parent 120a44cb6a
commit 5284a56f7a
2 changed files with 17 additions and 6 deletions
+14 -6
View File
@@ -68,13 +68,19 @@ func DeleteMessageBatchV1(req *http.Request) (int, interfaces.AbstractResponseBo
}
defer queue.UnlockMu()
deleteMessageMap := make(map[string]*deleteEntry)
// Ключ — Id, а НЕ ReceiptHandle: два entry с одинаковым ReceiptHandle и разными
// Id не должны перезаписывать друг друга (первый исчезал бы и не попадал ни в
// Successful, ни в Failed — ревью 2026-10-11). entriesByHandle — обратный индекс.
entriesByID := make(map[string]*deleteEntry)
entriesByHandle := make(map[string][]*deleteEntry)
for _, entry := range requestBody.Entries {
deleteMessageMap[entry.ReceiptHandle] = &deleteEntry{
de := &deleteEntry{
Id: entry.Id,
ReceiptHandle: entry.ReceiptHandle,
Deleted: false,
}
entriesByID[entry.Id] = de
entriesByHandle[entry.ReceiptHandle] = append(entriesByHandle[entry.ReceiptHandle], de)
}
deletedEntries := make([]models.DeleteMessageBatchResultEntry, 0)
@@ -87,7 +93,7 @@ func DeleteMessageBatchV1(req *http.Request) (int, interfaces.AbstractResponseBo
continue
}
message := &queue.Messages[i]
de, found := deleteMessageMap[message.ReceiptHandle]
des, found := entriesByHandle[message.ReceiptHandle]
if !found {
continue
}
@@ -97,8 +103,10 @@ func DeleteMessageBatchV1(req *http.Request) (int, interfaces.AbstractResponseBo
queue.ClearInFlight(i, message.ReceiptHandle)
queue.UnlockGroup(groupID)
// Duplicates НЕ чистим — dedup-окно 5 минут живёт независимо от удаления (AWS).
de.Deleted = true
deletedEntries = append(deletedEntries, models.DeleteMessageBatchResultEntry{Id: de.Id})
for _, de := range des {
de.Deleted = true
deletedEntries = append(deletedEntries, models.DeleteMessageBatchResultEntry{Id: de.Id})
}
deletedUuids = append(deletedUuids, uuid)
queue.RemoveIndex(i)
}
@@ -108,7 +116,7 @@ func DeleteMessageBatchV1(req *http.Request) (int, interfaces.AbstractResponseBo
persistence.SaveQueue(key, queue)
notFoundEntries := make([]models.BatchResultErrorEntry, 0)
for _, de := range deleteMessageMap {
for _, de := range entriesByID {
if !de.Deleted {
notFoundEntries = append(notFoundEntries, models.BatchResultErrorEntry{
Code: "1",
+3
View File
@@ -117,6 +117,9 @@ func SendMessageV1(req *http.Request) (int, interfaces.AbstractResponseBody) {
return utils.CreateErrorResponseV1("OverLimit", true)
}
if requestBody.DelaySeconds < 0 || requestBody.DelaySeconds > 900 {
return utils.CreateErrorResponseV1("InvalidParameterValue", true)
}
if requestBody.DelaySeconds != 0 {
delaySecs = requestBody.DelaySeconds
}