simple.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. package value_object_crud
  2. import (
  3. "git.sxidc.com/go-framework/baize/framwork/api"
  4. "git.sxidc.com/go-framework/baize/framwork/binding"
  5. "git.sxidc.com/go-framework/baize/framwork/binding/request"
  6. "git.sxidc.com/go-framework/baize/framwork/binding/response"
  7. "git.sxidc.com/go-framework/baize/framwork/domain"
  8. "git.sxidc.com/go-framework/baize/framwork/domain/value_object"
  9. )
  10. // Simple 值对象CRD的Bind参数
  11. // I 为查询相关接口返回的Info类型
  12. type Simple[I any] struct {
  13. // 使用的领域实体,注意是ValueObject类型
  14. ValueObject value_object.ValueObject
  15. // 数据库schema
  16. Schema string
  17. // 创建使用的请求参数
  18. CreateJsonBody request.Params
  19. // 删除使用的请求参数
  20. DeleteJsonBody request.Params
  21. // 查询使用的请求参数,注意是Query类型
  22. QueryQueryParams request.QueryRequestParams
  23. // 可选配置项,通过WithXXX配置
  24. options *Options[I]
  25. }
  26. func (simple *Simple[I]) bind(binder *binding.Binder) {
  27. options := simple.options
  28. tableName := domain.TableName(simple.Schema, simple.ValueObject)
  29. domainPath := domain.RelativeDomainPath(simple.ValueObject)
  30. // 创建
  31. if !options.disableCreate {
  32. if !options.createNeedTx {
  33. binding.PostBind(binder, &binding.SimpleBindItem[any]{
  34. Path: domainPath + "/create",
  35. ResponseFunc: response.SendMsgResponse,
  36. RequestParams: simple.CreateJsonBody,
  37. Objects: []domain.Object{simple.ValueObject},
  38. ServiceFunc: Create(tableName, options.createCallbacks),
  39. })
  40. } else {
  41. binding.PostBind(binder, &binding.SimpleBindItem[any]{
  42. Path: domainPath + "/create",
  43. ResponseFunc: response.SendMsgResponse,
  44. RequestParams: simple.CreateJsonBody,
  45. Objects: []domain.Object{simple.ValueObject},
  46. ServiceFunc: CreateTx(tableName, options.createCallbacks),
  47. })
  48. }
  49. }
  50. // 删除
  51. if !options.disableDelete {
  52. if !options.deleteNeedTx {
  53. binding.PostBind(binder, &binding.SimpleBindItem[any]{
  54. Path: domainPath + "/delete",
  55. ResponseFunc: response.SendMsgResponse,
  56. RequestParams: simple.DeleteJsonBody,
  57. RequestParamsBindFunc: request.JsonBody,
  58. Objects: []domain.Object{simple.ValueObject},
  59. ServiceFunc: Delete(tableName, options.deleteCallbacks),
  60. })
  61. } else {
  62. binding.PostBind(binder, &binding.SimpleBindItem[any]{
  63. Path: domainPath + "/delete",
  64. ResponseFunc: response.SendMsgResponse,
  65. RequestParams: simple.DeleteJsonBody,
  66. RequestParamsBindFunc: request.JsonBody,
  67. Objects: []domain.Object{simple.ValueObject},
  68. ServiceFunc: DeleteTx(tableName, options.deleteCallbacks),
  69. })
  70. }
  71. }
  72. // 查询
  73. if !options.disableQuery {
  74. binding.GetBind(binder, &binding.SimpleBindItem[response.InfosData[I]]{
  75. Path: domainPath + "/query",
  76. ResponseFunc: response.SendInfosResponse[I],
  77. RequestParams: simple.QueryQueryParams,
  78. Objects: []domain.Object{simple.ValueObject},
  79. ServiceFunc: Query(tableName, options.queryCallbacks, options.queryConditionFieldCallback),
  80. })
  81. }
  82. }
  83. func BindSimple[I any](binder *binding.Binder, simple *Simple[I], opts ...Option[I]) {
  84. options := new(Options[I])
  85. for _, opt := range opts {
  86. opt(options)
  87. }
  88. simple.options = options
  89. simple.bind(binder)
  90. }
  91. type Option[I any] func(options *Options[I])
  92. type Options[I any] struct {
  93. // 关闭创建
  94. disableCreate bool
  95. // 创建是否使用事务
  96. createNeedTx bool
  97. // 创建回调
  98. createCallbacks *Callbacks[any]
  99. // 创建中间件
  100. createMiddlewares []api.Handler
  101. // 关闭删除
  102. disableDelete bool
  103. // 删除是否使用事务
  104. deleteNeedTx bool
  105. // 删除回调
  106. deleteCallbacks *Callbacks[any]
  107. // 删除中间件
  108. deleteMiddlewares []api.Handler
  109. // 关闭查询
  110. disableQuery bool
  111. // 查询条件构造回调
  112. queryConditionFieldCallback ConditionFieldCallback
  113. // 查询回调
  114. queryCallbacks *Callbacks[response.InfosData[I]]
  115. // 查询中间件
  116. queryMiddlewares []api.Handler
  117. }
  118. func WithDisableCreate[I any]() Option[I] {
  119. return func(options *Options[I]) {
  120. options.disableCreate = true
  121. }
  122. }
  123. func WithCreateTx[I any]() Option[I] {
  124. return func(options *Options[I]) {
  125. options.createNeedTx = true
  126. }
  127. }
  128. func WithCreateCallbacks[I any](callbacks *Callbacks[any]) Option[I] {
  129. return func(options *Options[I]) {
  130. options.createCallbacks = callbacks
  131. }
  132. }
  133. func WithCreateMiddlewares[I any](middlewares []api.Handler) Option[I] {
  134. return func(options *Options[I]) {
  135. options.createMiddlewares = middlewares
  136. }
  137. }
  138. func WithDisableDelete[I any]() Option[I] {
  139. return func(options *Options[I]) {
  140. options.disableDelete = true
  141. }
  142. }
  143. func WithDeleteTx[I any]() Option[I] {
  144. return func(options *Options[I]) {
  145. options.deleteNeedTx = true
  146. }
  147. }
  148. func WithDeleteCallbacks[I any](callbacks *Callbacks[any]) Option[I] {
  149. return func(options *Options[I]) {
  150. options.deleteCallbacks = callbacks
  151. }
  152. }
  153. func WithDeleteMiddlewares[I any](middlewares []api.Handler) Option[I] {
  154. return func(options *Options[I]) {
  155. options.deleteMiddlewares = middlewares
  156. }
  157. }
  158. func WithDisableQuery[I any]() Option[I] {
  159. return func(options *Options[I]) {
  160. options.disableQuery = true
  161. }
  162. }
  163. func WithQueryConditionFieldCallback[I any](callback ConditionFieldCallback) Option[I] {
  164. return func(options *Options[I]) {
  165. options.queryConditionFieldCallback = callback
  166. }
  167. }
  168. func WithQueryCallbacks[I any](callbacks *Callbacks[response.InfosData[I]]) Option[I] {
  169. return func(options *Options[I]) {
  170. options.queryCallbacks = callbacks
  171. }
  172. }
  173. func WithQueryMiddlewares[I any](middlewares []api.Handler) Option[I] {
  174. return func(options *Options[I]) {
  175. options.queryMiddlewares = middlewares
  176. }
  177. }