api.spaceplanner.app

Spaceplanner API
git clone git://jacobedwards.org/api.spaceplanner.app
Log | Files | Refs

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:
Mcmd/api/floorplans.go | 120+++++++++++++++++++++++--------------------------------------------------------
Mcmd/api/main.go | 2+-
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)