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:
+12
-14
@@ -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)
|
||||||
|
|||||||
@@ -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(),
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user