commit 0996a536ed4af01fe44fd426ccc13993e3dab3af
parent ae4354d73b85d27ecf5d0d07074015d546864b0a
Author: Jacob R. Edwards <jacob@jacobedwards.org>
Date: Fri, 4 Oct 2024 11:15:36 -0700
Replace floorplan patch endpoint with put
Really unnecessary complexity for such a small data structure.
I suppose I could produce a generic interface for updating these
structures with JSON, and I should since the only reason I'm not
is it would be grossly inefficient, but here we are.
Diffstat:
2 files changed, 35 insertions(+), 87 deletions(-)
diff --git a/cmd/api/floorplans.go b/cmd/api/floorplans.go
@@ -1,7 +1,6 @@
package main
import (
- "encoding/json"
"net/http"
"github.com/gin-gonic/gin"
@@ -46,54 +45,22 @@ func (e *Env) CreateFloorplan(c *gin.Context) {
}
func (e *Env) UpdateFloorplan(c *gin.Context) {
- user := c.Param("user")
- name := c.Param("floorplan")
-
- patches := make([]backend.Patch, 16)
- if err := c.ShouldBind(&patches); err != nil {
- RespondError(c, 400, "Unable to read patchset")
- return
- }
-
- tx, err := e.backend.DB.Begin()
- if err != nil {
- RespondError(c, 400, "Unable to begin transaction: %s", err.Error())
- return
- }
-
- fp, err := e.backend.GetFloorplan(tx, user, name)
- if err != nil {
- tx.Rollback()
- RespondError(c, 400, "Unable to get floorplan: %s", err.Error())
- return
- }
-
- patchable := backendToPatchable(fp)
- if err = applyPatchset(patchable, patches); err != nil {
- tx.Rollback()
- RespondError(c, 400, "Unable to patch floorplan: %s", err.Error())
- return
- }
+ var req SettableFloorplan
- settable, err := patchableToSettable(patchable)
- if err != nil {
- tx.Rollback()
- RespondError(c, 400, "Unable to push update: %s", err.Error())
- return
- }
- newfp := backend.Floorplan{User: user, Name: settable.Name, Synopsis: settable.Synopsis, Address: settable.Address}
- fp, err = e.backend.UpdateFloorplan(tx, user, name, &newfp)
- if err != nil {
- tx.Rollback()
- RespondError(c, 400, "Unable to push update: %s", err.Error())
+ if err := c.ShouldBind(&req); err != nil {
+ RespondError(c, 400, "%s", err.Error())
return
}
- err = tx.Commit()
+ user := c.Param("user")
+ name := c.Param("floorplan")
+ fp, err := e.backend.UpdateFloorplan(nil, user, name,
+ &backend.Floorplan{User: user, Name: req.Name, Address: req.Address, Synopsis: req.Synopsis})
if err != nil {
- RespondError(c, 400, "Unable to commit update: %s", err.Error())
+ RespondError(c, 500, "Unable to update floorplan")
+ } else {
+ Respond(c, 200, fp)
}
- Respond(c, 200, fp)
}
func (e *Env) DeleteFloorplan(c *gin.Context) {
@@ -132,33 +99,33 @@ func (e *Env) GetFloorplan(c *gin.Context) {
}
func (e *Env) GetFloorplanData(c *gin.Context) {
- user := c.Param("user")
- floorplan := c.Param("floorplan")
-
- data, err := e.backend.GetFloorplanData(nil, user, floorplan)
- if err != nil {
- RespondError(c, 400, "%s", err.Error())
- } else {
- Respond(c, http.StatusOK, data)
- }
+ user := c.Param("user")
+ floorplan := c.Param("floorplan")
+
+ data, err := e.backend.GetFloorplanData(nil, user, floorplan)
+ if err != nil {
+ RespondError(c, 400, "%s", err.Error())
+ } else {
+ Respond(c, http.StatusOK, data)
+ }
}
func (e *Env) PatchFloorplanData(c *gin.Context) {
- var patch []backend.Patch
- user := c.Param("user")
- floorplan := c.Param("floorplan")
-
- if err := c.ShouldBind(&patch); err != nil {
- RespondError(c, 400, "%s: Unable to get patch", err.Error())
- return
- }
-
- data, err := e.backend.PatchFloorplanData(nil, user, floorplan, patch)
- if err != nil {
- RespondError(c, 400, "%s: Unable to patch floorplan", err.Error())
- } else {
- Respond(c, http.StatusOK, data)
- }
+ var patch []backend.Patch
+ user := c.Param("user")
+ floorplan := c.Param("floorplan")
+
+ if err := c.ShouldBind(&patch); err != nil {
+ RespondError(c, 400, "%s: Unable to get patch", err.Error())
+ return
+ }
+
+ data, err := e.backend.PatchFloorplanData(nil, user, floorplan, patch)
+ if err != nil {
+ RespondError(c, 400, "%s: Unable to patch floorplan", err.Error())
+ } else {
+ Respond(c, http.StatusOK, data)
+ }
}
func (e *Env) ReplaceFloorplanData(c *gin.Context) {
@@ -178,22 +145,3 @@ func (e *Env) ReplaceFloorplanData(c *gin.Context) {
}
Respond(c, 200, newdata)
}
-
-func patchableToSettable(data map[string]interface{}) (*SettableFloorplan, error) {
- // Seems stupidly inefficient, but I can't find a better way at the moment
- jsondata, err := json.Marshal(data)
- if err != nil {
- return nil, err
- }
-
- fp := &SettableFloorplan{}
- return fp, json.Unmarshal(jsondata, fp)
-}
-
-func backendToPatchable(f *backend.Floorplan) map[string]interface{} {
- return map[string](interface{}){
- "name": &f.Name,
- "address": f.Address,
- "synopsis": f.Synopsis,
- }
-}
diff --git a/cmd/api/main.go b/cmd/api/main.go
@@ -125,7 +125,7 @@ func setPayedRoutes(env *Env, r *gin.RouterGroup) {
fp.POST("", env.CreateFloorplan)
fp = fp.Group("/:floorplan")
- fp.PATCH("", env.UpdateFloorplan)
+ fp.PUT("", env.UpdateFloorplan)
fp.DELETE("", env.DeleteFloorplan)
fp.GET("", env.GetFloorplan)