package api import ( "github.com/gin-gonic/gin" "github.com/gisle/stufflog/database" "github.com/gisle/stufflog/models" "github.com/gisle/stufflog/services" "github.com/gisle/stufflog/slerrors" "sort" ) func Items(g *gin.RouterGroup, db database.Database, auth *services.AuthService) { type resObj struct { Item *models.Item `json:"item,omitempty"` Items []*models.Item `json:"items,omitempty"` } g.Use(auth.GinSessionMiddleware(true)) // GET / – List own items g.GET("/", func(c *gin.Context) { user := auth.UserFromContext(c) items, err := db.Items().ListUser(c.Request.Context(), *user) if err != nil { slerrors.GinRespond(c, err) return } if items == nil { items = []*models.Item{} } sort.Sort(models.ItemsByName(items)) c.JSON(200, resObj{Items: items}) }) // GET /:id – Find an item g.GET("/:id", func(c *gin.Context) { user := auth.UserFromContext(c) item, err := db.Items().FindID(c.Request.Context(), c.Param("id")) if err != nil { slerrors.GinRespond(c, err) return } if item.UserID != user.ID { slerrors.GinRespond(c, slerrors.NotFound("Item")) return } c.JSON(200, resObj{Item: item}) }) // POST / – Create an item g.POST("/", func(c *gin.Context) { user := auth.UserFromContext(c) item := models.Item{} err := c.BindJSON(&item) if err != nil { slerrors.GinRespond(c, &slerrors.SLError{Code: 400, Text: err.Error()}) return } item.GenerateID() item.UserID = user.ID err = db.Items().Insert(c.Request.Context(), item) if err != nil { slerrors.GinRespond(c, err) return } c.JSON(200, resObj{Item: &item}) }) // PATCH /:id – Update an item g.PATCH("/:id", func(c *gin.Context) { user := auth.UserFromContext(c) updates := make([]*models.ItemUpdate, 0, 8) err := c.BindJSON(&updates) if err != nil { slerrors.GinRespond(c, &slerrors.SLError{Code: 400, Text: err.Error()}) return } item, err := db.Items().FindID(c.Request.Context(), c.Param("id")) if err != nil { slerrors.GinRespond(c, err) return } if item.UserID != user.ID { slerrors.GinRespond(c, slerrors.NotFound("Item")) return } item, err = db.Items().Update(c.Request.Context(), *item, updates) if err != nil { slerrors.GinRespond(c, err) return } c.JSON(200, resObj{Item: item}) }) // DELETE /:id – Delete an item g.DELETE("/:id", func(c *gin.Context) { user := auth.UserFromContext(c) item, err := db.Items().FindID(c.Request.Context(), c.Param("id")) if err != nil { slerrors.GinRespond(c, err) return } if item.UserID != user.ID { slerrors.GinRespond(c, slerrors.NotFound("Period")) return } err = db.Items().Remove(c.Request.Context(), *item) if err != nil { slerrors.GinRespond(c, err) return } c.JSON(200, resObj{Item: item}) }) }