go__sqs_demo/back/web/redrive.go

78 lines
2.1 KiB
Go

package web
import (
"fmt"
"log"
"net/http"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"code.osinet.fr/fgm/sqs_demo/back/services/redriver"
)
func makeRedriveHandler(rd redriver.Redriver, ms redriver.MessageStore) gin.HandlerFunc {
return func(c *gin.Context) {
req := c.Request
ctx := req.Context()
qName := c.Param("name")
redirect := "/queue/" + qName
sess := sessions.Default(c)
// Do not consume sess.Flashes(): this is a redirect-only handler, and they would be lost.
defer func() {
_ = sess.Save()
c.Redirect(http.StatusSeeOther, redirect)
}()
var (
messages []redriver.Message
done bool
)
if messages, done = messagesFromRequest(req, qName, sess, ms); done {
return
}
var flash string
if err := rd.RedriveItems(ctx, qName, messages); err != nil {
flash = fmt.Sprintf("failed redriving selected messages on queue %q: %v",
qName, err)
} else {
flash = fmt.Sprintf("%d messages redriven to queue %q."+
`They now carry new MessageIDs and their past MessageID will be visible in the "previous-message-id" attribute`,
len(messages), qName)
}
log.Print(flash)
sess.AddFlash(flash)
}
}
func messagesFromRequest(req *http.Request, qName string, sess sessions.Session, ms redriver.MessageStore) ([]redriver.Message, bool) {
if err := req.ParseForm(); err != nil {
log.Printf("Failed to parse deletion confirm form for queue %s: %v",
qName, err)
sess.AddFlash(fmt.Sprintf("Failed to parsed deletion confirmm form for queue %s",
qName))
return nil, true
}
ids := parseIDs(req.Form, validateUint)
var messages []redriver.Message
if len(ids) == 0 {
flash := fmt.Sprintf("Got no message to delete from queue %q", qName)
log.Print(flash)
sess.AddFlash(flash)
return nil, true
}
messages = parseMessages(req.Form, ids)
for i, message := range messages {
m, ok := ms.Get(message.ReceiptHandle)
if !ok {
sess.AddFlash(fmt.Sprintf("Failed retrieving message with ID %s and receipt handle %s from queue %q. Aborting redrive.",
message.MessageId, message.ReceiptHandle, qName))
return nil, true
}
messages[i] = m
}
return messages, false
}