go__sqs_demo/back/web/delete.go

65 lines
1.6 KiB
Go

package web
import (
"fmt"
"log"
"net/http"
"time"
"github.com/gin-contrib/sessions"
"github.com/gin-gonic/gin"
"code.osinet.fr/fgm/sqs_demo/back/services/redriver"
)
func makeDeleteHandler(rd redriver.Redriver) gin.HandlerFunc {
return func(c *gin.Context) {
ctx := c.Request.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)
}()
req := c.Request
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
}
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
}
messages = parseMessages(req.Form, ids)
keys := make([]redriver.ItemsKeys, len(messages))
for i, msg := range messages {
keys[i] = msg.Keys()
}
t0 := time.Now()
err := rd.DeleteItems(ctx, qName, keys)
latency := time.Since(t0)
if err != nil {
log.Printf("failed deleting %d items from queue %q: %v",
len(keys), qName, err)
sess.AddFlash(fmt.Sprintf("Failed deleting %d items from queue %q",
len(keys), qName))
return
}
sess.AddFlash(fmt.Sprintf("Deleted %d items from queue %s in %v", len(keys),
qName, latency))
}
}