simple.go 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. package entity
  2. import (
  3. "git.sxidc.com/go-framework/baize/convenient/binding"
  4. "git.sxidc.com/go-framework/baize/convenient/binding/request"
  5. "git.sxidc.com/go-framework/baize/convenient/binding/response"
  6. "git.sxidc.com/go-framework/baize/framwork/api"
  7. "git.sxidc.com/go-framework/baize/framwork/domain"
  8. "git.sxidc.com/go-framework/baize/framwork/domain/entity"
  9. )
  10. // Simple 实体CRUD的Bind参数
  11. // I 为查询相关接口返回的Info类型
  12. type Simple[I any] struct {
  13. // 使用的领域实体,注意是Entity类型
  14. Entity entity.Entity
  15. // 数据库Schema
  16. Schema string
  17. // 创建使用的请求参数
  18. CreateJsonBody request.Params
  19. // 删除使用的请求参数,注意是WithID类型
  20. DeleteQueryParams request.IDRequestParam
  21. // 更新使用的请求参数,注意是WithID类型
  22. UpdateJsonBody request.IDRequestParam
  23. // 查询使用的请求参数,注意是Query类型
  24. QueryQueryParams request.QueryRequestParams
  25. // 根据ID查询使用的请求参数,注意是WithID类型
  26. GetByIDQueryParams request.IDRequestParam
  27. // 可选配置项,通过WithXXX配置
  28. options *Options[I]
  29. }
  30. func (simple *Simple[I]) bind(binder *binding.Binder) {
  31. options := simple.options
  32. tableName := domain.TableName(simple.Schema, simple.Entity)
  33. domainPath := domain.RelativeDomainPath(simple.Entity)
  34. // 创建
  35. if !options.disableCreate {
  36. if !options.createNeedTx {
  37. binding.PostBind[string](binder, &binding.SimpleBindItem[string]{
  38. Path: domainPath + "/create",
  39. ResponseFunc: response.SendIDResponse,
  40. RequestParams: simple.CreateJsonBody,
  41. Objects: []domain.Object{simple.Entity},
  42. ServiceFunc: Create(tableName, options.createCallbacks),
  43. }, options.createMiddlewares...)
  44. } else {
  45. binding.PostBind(binder, &binding.SimpleBindItem[string]{
  46. Path: domainPath + "/create",
  47. ResponseFunc: response.SendIDResponse,
  48. RequestParams: simple.CreateJsonBody,
  49. Objects: []domain.Object{simple.Entity},
  50. ServiceFunc: CreateTx(tableName, options.createCallbacks),
  51. }, options.createMiddlewares...)
  52. }
  53. }
  54. // 删除
  55. if !options.disableDelete {
  56. if !options.deleteNeedTx {
  57. binding.DeleteBind(binder, &binding.SimpleBindItem[any]{
  58. Path: domainPath + "/delete",
  59. ResponseFunc: response.SendMsgResponse,
  60. RequestParams: simple.DeleteQueryParams,
  61. Objects: []domain.Object{simple.Entity},
  62. ServiceFunc: Delete(tableName, options.deleteCallbacks),
  63. }, options.deleteMiddlewares...)
  64. } else {
  65. binding.DeleteBind(binder, &binding.SimpleBindItem[any]{
  66. Path: domainPath + "/delete",
  67. ResponseFunc: response.SendMsgResponse,
  68. RequestParams: simple.DeleteQueryParams,
  69. Objects: []domain.Object{simple.Entity},
  70. ServiceFunc: DeleteTx(tableName, options.deleteCallbacks),
  71. }, options.deleteMiddlewares...)
  72. }
  73. }
  74. // 修改
  75. if !options.disableUpdate {
  76. if !options.updateNeedTx {
  77. binding.PutBind(binder, &binding.SimpleBindItem[any]{
  78. Path: domainPath + "/update",
  79. ResponseFunc: response.SendMsgResponse,
  80. RequestParams: simple.UpdateJsonBody,
  81. Objects: []domain.Object{simple.Entity},
  82. ServiceFunc: Update(tableName, options.updateCallbacks),
  83. }, options.updateMiddlewares...)
  84. } else {
  85. binding.PutBind(binder, &binding.SimpleBindItem[any]{
  86. Path: domainPath + "/update",
  87. ResponseFunc: response.SendMsgResponse,
  88. RequestParams: simple.UpdateJsonBody,
  89. Objects: []domain.Object{simple.Entity},
  90. ServiceFunc: UpdateTx(tableName, options.updateCallbacks),
  91. }, options.updateMiddlewares...)
  92. }
  93. }
  94. // 查询
  95. if !options.disableQuery {
  96. binding.GetBind(binder, &binding.SimpleBindItem[response.InfosData[I]]{
  97. Path: domainPath + "/query",
  98. ResponseFunc: response.SendInfosResponse[I],
  99. RequestParams: simple.QueryQueryParams,
  100. Objects: []domain.Object{simple.Entity},
  101. ServiceFunc: Query[I](tableName, options.queryCallbacks, options.queryConditionFieldCallback),
  102. }, options.queryMiddlewares...)
  103. }
  104. // 通过ID获取
  105. if !options.disableQueryByID {
  106. binding.GetBind(binder, &binding.SimpleBindItem[I]{
  107. Path: domainPath + "/get",
  108. ResponseFunc: response.SendInfoResponse[I],
  109. RequestParams: simple.GetByIDQueryParams,
  110. Objects: []domain.Object{simple.Entity},
  111. ServiceFunc: GetByID[I](tableName, options.getByIDCallbacks),
  112. }, options.getByIDMiddlewares...)
  113. }
  114. }
  115. func BindSimple[I any](binder *binding.Binder, simple *Simple[I], opts ...Option[I]) {
  116. options := new(Options[I])
  117. for _, opt := range opts {
  118. opt(options)
  119. }
  120. simple.options = options
  121. simple.bind(binder)
  122. }
  123. type Option[I any] func(options *Options[I])
  124. type Options[I any] struct {
  125. // 关闭创建
  126. disableCreate bool
  127. // 创建是否使用事务
  128. createNeedTx bool
  129. // 创建回调
  130. createCallbacks *Callbacks[string]
  131. // 创建中间件
  132. createMiddlewares []api.Handler
  133. // 关闭删除
  134. disableDelete bool
  135. // 删除是否使用事务
  136. deleteNeedTx bool
  137. // 删除回调
  138. deleteCallbacks *Callbacks[any]
  139. // 删除中间件
  140. deleteMiddlewares []api.Handler
  141. // 关闭更新
  142. disableUpdate bool
  143. // 更新是否使用事务
  144. updateNeedTx bool
  145. // 更新回调
  146. updateCallbacks *Callbacks[any]
  147. // 更新中间件
  148. updateMiddlewares []api.Handler
  149. // 关闭查询
  150. disableQuery bool
  151. // 查询条件构造回调
  152. queryConditionFieldCallback ConditionFieldCallback
  153. // 查询回调
  154. queryCallbacks *Callbacks[response.InfosData[I]]
  155. // 查询中间件
  156. queryMiddlewares []api.Handler
  157. // 关闭根据ID查询
  158. disableQueryByID bool
  159. // 根据ID查询回调
  160. getByIDCallbacks *Callbacks[I]
  161. // 根据ID查询中间件
  162. getByIDMiddlewares []api.Handler
  163. }
  164. func WithDisableCreate[I any]() Option[I] {
  165. return func(options *Options[I]) {
  166. options.disableCreate = true
  167. }
  168. }
  169. func WithCreateTx[I any]() Option[I] {
  170. return func(options *Options[I]) {
  171. options.createNeedTx = true
  172. }
  173. }
  174. func WithCreateCallbacks[I any](callbacks *Callbacks[string]) Option[I] {
  175. return func(options *Options[I]) {
  176. options.createCallbacks = callbacks
  177. }
  178. }
  179. func WithCreateMiddlewares[I any](middlewares []api.Handler) Option[I] {
  180. return func(options *Options[I]) {
  181. options.createMiddlewares = middlewares
  182. }
  183. }
  184. func WithDisableDelete[I any]() Option[I] {
  185. return func(options *Options[I]) {
  186. options.disableDelete = true
  187. }
  188. }
  189. func WithDeleteTx[I any]() Option[I] {
  190. return func(options *Options[I]) {
  191. options.deleteNeedTx = true
  192. }
  193. }
  194. func WithDeleteCallbacks[I any](callbacks *Callbacks[any]) Option[I] {
  195. return func(options *Options[I]) {
  196. options.deleteCallbacks = callbacks
  197. }
  198. }
  199. func WithDeleteMiddlewares[I any](middlewares []api.Handler) Option[I] {
  200. return func(options *Options[I]) {
  201. options.deleteMiddlewares = middlewares
  202. }
  203. }
  204. func WithDisableUpdate[I any]() Option[I] {
  205. return func(options *Options[I]) {
  206. options.disableUpdate = true
  207. }
  208. }
  209. func WithUpdateTx[I any]() Option[I] {
  210. return func(options *Options[I]) {
  211. options.updateNeedTx = true
  212. }
  213. }
  214. func WithUpdateCallbacks[I any](callbacks *Callbacks[any]) Option[I] {
  215. return func(options *Options[I]) {
  216. options.updateCallbacks = callbacks
  217. }
  218. }
  219. func WithUpdateMiddlewares[I any](middlewares []api.Handler) Option[I] {
  220. return func(options *Options[I]) {
  221. options.updateMiddlewares = middlewares
  222. }
  223. }
  224. func WithDisableQuery[I any]() Option[I] {
  225. return func(options *Options[I]) {
  226. options.disableQuery = true
  227. }
  228. }
  229. func WithQueryConditionFieldCallback[I any](callback ConditionFieldCallback) Option[I] {
  230. return func(options *Options[I]) {
  231. options.queryConditionFieldCallback = callback
  232. }
  233. }
  234. func WithQueryCallbacks[I any](callbacks *Callbacks[response.InfosData[I]]) Option[I] {
  235. return func(options *Options[I]) {
  236. options.queryCallbacks = callbacks
  237. }
  238. }
  239. func WithQueryMiddlewares[I any](middlewares []api.Handler) Option[I] {
  240. return func(options *Options[I]) {
  241. options.queryMiddlewares = middlewares
  242. }
  243. }
  244. func WithDisableQueryByID[I any]() Option[I] {
  245. return func(options *Options[I]) {
  246. options.disableQueryByID = true
  247. }
  248. }
  249. func WithGetByIDCallbacks[I any](callbacks *Callbacks[I]) Option[I] {
  250. return func(options *Options[I]) {
  251. options.getByIDCallbacks = callbacks
  252. }
  253. }
  254. func WithGetByIDMiddlewares[I any](middlewares []api.Handler) Option[I] {
  255. return func(options *Options[I]) {
  256. options.getByIDMiddlewares = middlewares
  257. }
  258. }