Plan stuff. Log stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

130 lines
2.8 KiB

  1. package api
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "github.com/gisle/stufflog/database"
  5. "github.com/gisle/stufflog/models"
  6. "github.com/gisle/stufflog/services"
  7. "github.com/gisle/stufflog/slerrors"
  8. "sort"
  9. )
  10. func Items(g *gin.RouterGroup, db database.Database, auth *services.AuthService) {
  11. type resObj struct {
  12. Item *models.Item `json:"item,omitempty"`
  13. Items []*models.Item `json:"items,omitempty"`
  14. }
  15. g.Use(auth.GinSessionMiddleware(true))
  16. // GET / – List own items
  17. g.GET("/", func(c *gin.Context) {
  18. user := auth.UserFromContext(c)
  19. items, err := db.Items().ListUser(c.Request.Context(), *user)
  20. if err != nil {
  21. slerrors.GinRespond(c, err)
  22. return
  23. }
  24. if items == nil {
  25. items = []*models.Item{}
  26. }
  27. sort.Sort(models.ItemsByName(items))
  28. c.JSON(200, resObj{Items: items})
  29. })
  30. // GET /:id – Find an item
  31. g.GET("/:id", func(c *gin.Context) {
  32. user := auth.UserFromContext(c)
  33. item, err := db.Items().FindID(c.Request.Context(), c.Param("id"))
  34. if err != nil {
  35. slerrors.GinRespond(c, err)
  36. return
  37. }
  38. if item.UserID != user.ID {
  39. slerrors.GinRespond(c, slerrors.NotFound("Item"))
  40. return
  41. }
  42. c.JSON(200, resObj{Item: item})
  43. })
  44. // POST / – Create an item
  45. g.POST("/", func(c *gin.Context) {
  46. user := auth.UserFromContext(c)
  47. item := models.Item{}
  48. err := c.BindJSON(&item)
  49. if err != nil {
  50. slerrors.GinRespond(c, &slerrors.SLError{Code: 400, Text: err.Error()})
  51. return
  52. }
  53. item.GenerateID()
  54. item.UserID = user.ID
  55. err = db.Items().Insert(c.Request.Context(), item)
  56. if err != nil {
  57. slerrors.GinRespond(c, err)
  58. return
  59. }
  60. c.JSON(200, resObj{Item: &item})
  61. })
  62. // PATCH /:id – Update an item
  63. g.PATCH("/:id", func(c *gin.Context) {
  64. user := auth.UserFromContext(c)
  65. updates := make([]*models.ItemUpdate, 0, 8)
  66. err := c.BindJSON(&updates)
  67. if err != nil {
  68. slerrors.GinRespond(c, &slerrors.SLError{Code: 400, Text: err.Error()})
  69. return
  70. }
  71. item, err := db.Items().FindID(c.Request.Context(), c.Param("id"))
  72. if err != nil {
  73. slerrors.GinRespond(c, err)
  74. return
  75. }
  76. if item.UserID != user.ID {
  77. slerrors.GinRespond(c, slerrors.NotFound("Item"))
  78. return
  79. }
  80. item, err = db.Items().Update(c.Request.Context(), *item, updates)
  81. if err != nil {
  82. slerrors.GinRespond(c, err)
  83. return
  84. }
  85. c.JSON(200, resObj{Item: item})
  86. })
  87. // DELETE /:id – Delete an item
  88. g.DELETE("/:id", func(c *gin.Context) {
  89. user := auth.UserFromContext(c)
  90. item, err := db.Items().FindID(c.Request.Context(), c.Param("id"))
  91. if err != nil {
  92. slerrors.GinRespond(c, err)
  93. return
  94. }
  95. if item.UserID != user.ID {
  96. slerrors.GinRespond(c, slerrors.NotFound("Period"))
  97. return
  98. }
  99. err = db.Items().Remove(c.Request.Context(), *item)
  100. if err != nil {
  101. slerrors.GinRespond(c, err)
  102. return
  103. }
  104. c.JSON(200, resObj{Item: item})
  105. })
  106. }