Browse Source

Working purge handler.

Frederic G. MARAND 2 years ago
parent
commit
ced5c7c582

+ 15 - 0
.run/Producer.run.xml

@@ -0,0 +1,15 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="Producer" type="GoApplicationRunConfiguration" factoryName="Go Application">
+    <module name="sqs_demo" />
+    <working_directory value="$PROJECT_DIR$" />
+    <parameters value="-profile=sqs-tutorial" />
+    <envs>
+      <env name="AWS_PROFILE" value="sqs-tutorial" />
+    </envs>
+    <kind value="PACKAGE" />
+    <package value="code.osinet.fr/fgm/sqs_demo/back/cmd/producer/" />
+    <directory value="$PROJECT_DIR$" />
+    <filePath value="$PROJECT_DIR$/demo.go" />
+    <method v="2" />
+  </configuration>
+</component>

+ 13 - 2
back/services/redriver/redriver.go

@@ -355,8 +355,19 @@ func (r *redriver) DeleteItems(ctx context.Context, qName string, keys []ItemsKe
 }
 
 func (r *redriver) Purge(ctx context.Context, qName string) error {
-	// TODO implement me
-	panic("implement me")
+	qui := &sqs.GetQueueUrlInput{QueueName: &qName}
+	qu, err := r.GetQueueUrl(ctx, qui)
+	if err != nil {
+		return fmt.Errorf("failed getting URL for queue %q: %w", qName, err)
+	}
+
+	pqi := sqs.PurgeQueueInput{QueueUrl: qu.QueueUrl}
+	_, err = r.PurgeQueue(ctx, &pqi)
+	if err != nil {
+		return fmt.Errorf("failed purging queue %q: %w",
+			qName, err)
+	}
+	return nil
 }
 
 func (r *redriver) RedriveItems(ctx context.Context, qName string, itemIDs []ItemsKeys) error {

+ 2 - 2
back/web/confirm.go

@@ -71,7 +71,7 @@ func getOp(u *url.URL) QueueOp {
 	var res QueueOp
 	for key := range q {
 		switch op := QueueOp(strings.ToLower(key)); op {
-		case OpDelete, OpRedrive:
+		case OpDelete, OpPurge, OpRedrive:
 			res = op
 			found++
 		default:
@@ -169,7 +169,7 @@ func makeConfirmHandler() gin.HandlerFunc {
 		op := getOp(u)
 		ids := parseIDs(u.Query(), validateUint)
 		var messages []redriver.Message
-		if len(ids) == 0 {
+		if len(ids) == 0 && op != OpPurge {
 			op = OpInvalid
 			messages = nil
 		} else {

+ 3 - 2
back/web/delete.go

@@ -12,7 +12,7 @@ import (
 	"code.osinet.fr/fgm/sqs_demo/back/services/redriver"
 )
 
-func makeDeleteConfirmHandler(rd redriver.Redriver) gin.HandlerFunc {
+func makeDeleteHandler(rd redriver.Redriver) gin.HandlerFunc {
 	return func(c *gin.Context) {
 		ctx := c.Request.Context()
 		qName := c.Param("name")
@@ -62,6 +62,7 @@ func makeDeleteConfirmHandler(rd redriver.Redriver) gin.HandlerFunc {
 			return
 		}
 
-		sess.AddFlash(fmt.Sprintf("Deleted %d items in %v", len(keys), latency))
+		sess.AddFlash(fmt.Sprintf("Deleted %d items from queue %s in %v", len(keys),
+			qName, latency))
 	}
 }

+ 32 - 4
back/web/purge.go

@@ -1,15 +1,43 @@
 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 makePurgeHandler(rd redriver.Redriver) gin.HandlerFunc {
-	return nil
-}
+	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)
+		}()
+
+		t0 := time.Now()
+		err := rd.Purge(ctx, qName)
+		latency := time.Since(t0)
+		if err != nil {
+			log.Printf("failed purging queue %q: %v", qName, err)
+			sess.AddFlash(fmt.Sprintf("Failed purging queue %q", qName))
+			return
+		}
 
-func makePurgeConfirmHandler(rd redriver.Redriver) gin.HandlerFunc {
-	return nil
+		sess.AddFlash(fmt.Sprintf("Purged submitted for queue %s in %v", qName,
+			latency))
+		sess.AddFlash("The actual purge process takes up to 60 seconds, " +
+			"so not be surprised if some messages are still visible on the queue messsages list." +
+			"We recommend waiting for 60 seconds to refresh, regardless of your queue's size.")
+	}
 }

+ 0 - 2
back/web/queue.go

@@ -1,7 +1,6 @@
 package web
 
 import (
-	"fmt"
 	"log"
 	"net/http"
 	"time"
@@ -19,7 +18,6 @@ func makeQueueHandler(rd redriver.Redriver) gin.HandlerFunc {
 
 		sess := sessions.Default(c)
 		flashes := sess.Flashes()
-		sess.AddFlash(fmt.Sprintf("Previous info acquired at: %v", time.Now()))
 		_ = sess.Save()
 
 		t0 := time.Now()

+ 3 - 3
back/web/routes.go

@@ -49,9 +49,9 @@ func SetupRoutes(rd redriver.Redriver, renderer *template.Template, storeSecret,
 	r.GET("/", makeHomeHandler(rd))
 
 	// TODO
-	r.POST("/queue/:name/delete", mw, makeDeleteConfirmHandler(rd)) // Needs mw to check token.
-	r.POST("/queue/:name/purge", mw, makePurgeConfirmHandler(rd))   // Needs mw to check token.
-	r.POST("/queue/:name/redrive", mw, makeRedriveHandler(rd))      // Needs mw to check token.
+	r.POST("/queue/:name/delete", mw, makeDeleteHandler(rd))   // Needs mw to check token.
+	r.POST("/queue/:name/purge", mw, makePurgeHandler(rd))     // Needs mw to check token.
+	r.POST("/queue/:name/redrive", mw, makeRedriveHandler(rd)) // Needs mw to check token.
 	return r
 }
 

+ 1 - 1
front/templates/queue.gohtml

@@ -12,7 +12,7 @@
         <div class="container mt-5">
             <nav aria-label="breadcrumb">
                 <ol class="breadcrumb">
-                    <li class="breadcrumb-item"><a href="#">Home</a></li>
+                    <li class="breadcrumb-item"><a href="/">Home</a></li>
                     <li class="breadcrumb-item active" aria-current="page">{{ .info.Name }}</li>
                 </ol>
             </nav>