simple.go 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. package value_object_crud
  2. import (
  3. "git.sxidc.com/go-framework/baize/framework/binding"
  4. "git.sxidc.com/go-framework/baize/framework/binding/request"
  5. "git.sxidc.com/go-framework/baize/framework/binding/response"
  6. "git.sxidc.com/go-framework/baize/framework/core/api"
  7. "git.sxidc.com/go-framework/baize/framework/core/domain"
  8. "git.sxidc.com/go-framework/baize/framework/core/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. creatOptions *CreateOptions
  25. deleteOptions *DeleteOptions
  26. queryOptions *QueryOptions[I]
  27. }
  28. func (simple *Simple[I]) bind(binder *binding.Binder) {
  29. createOptions := simple.creatOptions
  30. deleteOptions := simple.deleteOptions
  31. queryOptions := simple.queryOptions
  32. tableName := domain.TableName(simple.Schema, simple.ValueObject)
  33. domainPath := domain.RelativeDomainPath(simple.ValueObject)
  34. // 创建
  35. if !createOptions.disable {
  36. if !createOptions.needTx {
  37. binding.PostBind(binder, &binding.SimpleBindItem[any]{
  38. Path: domainPath + "/create",
  39. ResponseFunc: response.SendMsgResponse,
  40. RequestParams: simple.CreateJsonBody,
  41. Objects: []domain.Object{simple.ValueObject},
  42. ServiceFunc: Create(tableName, createOptions.callbacks),
  43. })
  44. } else {
  45. binding.PostBind(binder, &binding.SimpleBindItem[any]{
  46. Path: domainPath + "/create",
  47. ResponseFunc: response.SendMsgResponse,
  48. RequestParams: simple.CreateJsonBody,
  49. Objects: []domain.Object{simple.ValueObject},
  50. ServiceFunc: CreateTx(tableName, createOptions.callbacks),
  51. })
  52. }
  53. }
  54. // 删除
  55. if !deleteOptions.disable {
  56. if !deleteOptions.needTx {
  57. binding.PostBind(binder, &binding.SimpleBindItem[any]{
  58. Path: domainPath + "/delete",
  59. ResponseFunc: response.SendMsgResponse,
  60. RequestParams: simple.DeleteJsonBody,
  61. RequestParamsBindFunc: request.JsonBody,
  62. Objects: []domain.Object{simple.ValueObject},
  63. ServiceFunc: Delete(tableName, deleteOptions.callbacks),
  64. })
  65. } else {
  66. binding.PostBind(binder, &binding.SimpleBindItem[any]{
  67. Path: domainPath + "/delete",
  68. ResponseFunc: response.SendMsgResponse,
  69. RequestParams: simple.DeleteJsonBody,
  70. RequestParamsBindFunc: request.JsonBody,
  71. Objects: []domain.Object{simple.ValueObject},
  72. ServiceFunc: DeleteTx(tableName, deleteOptions.callbacks),
  73. })
  74. }
  75. }
  76. // 查询
  77. if !queryOptions.disable {
  78. binding.GetBind(binder, &binding.SimpleBindItem[response.InfosData[I]]{
  79. Path: domainPath + "/query",
  80. ResponseFunc: response.SendInfosResponse[I],
  81. RequestParams: simple.QueryQueryParams,
  82. Objects: []domain.Object{simple.ValueObject},
  83. ServiceFunc: Query(tableName, queryOptions.callbacks, queryOptions.conditionFieldCallback),
  84. })
  85. }
  86. }
  87. func BindSimple[I any](binder *binding.Binder, simple *Simple[I], opts ...any) {
  88. createOptions := new(CreateOptions)
  89. deleteOptions := new(DeleteOptions)
  90. queryOptions := new(QueryOptions[I])
  91. for _, opt := range opts {
  92. switch o := opt.(type) {
  93. case CreateOption:
  94. o(createOptions)
  95. case DeleteOption:
  96. o(deleteOptions)
  97. case QueryOption[I]:
  98. o(queryOptions)
  99. default:
  100. continue
  101. }
  102. }
  103. simple.creatOptions = createOptions
  104. simple.deleteOptions = deleteOptions
  105. simple.queryOptions = queryOptions
  106. simple.bind(binder)
  107. }
  108. type CreateOption func(options *CreateOptions)
  109. type DeleteOption func(options *DeleteOptions)
  110. type QueryOption[I any] func(options *QueryOptions[I])
  111. type CreateOptions struct {
  112. // 关闭创建
  113. disable bool
  114. // 创建是否使用事务
  115. needTx bool
  116. // 创建回调
  117. callbacks *CreateCallbacks
  118. // 创建中间件
  119. middlewares []api.Handler
  120. }
  121. type DeleteOptions struct {
  122. // 关闭删除
  123. disable bool
  124. // 删除是否使用事务
  125. needTx bool
  126. // 删除回调
  127. callbacks *DeleteCallbacks
  128. // 删除中间件
  129. middlewares []api.Handler
  130. }
  131. type QueryOptions[I any] struct {
  132. // 关闭查询
  133. disable bool
  134. // 查询条件构造回调
  135. conditionFieldCallback ConditionFieldCallback
  136. // 查询回调
  137. callbacks *QueryCallbacks[I]
  138. // 查询中间件
  139. middlewares []api.Handler
  140. }
  141. func WithDisableCreate() CreateOption {
  142. return func(options *CreateOptions) {
  143. options.disable = true
  144. }
  145. }
  146. func WithCreateTx() CreateOption {
  147. return func(options *CreateOptions) {
  148. options.needTx = true
  149. }
  150. }
  151. func WithCreateCallbacks(callbacks *CreateCallbacks) CreateOption {
  152. return func(options *CreateOptions) {
  153. options.callbacks = callbacks
  154. }
  155. }
  156. func WithCreateMiddlewares(middlewares []api.Handler) CreateOption {
  157. return func(options *CreateOptions) {
  158. options.middlewares = middlewares
  159. }
  160. }
  161. func WithDisableDelete() DeleteOption {
  162. return func(options *DeleteOptions) {
  163. options.disable = true
  164. }
  165. }
  166. func WithDeleteTx() DeleteOption {
  167. return func(options *DeleteOptions) {
  168. options.needTx = true
  169. }
  170. }
  171. func WithDeleteCallbacks(callbacks *DeleteCallbacks) DeleteOption {
  172. return func(options *DeleteOptions) {
  173. options.callbacks = callbacks
  174. }
  175. }
  176. func WithDeleteMiddlewares(middlewares []api.Handler) DeleteOption {
  177. return func(options *DeleteOptions) {
  178. options.middlewares = middlewares
  179. }
  180. }
  181. func WithDisableQuery[I any]() QueryOption[I] {
  182. return func(options *QueryOptions[I]) {
  183. options.disable = true
  184. }
  185. }
  186. func WithQueryConditionFieldCallback[I any](callback ConditionFieldCallback) QueryOption[I] {
  187. return func(options *QueryOptions[I]) {
  188. options.conditionFieldCallback = callback
  189. }
  190. }
  191. func WithQueryCallbacks[I any](callbacks *QueryCallbacks[I]) QueryOption[I] {
  192. return func(options *QueryOptions[I]) {
  193. options.callbacks = callbacks
  194. }
  195. }
  196. func WithQueryMiddlewares[I any](middlewares []api.Handler) QueryOption[I] {
  197. return func(options *QueryOptions[I]) {
  198. options.middlewares = middlewares
  199. }
  200. }