update.go 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package cosy
  2. import (
  3. "github.com/0xJacky/Nginx-UI/api/cosy/map2struct"
  4. "github.com/0xJacky/Nginx-UI/model"
  5. "github.com/gin-gonic/gin"
  6. "gorm.io/gorm"
  7. "net/http"
  8. )
  9. func (c *Ctx[T]) SetNextHandler(handler gin.HandlerFunc) *Ctx[T] {
  10. c.nextHandler = &handler
  11. return c
  12. }
  13. func (c *Ctx[T]) Modify() {
  14. if c.abort {
  15. return
  16. }
  17. id := c.ctx.Param("id")
  18. errs := c.validate()
  19. if len(errs) > 0 {
  20. c.ctx.JSON(http.StatusNotAcceptable, gin.H{
  21. "message": "Requested with wrong parameters",
  22. "errors": errs,
  23. })
  24. return
  25. }
  26. db := model.UseDB()
  27. result := db
  28. if len(c.gormScopes) > 0 {
  29. result = result.Scopes(c.gormScopes...)
  30. }
  31. err := result.Session(&gorm.Session{}).First(&c.Model, id).Error
  32. if err != nil {
  33. c.AbortWithError(err)
  34. return
  35. }
  36. c.beforeDecodeHook()
  37. if c.abort {
  38. return
  39. }
  40. var selectedFields []string
  41. for k := range c.Payload {
  42. selectedFields = append(selectedFields, k)
  43. }
  44. err = map2struct.WeakDecode(c.Payload, &c.Model)
  45. if err != nil {
  46. errHandler(c.ctx, err)
  47. return
  48. }
  49. c.beforeExecuteHook()
  50. if c.abort {
  51. return
  52. }
  53. err = db.Model(&c.Model).Select(selectedFields).Updates(&c.Model).Error
  54. if err != nil {
  55. c.AbortWithError(err)
  56. return
  57. }
  58. if len(c.executedHookFunc) > 0 {
  59. for _, v := range c.executedHookFunc {
  60. v(c)
  61. if c.abort {
  62. return
  63. }
  64. }
  65. }
  66. if c.nextHandler != nil {
  67. (*c.nextHandler)(c.ctx)
  68. } else {
  69. c.ctx.JSON(http.StatusOK, c.Model)
  70. }
  71. }