update.go 1.6 KB

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