simple.go 9.4 KB

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