P2.4: единый путь создания очереди/сообщения (admin переиспользует gosqs)

Добавлены gosqs.BuildQueueForTenant (URL/ARN/дефолты/FIFO-детект как в CreateQueueV1)
и gosqs.BuildSqsMessage (UUID+MD5). admin.createTenantQueue и sendMessageToQueue
переведены на них: раньше UI создавал очередь без URL/ARN/IsFIFO и сообщение без MD5,
теперь поведение UI == SQS API + проверка размера при отправке.
This commit is contained in:
Repinoid
2026-10-06 18:59:36 +03:00
parent fd8ffc329d
commit 8988293628
2 changed files with 55 additions and 14 deletions
+12 -14
View File
@@ -14,11 +14,11 @@ import (
"time" "time"
"shared-sqs/app/auth" "shared-sqs/app/auth"
"shared-sqs/app/gosqs"
"shared-sqs/app/models" "shared-sqs/app/models"
"shared-sqs/app/persistence" "shared-sqs/app/persistence"
"shared-sqs/app/tenant" "shared-sqs/app/tenant"
"github.com/google/uuid"
"github.com/gorilla/mux" "github.com/gorilla/mux"
log "github.com/sirupsen/logrus" log "github.com/sirupsen/logrus"
) )
@@ -519,14 +519,9 @@ func (h *Handler) createTenantQueue(w http.ResponseWriter, r *http.Request) {
jsonErr(w, http.StatusForbidden, "queue limit exceeded") jsonErr(w, http.StatusForbidden, "queue limit exceeded")
return return
} }
newQueue := &models.Queue{ // Очередь создаётся через общий билдер — те же URL/ARN/дефолты и FIFO-детект,
Name: req.Name, // что и в SQS CreateQueue (единый путь, без расхождения поведения UI и API).
VisibilityTimeout: 30, newQueue := gosqs.BuildQueueForTenant(t, req.Name)
MaximumMessageSize: 262144,
MessageRetentionPeriod: 345600,
Messages: []models.SqsMessage{},
Duplicates: make(map[string]time.Time),
}
models.SyncQueues.AddQueue(key, newQueue) models.SyncQueues.AddQueue(key, newQueue)
persistence.SaveQueue(key, newQueue) persistence.SaveQueue(key, newQueue)
models.SyncQueues.Unlock() models.SyncQueues.Unlock()
@@ -648,12 +643,15 @@ func (h *Handler) sendMessageToQueue(w http.ResponseWriter, r *http.Request) {
jsonErr(w, http.StatusBadRequest, "body is required") jsonErr(w, http.StatusBadRequest, "body is required")
return return
} }
msg := models.SqsMessage{ // Сообщение строится через общий билдер (UUID + MD5), + проверка размера —
MessageBody: req.Body, // как в SQS SendMessage.
Uuid: uuid.NewString(),
SentTime: time.Now(),
}
q.LockMu() q.LockMu()
if q.MaximumMessageSize > 0 && len(req.Body) > q.MaximumMessageSize {
q.UnlockMu()
jsonErr(w, http.StatusBadRequest, "message too big")
return
}
msg := gosqs.BuildSqsMessage(req.Body)
q.Messages = append(q.Messages, msg) q.Messages = append(q.Messages, msg)
// Персистим одно сообщение отдельно // Персистим одно сообщение отдельно
persistence.SaveMessage(key, &msg) persistence.SaveMessage(key, &msg)
+43
View File
@@ -0,0 +1,43 @@
// app/gosqs/build.go
// Общие билдеры очереди и сообщения — чтобы admin/UI-путь создавал объекты
// ровно так же, как SQS API (единый путь, без расхождения дефолтов).
package gosqs
import (
"time"
"github.com/google/uuid"
"shared-sqs/app/models"
"shared-sqs/app/tenant"
"shared-sqs/app/utils"
)
// BuildQueueForTenant — создаёт очередь тенанта с теми же URL/ARN/дефолтами и
// FIFO-детектом, что и CreateQueueV1. Используется admin-хендлерами, чтобы
// поведение UI совпадало с SQS API (URL/ARN заполнены, .fifo → IsFIFO).
func BuildQueueForTenant(t *tenant.Tenant, queueName string) *models.Queue {
return &models.Queue{
Name: queueName,
URL: tenantQueueURL(t, queueName),
Arn: tenantQueueARN(t, queueName),
VisibilityTimeout: 30,
MaximumMessageSize: MaxMessageSizeDefault,
MessageRetentionPeriod: 345600, // 4 дня
IsFIFO: utils.HasFIFOQueueName(queueName),
EnableDuplicates: models.CurrentEnvironment.EnableDuplicates,
Messages: []models.SqsMessage{},
Duplicates: make(map[string]time.Time),
}
}
// BuildSqsMessage — создаёт сообщение с UUID, MD5 тела и временем отправки —
// так же, как это делает SendMessageV1 (для admin/UI-пути).
func BuildSqsMessage(body string) models.SqsMessage {
return models.SqsMessage{
MessageBody: body,
Uuid: uuid.NewString(),
MD5OfMessageBody: utils.GetMD5Hash(body),
SentTime: time.Now(),
}
}