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()
|
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 {
|
for _, entry := range requestBody.Entries {
|
||||||
deleteMessageMap[entry.ReceiptHandle] = &deleteEntry{
|
de := &deleteEntry{
|
||||||
Id: entry.Id,
|
Id: entry.Id,
|
||||||
ReceiptHandle: entry.ReceiptHandle,
|
ReceiptHandle: entry.ReceiptHandle,
|
||||||
Deleted: false,
|
Deleted: false,
|
||||||
}
|
}
|
||||||
|
entriesByID[entry.Id] = de
|
||||||
|
entriesByHandle[entry.ReceiptHandle] = append(entriesByHandle[entry.ReceiptHandle], de)
|
||||||
}
|
}
|
||||||
|
|
||||||
deletedEntries := make([]models.DeleteMessageBatchResultEntry, 0)
|
deletedEntries := make([]models.DeleteMessageBatchResultEntry, 0)
|
||||||
@@ -87,7 +93,7 @@ func DeleteMessageBatchV1(req *http.Request) (int, interfaces.AbstractResponseBo
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
message := &queue.Messages[i]
|
message := &queue.Messages[i]
|
||||||
de, found := deleteMessageMap[message.ReceiptHandle]
|
des, found := entriesByHandle[message.ReceiptHandle]
|
||||||
if !found {
|
if !found {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -97,8 +103,10 @@ func DeleteMessageBatchV1(req *http.Request) (int, interfaces.AbstractResponseBo
|
|||||||
queue.ClearInFlight(i, message.ReceiptHandle)
|
queue.ClearInFlight(i, message.ReceiptHandle)
|
||||||
queue.UnlockGroup(groupID)
|
queue.UnlockGroup(groupID)
|
||||||
// Duplicates НЕ чистим — dedup-окно 5 минут живёт независимо от удаления (AWS).
|
// Duplicates НЕ чистим — dedup-окно 5 минут живёт независимо от удаления (AWS).
|
||||||
de.Deleted = true
|
for _, de := range des {
|
||||||
deletedEntries = append(deletedEntries, models.DeleteMessageBatchResultEntry{Id: de.Id})
|
de.Deleted = true
|
||||||
|
deletedEntries = append(deletedEntries, models.DeleteMessageBatchResultEntry{Id: de.Id})
|
||||||
|
}
|
||||||
deletedUuids = append(deletedUuids, uuid)
|
deletedUuids = append(deletedUuids, uuid)
|
||||||
queue.RemoveIndex(i)
|
queue.RemoveIndex(i)
|
||||||
}
|
}
|
||||||
@@ -108,7 +116,7 @@ func DeleteMessageBatchV1(req *http.Request) (int, interfaces.AbstractResponseBo
|
|||||||
persistence.SaveQueue(key, queue)
|
persistence.SaveQueue(key, queue)
|
||||||
|
|
||||||
notFoundEntries := make([]models.BatchResultErrorEntry, 0)
|
notFoundEntries := make([]models.BatchResultErrorEntry, 0)
|
||||||
for _, de := range deleteMessageMap {
|
for _, de := range entriesByID {
|
||||||
if !de.Deleted {
|
if !de.Deleted {
|
||||||
notFoundEntries = append(notFoundEntries, models.BatchResultErrorEntry{
|
notFoundEntries = append(notFoundEntries, models.BatchResultErrorEntry{
|
||||||
Code: "1",
|
Code: "1",
|
||||||
|
|||||||
@@ -117,6 +117,9 @@ func SendMessageV1(req *http.Request) (int, interfaces.AbstractResponseBody) {
|
|||||||
return utils.CreateErrorResponseV1("OverLimit", true)
|
return utils.CreateErrorResponseV1("OverLimit", true)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if requestBody.DelaySeconds < 0 || requestBody.DelaySeconds > 900 {
|
||||||
|
return utils.CreateErrorResponseV1("InvalidParameterValue", true)
|
||||||
|
}
|
||||||
if requestBody.DelaySeconds != 0 {
|
if requestBody.DelaySeconds != 0 {
|
||||||
delaySecs = requestBody.DelaySeconds
|
delaySecs = requestBody.DelaySeconds
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user