simple.go 11 KB

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