redrive.go 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package web
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "github.com/gin-contrib/sessions"
  7. "github.com/gin-gonic/gin"
  8. "code.osinet.fr/fgm/sqs_demo/back/services/redriver"
  9. )
  10. func makeRedriveHandler(rd redriver.Redriver, ms redriver.MessageStore) gin.HandlerFunc {
  11. return func(c *gin.Context) {
  12. ctx := c.Request.Context()
  13. qName := c.Param("name")
  14. redirect := "/queue/" + qName
  15. sess := sessions.Default(c)
  16. // Do not consume sess.Flashes(): this is a redirect-only handler, and they would be lost.
  17. defer func() {
  18. _ = sess.Save()
  19. c.Redirect(http.StatusSeeOther, redirect)
  20. }()
  21. req := c.Request
  22. if err := req.ParseForm(); err != nil {
  23. log.Printf("Failed to parse deletion confirm form for queue %s: %v",
  24. qName, err)
  25. sess.AddFlash(fmt.Sprintf("Failed to parsed deletion confirmm form for queue %s",
  26. qName))
  27. return
  28. }
  29. ids := parseIDs(req.Form, validateUint)
  30. var messages []redriver.Message
  31. if len(ids) == 0 {
  32. flash := fmt.Sprintf("Got no message to delete from queue %q", qName)
  33. log.Print(flash)
  34. sess.AddFlash(flash)
  35. return
  36. }
  37. messages = parseMessages(req.Form, ids)
  38. for i, message := range messages {
  39. m, ok := ms.Get(message.ReceiptHandle)
  40. if !ok {
  41. sess.AddFlash(fmt.Sprintf("Failed retrieving message with ID %s and receipt handle %s from queue %q. Aborting redrive.",
  42. message.MessageId, message.ReceiptHandle, qName))
  43. return
  44. }
  45. messages[i] = m
  46. }
  47. var flash string
  48. err := rd.RedriveItems(ctx, qName, messages)
  49. if err != nil {
  50. flash = fmt.Sprintf("failed redriving selected messages on queue %q: %v",
  51. qName, err)
  52. } else {
  53. flash = fmt.Sprintf("%d messages redriven to queue %q."+
  54. `They now carry new MessageIDs and their past MessageID will be visible in the "previous-message-id" attribute`,
  55. len(messages), qName)
  56. }
  57. log.Print(flash)
  58. sess.AddFlash(flash)
  59. }
  60. }