cosy.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package cosy
  2. import (
  3. "github.com/0xJacky/Nginx-UI/internal/logger"
  4. "github.com/gin-gonic/gin"
  5. "github.com/go-playground/validator/v10"
  6. "gorm.io/gorm"
  7. )
  8. var validate *validator.Validate
  9. func init() {
  10. validate = validator.New()
  11. }
  12. type Ctx[T any] struct {
  13. ctx *gin.Context
  14. rules gin.H
  15. Payload map[string]interface{}
  16. Model T
  17. abort bool
  18. nextHandler *gin.HandlerFunc
  19. beforeDecodeHookFunc []func(ctx *Ctx[T])
  20. beforeExecuteHookFunc []func(ctx *Ctx[T])
  21. executedHookFunc []func(ctx *Ctx[T])
  22. gormScopes []func(tx *gorm.DB) *gorm.DB
  23. preloads []string
  24. scan func(tx *gorm.DB) any
  25. transformer func(*T) any
  26. permanentlyDelete bool
  27. SelectedFields []string
  28. itemKey string
  29. }
  30. func Core[T any](c *gin.Context) *Ctx[T] {
  31. return &Ctx[T]{
  32. ctx: c,
  33. gormScopes: make([]func(tx *gorm.DB) *gorm.DB, 0),
  34. beforeExecuteHookFunc: make([]func(ctx *Ctx[T]), 0),
  35. beforeDecodeHookFunc: make([]func(ctx *Ctx[T]), 0),
  36. itemKey: "`id`",
  37. }
  38. }
  39. func (c *Ctx[T]) SetItemKey(key string) *Ctx[T] {
  40. c.itemKey = key
  41. return c
  42. }
  43. func (c *Ctx[T]) SetValidRules(rules gin.H) *Ctx[T] {
  44. c.rules = rules
  45. return c
  46. }
  47. func (c *Ctx[T]) SetPreloads(args ...string) *Ctx[T] {
  48. c.preloads = append(c.preloads, args...)
  49. return c
  50. }
  51. func (c *Ctx[T]) validate() (errs gin.H) {
  52. c.Payload = make(gin.H)
  53. _ = c.ctx.ShouldBindJSON(&c.Payload)
  54. errs = validate.ValidateMap(c.Payload, c.rules)
  55. if len(errs) > 0 {
  56. logger.Debug(errs)
  57. for k := range errs {
  58. errs[k] = c.rules[k]
  59. }
  60. return
  61. }
  62. // Make sure that the key in c.Payload is also the key of rules
  63. validated := make(map[string]interface{})
  64. for k, v := range c.Payload {
  65. if _, ok := c.rules[k]; ok {
  66. validated[k] = v
  67. }
  68. }
  69. c.Payload = validated
  70. return
  71. }
  72. func (c *Ctx[T]) SetScan(scan func(tx *gorm.DB) any) *Ctx[T] {
  73. c.scan = scan
  74. return c
  75. }
  76. func (c *Ctx[T]) SetTransformer(t func(m *T) any) *Ctx[T] {
  77. c.transformer = t
  78. return c
  79. }
  80. func (c *Ctx[T]) AbortWithError(err error) {
  81. c.abort = true
  82. errHandler(c.ctx, err)
  83. }
  84. func (c *Ctx[T]) Abort() {
  85. c.abort = true
  86. }