summaryrefslogtreecommitdiff
path: root/app/controllers/sparkles
diff options
context:
space:
mode:
authormo khan <mo@mokhan.ca>2025-04-22 11:34:14 -0600
committermo khan <mo@mokhan.ca>2025-04-22 11:34:14 -0600
commitc11693668f7e230a21f806664b411a598bee9b10 (patch)
tree0fecffe3b5b7a98b2134cc86402370a777fdcd4c /app/controllers/sparkles
parent699ef9cc2a910774d1f210ef0562496d08f04e03 (diff)
feat: add tiny vue.js app to list and add new sparkles
Diffstat (limited to 'app/controllers/sparkles')
-rw-r--r--app/controllers/sparkles/controller.go23
-rw-r--r--app/controllers/sparkles/controller_test.go20
-rw-r--r--app/controllers/sparkles/init.go20
3 files changed, 59 insertions, 4 deletions
diff --git a/app/controllers/sparkles/controller.go b/app/controllers/sparkles/controller.go
index bc388db..07a21ba 100644
--- a/app/controllers/sparkles/controller.go
+++ b/app/controllers/sparkles/controller.go
@@ -3,7 +3,10 @@ package sparkles
import (
"net/http"
+ "github.com/xlgmokha/x/pkg/log"
+ "github.com/xlgmokha/x/pkg/mapper"
"github.com/xlgmokha/x/pkg/serde"
+ "github.com/xlgmokha/x/pkg/x"
"gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/db"
"gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/domain"
)
@@ -26,7 +29,23 @@ func (c *Controller) Index(w http.ResponseWriter, r *http.Request) {
}
func (c *Controller) Create(w http.ResponseWriter, r *http.Request) {
- sparkle, _ := serde.FromHTTP[*domain.Sparkle](r)
- c.db.Save(sparkle)
+ sparkle := mapper.MapFrom[*http.Request, *domain.Sparkle](r)
+
+ if x.IsZero(sparkle) {
+ w.WriteHeader(http.StatusBadRequest)
+ return
+ }
+
+ if err := c.db.Save(sparkle); err != nil {
+ log.WithFields(r.Context(), log.Fields{"error": err})
+ w.WriteHeader(http.StatusBadRequest)
+ return
+ }
+
w.WriteHeader(http.StatusCreated)
+ if err := serde.ToHTTP(w, r, sparkle); err != nil {
+ log.WithFields(r.Context(), log.Fields{"error": err})
+ w.WriteHeader(http.StatusInternalServerError)
+ return
+ }
}
diff --git a/app/controllers/sparkles/controller_test.go b/app/controllers/sparkles/controller_test.go
index 99fdd69..4eadd2c 100644
--- a/app/controllers/sparkles/controller_test.go
+++ b/app/controllers/sparkles/controller_test.go
@@ -48,7 +48,7 @@ func TestSparkles(t *testing.T) {
controller := New(repository)
controller.MountTo(mux)
- sparkle, _ := domain.NewSparkle("@tanuki for reviewing my MR!")
+ sparkle, _ := domain.NewSparkle("@tanuki for reviewing my code!")
request, response := test.RequestResponse(
"POST",
"/sparkles",
@@ -59,7 +59,23 @@ func TestSparkles(t *testing.T) {
mux.ServeHTTP(response, request)
require.Equal(t, http.StatusCreated, response.Code)
- assert.Equal(t, 1, len(repository.All()))
+
+ t.Run("returns a JSON representation of the sparkle", func(t *testing.T) {
+ item, err := serde.FromJSON[*domain.Sparkle](response.Body)
+ require.NoError(t, err)
+
+ assert.NotEmpty(t, item.ID)
+ assert.Equal(t, "@tanuki", item.Sparklee)
+ assert.Equal(t, "for reviewing my code!", item.Reason)
+ })
+
+ t.Run("saves the sparkle to the db", func(t *testing.T) {
+ assert.Equal(t, 1, len(repository.All()))
+ item := repository.All()[0]
+
+ assert.Equal(t, "@tanuki", item.Sparklee)
+ assert.Equal(t, "for reviewing my code!", item.Reason)
+ })
})
})
}
diff --git a/app/controllers/sparkles/init.go b/app/controllers/sparkles/init.go
new file mode 100644
index 0000000..9efcac8
--- /dev/null
+++ b/app/controllers/sparkles/init.go
@@ -0,0 +1,20 @@
+package sparkles
+
+import (
+ "net/http"
+
+ "github.com/xlgmokha/x/pkg/log"
+ "github.com/xlgmokha/x/pkg/mapper"
+ "github.com/xlgmokha/x/pkg/serde"
+ "gitlab.com/gitlab-org/software-supply-chain-security/authorization/sparkled/pkg/domain"
+)
+
+func init() {
+ mapper.Register[*http.Request, *domain.Sparkle](func(r *http.Request) *domain.Sparkle {
+ sparkle, err := serde.FromHTTP[*domain.Sparkle](r)
+ if err != nil {
+ log.WithFields(r.Context(), log.Fields{"error": err})
+ }
+ return sparkle
+ })
+}