SQS: delete batch ключ по Id, валидация DelaySeconds 0-900
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user