simple.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437
  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. globalOptions *GlobalOptions
  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. globalOptions := simple.globalOptions
  36. createOptions := simple.createOptions
  37. deleteOptions := simple.deleteOptions
  38. updateOptions := simple.updateOptions
  39. queryOptions := simple.queryOptions
  40. getByIDOptions := simple.getByIDOptions
  41. tableName := domain.TableName(simple.Schema, simple.Entity)
  42. domainPath := domain.RelativeDomainPath(simple.Entity)
  43. // 创建
  44. if !createOptions.disable {
  45. createMiddlewares := append(globalOptions.middlewares, createOptions.middlewares...)
  46. if !createOptions.needTx {
  47. binding.PostBind[string](binder, &binding.SimpleBindItem[string]{
  48. Path: domainPath + "/create",
  49. SendResponseFunc: response.SendIDResponse,
  50. RequestParams: simple.CreateJsonBody,
  51. Objects: []domain.Object{simple.Entity},
  52. ServiceFunc: Create(tableName, createOptions.needCreateUserID, createOptions.callbacks),
  53. }, createMiddlewares...)
  54. } else {
  55. binding.PostBind(binder, &binding.SimpleBindItem[string]{
  56. Path: domainPath + "/create",
  57. SendResponseFunc: response.SendIDResponse,
  58. RequestParams: simple.CreateJsonBody,
  59. Objects: []domain.Object{simple.Entity},
  60. ServiceFunc: CreateTx(tableName, createOptions.needCreateUserID, createOptions.callbacks),
  61. }, createMiddlewares...)
  62. }
  63. }
  64. // 删除
  65. if !deleteOptions.disable {
  66. deleteMiddlewares := append(globalOptions.middlewares, deleteOptions.middlewares...)
  67. if !deleteOptions.needTx {
  68. binding.DeleteBind(binder, &binding.SimpleBindItem[any]{
  69. Path: domainPath + "/delete",
  70. SendResponseFunc: response.SendMsgResponse,
  71. RequestParams: simple.DeleteQueryParams,
  72. Objects: []domain.Object{simple.Entity},
  73. ServiceFunc: Delete(tableName, deleteOptions.callbacks),
  74. }, deleteMiddlewares...)
  75. } else {
  76. binding.DeleteBind(binder, &binding.SimpleBindItem[any]{
  77. Path: domainPath + "/delete",
  78. SendResponseFunc: response.SendMsgResponse,
  79. RequestParams: simple.DeleteQueryParams,
  80. Objects: []domain.Object{simple.Entity},
  81. ServiceFunc: DeleteTx(tableName, deleteOptions.callbacks),
  82. }, deleteMiddlewares...)
  83. }
  84. }
  85. // 修改
  86. if !updateOptions.disable {
  87. updateMiddlewares := append(globalOptions.middlewares, updateOptions.middlewares...)
  88. if !updateOptions.needTx {
  89. binding.PutBind(binder, &binding.SimpleBindItem[any]{
  90. Path: domainPath + "/update",
  91. SendResponseFunc: response.SendMsgResponse,
  92. RequestParams: simple.UpdateJsonBody,
  93. Objects: []domain.Object{simple.Entity},
  94. ServiceFunc: Update(tableName, updateOptions.needLastUpdateUserID, updateOptions.callbacks),
  95. }, updateMiddlewares...)
  96. } else {
  97. binding.PutBind(binder, &binding.SimpleBindItem[any]{
  98. Path: domainPath + "/update",
  99. SendResponseFunc: response.SendMsgResponse,
  100. RequestParams: simple.UpdateJsonBody,
  101. Objects: []domain.Object{simple.Entity},
  102. ServiceFunc: UpdateTx(tableName, updateOptions.needLastUpdateUserID, updateOptions.callbacks),
  103. }, updateMiddlewares...)
  104. }
  105. }
  106. // 查询
  107. if !queryOptions.disable {
  108. queryMiddlewares := append(globalOptions.middlewares, queryOptions.middlewares...)
  109. binding.GetBind(binder, &binding.SimpleBindItem[response.InfosData[I]]{
  110. Path: domainPath + "/query",
  111. SendResponseFunc: response.SendInfosResponse[I],
  112. RequestParams: simple.QueryQueryParams,
  113. Objects: []domain.Object{simple.Entity},
  114. ServiceFunc: Query[I](tableName, queryOptions.orderBy, queryOptions.stringFieldQueryCondition,
  115. queryOptions.customStringFieldQueryCondition, queryOptions.callbacks, queryOptions.conditionFieldCallback),
  116. }, queryMiddlewares...)
  117. }
  118. // 通过ID获取
  119. if !getByIDOptions.disable {
  120. getByIDMiddlewares := append(globalOptions.middlewares, getByIDOptions.middlewares...)
  121. binding.GetBind(binder, &binding.SimpleBindItem[I]{
  122. Path: domainPath + "/get",
  123. SendResponseFunc: response.SendInfoResponse[I],
  124. RequestParams: simple.GetByIDQueryParams,
  125. Objects: []domain.Object{simple.Entity},
  126. ServiceFunc: GetByID[I](tableName, getByIDOptions.callbacks),
  127. }, getByIDMiddlewares...)
  128. }
  129. }
  130. func BindSimple[I any](binder *binding.Binder, simple *Simple[I], opts ...any) {
  131. globalOptions := new(GlobalOptions)
  132. createOptions := new(CreateOptions)
  133. deleteOptions := new(DeleteOptions)
  134. updateOptions := new(UpdateOptions)
  135. queryOptions := new(QueryOptions[I])
  136. getByIDOptions := new(GetByIDOptions[I])
  137. for _, opt := range opts {
  138. switch o := opt.(type) {
  139. case GlobalOption:
  140. o(globalOptions)
  141. case CreateOption:
  142. o(createOptions)
  143. case DeleteOption:
  144. o(deleteOptions)
  145. case UpdateOption:
  146. o(updateOptions)
  147. case QueryOption[I]:
  148. o(queryOptions)
  149. case GetByIDOption[I]:
  150. o(getByIDOptions)
  151. default:
  152. continue
  153. }
  154. }
  155. simple.globalOptions = globalOptions
  156. simple.createOptions = createOptions
  157. simple.deleteOptions = deleteOptions
  158. simple.updateOptions = updateOptions
  159. simple.queryOptions = queryOptions
  160. simple.getByIDOptions = getByIDOptions
  161. simple.bind(binder)
  162. }
  163. type GlobalOption func(options *GlobalOptions)
  164. type CreateOption func(options *CreateOptions)
  165. type DeleteOption func(options *DeleteOptions)
  166. type UpdateOption func(options *UpdateOptions)
  167. type QueryOption[I any] func(options *QueryOptions[I])
  168. type GetByIDOption[I any] func(options *GetByIDOptions[I])
  169. type GlobalOptions struct {
  170. middlewares []binding.Middleware
  171. }
  172. type CreateOptions struct {
  173. // 关闭创建
  174. disable bool
  175. // 创建是否使用事务
  176. needTx bool
  177. // 创建需要创建用户ID
  178. needCreateUserID bool
  179. // 创建回调
  180. callbacks *CreateCallbacks
  181. // 创建中间件
  182. middlewares []binding.Middleware
  183. }
  184. type DeleteOptions struct {
  185. // 关闭删除
  186. disable bool
  187. // 删除是否使用事务
  188. needTx bool
  189. // 删除回调
  190. callbacks *DeleteCallbacks
  191. // 删除中间件
  192. middlewares []binding.Middleware
  193. }
  194. type UpdateOptions struct {
  195. // 关闭更新
  196. disable bool
  197. // 更新是否使用事务
  198. needTx bool
  199. // 更新需要最新更新用户ID
  200. needLastUpdateUserID bool
  201. // 更新回调
  202. callbacks *UpdateCallbacks
  203. // 更新中间件
  204. middlewares []binding.Middleware
  205. }
  206. const (
  207. StringFieldQueryConditionEqual = "equal"
  208. StringFieldQueryConditionTrimSpaceEqual = "trim-space-equal"
  209. StringFieldQueryConditionLike = "like"
  210. StringFieldQueryConditionTrimSpaceLike = "trim-space-like"
  211. )
  212. type QueryOptions[I any] struct {
  213. // 关闭查询
  214. disable bool
  215. // 查询条件构造回调
  216. conditionFieldCallback ConditionFieldCallback
  217. // 查询回调
  218. callbacks *QueryCallbacks[I]
  219. // 查询中间件
  220. middlewares []binding.Middleware
  221. // OrderBy
  222. orderBy string
  223. // 字符串类型字段使用的查询条件
  224. stringFieldQueryCondition string
  225. // 自定义字符串类型字段使用的查询条件,会覆盖stringFieldQueryCondition的设置
  226. customStringFieldQueryCondition map[string]string
  227. }
  228. type GetByIDOptions[I any] struct {
  229. // 关闭根据ID查询
  230. disable bool
  231. // 根据ID查询回调
  232. callbacks *GetByIDCallbacks[I]
  233. // 根据ID查询中间件
  234. middlewares []binding.Middleware
  235. }
  236. func WithGlobalMiddlewares(middlewares ...binding.Middleware) GlobalOption {
  237. return func(options *GlobalOptions) {
  238. options.middlewares = middlewares
  239. }
  240. }
  241. func WithDisableCreate() CreateOption {
  242. return func(options *CreateOptions) {
  243. options.disable = true
  244. }
  245. }
  246. func WithCreateTx() CreateOption {
  247. return func(options *CreateOptions) {
  248. options.needTx = true
  249. }
  250. }
  251. func WithCreateUserID() CreateOption {
  252. return func(options *CreateOptions) {
  253. options.needCreateUserID = true
  254. }
  255. }
  256. func WithCreateCallbacks(callbacks *CreateCallbacks) CreateOption {
  257. return func(options *CreateOptions) {
  258. options.callbacks = callbacks
  259. }
  260. }
  261. func WithCreateMiddlewares(middlewares ...binding.Middleware) CreateOption {
  262. return func(options *CreateOptions) {
  263. options.middlewares = middlewares
  264. }
  265. }
  266. func WithDisableDelete() DeleteOption {
  267. return func(options *DeleteOptions) {
  268. options.disable = true
  269. }
  270. }
  271. func WithDeleteTx() DeleteOption {
  272. return func(options *DeleteOptions) {
  273. options.needTx = true
  274. }
  275. }
  276. func WithDeleteCallbacks(callbacks *DeleteCallbacks) DeleteOption {
  277. return func(options *DeleteOptions) {
  278. options.callbacks = callbacks
  279. }
  280. }
  281. func WithDeleteMiddlewares(middlewares ...binding.Middleware) DeleteOption {
  282. return func(options *DeleteOptions) {
  283. options.middlewares = middlewares
  284. }
  285. }
  286. func WithDisableUpdate() UpdateOption {
  287. return func(options *UpdateOptions) {
  288. options.disable = true
  289. }
  290. }
  291. func WithUpdateTx() UpdateOption {
  292. return func(options *UpdateOptions) {
  293. options.needTx = true
  294. }
  295. }
  296. func WithLastUpdateUserID() UpdateOption {
  297. return func(options *UpdateOptions) {
  298. options.needLastUpdateUserID = true
  299. }
  300. }
  301. func WithUpdateCallbacks(callbacks *UpdateCallbacks) UpdateOption {
  302. return func(options *UpdateOptions) {
  303. options.callbacks = callbacks
  304. }
  305. }
  306. func WithUpdateMiddlewares(middlewares ...binding.Middleware) UpdateOption {
  307. return func(options *UpdateOptions) {
  308. options.middlewares = middlewares
  309. }
  310. }
  311. func WithDisableQuery[I any]() QueryOption[I] {
  312. return func(options *QueryOptions[I]) {
  313. options.disable = true
  314. }
  315. }
  316. func WithQueryConditionFieldCallback[I any](callback ConditionFieldCallback) QueryOption[I] {
  317. return func(options *QueryOptions[I]) {
  318. options.conditionFieldCallback = callback
  319. }
  320. }
  321. func WithQueryCallbacks[I any](callbacks *QueryCallbacks[I]) QueryOption[I] {
  322. return func(options *QueryOptions[I]) {
  323. options.callbacks = callbacks
  324. }
  325. }
  326. func WithQueryMiddlewares[I any](middlewares ...binding.Middleware) QueryOption[I] {
  327. return func(options *QueryOptions[I]) {
  328. options.middlewares = middlewares
  329. }
  330. }
  331. func WithQueryOrderBy[I any](orderBy string) QueryOption[I] {
  332. return func(options *QueryOptions[I]) {
  333. options.orderBy = orderBy
  334. }
  335. }
  336. func WithQueryStringFieldQueryCondition[I any](queryCondition string) QueryOption[I] {
  337. return func(options *QueryOptions[I]) {
  338. options.stringFieldQueryCondition = queryCondition
  339. }
  340. }
  341. func WithQueryCustomStringFieldQueryCondition[I any](customStringFieldQueryCondition map[string]string) QueryOption[I] {
  342. return func(options *QueryOptions[I]) {
  343. options.customStringFieldQueryCondition = customStringFieldQueryCondition
  344. }
  345. }
  346. func WithDisableGetByID[I any]() GetByIDOption[I] {
  347. return func(options *GetByIDOptions[I]) {
  348. options.disable = true
  349. }
  350. }
  351. func WithGetByIDCallbacks[I any](callbacks *GetByIDCallbacks[I]) GetByIDOption[I] {
  352. return func(options *GetByIDOptions[I]) {
  353. options.callbacks = callbacks
  354. }
  355. }
  356. func WithGetByIDMiddlewares[I any](middlewares ...binding.Middleware) GetByIDOption[I] {
  357. return func(options *GetByIDOptions[I]) {
  358. options.middlewares = middlewares
  359. }
  360. }