simple.go 9.3 KB

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