entity_crud.go 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. package gwtools
  2. import (
  3. "git.sxidc.com/go-framework/baize/framework/core/api"
  4. "git.sxidc.com/go-framework/baize/framework/gateway"
  5. "git.sxidc.com/go-tools/utils/template"
  6. "github.com/iancoleman/strcase"
  7. "net/http"
  8. )
  9. func EntityCRUD(builder *gateway.Builder, params *EntityCRUDParams, opts ...any) {
  10. createOptions := new(EntityCRUDCreateOptions)
  11. deleteOptions := new(EntityCRUDDeleteOptions)
  12. updateOptions := new(EntityCRUDUpdateOptions)
  13. queryOptions := new(EntityCRUDQueryOptions)
  14. getByIDOptions := new(EntityCRUDGetByIDOptions)
  15. for _, opt := range opts {
  16. switch o := opt.(type) {
  17. case EntityCRUDCreateOption:
  18. o(createOptions)
  19. case EntityCRUDDeleteOption:
  20. o(deleteOptions)
  21. case EntityCRUDUpdateOption:
  22. o(updateOptions)
  23. case EntityCRUDQueryOption:
  24. o(queryOptions)
  25. case EntityCRUDGetByIDOption:
  26. o(getByIDOptions)
  27. default:
  28. continue
  29. }
  30. }
  31. params.createOptions = createOptions
  32. params.deleteOptions = deleteOptions
  33. params.updateOptions = updateOptions
  34. params.queryOptions = queryOptions
  35. params.getByIDOptions = getByIDOptions
  36. params.crud(builder)
  37. }
  38. type EntityCRUDParams struct {
  39. // 除去后缀的服务URL,如http://localhost:8080/example/api/v1
  40. ServiceVersionedUrl string
  41. // 领域名称
  42. DomainCamelName string
  43. // 可选配置项,通过WithXXX配置
  44. createOptions *EntityCRUDCreateOptions
  45. deleteOptions *EntityCRUDDeleteOptions
  46. updateOptions *EntityCRUDUpdateOptions
  47. queryOptions *EntityCRUDQueryOptions
  48. getByIDOptions *EntityCRUDGetByIDOptions
  49. }
  50. func (params *EntityCRUDParams) crud(builder *gateway.Builder) {
  51. createOptions := params.createOptions
  52. deleteOptions := params.deleteOptions
  53. updateOptions := params.updateOptions
  54. queryOptions := params.queryOptions
  55. getByIDOptions := params.getByIDOptions
  56. domainPath := "/" + strcase.ToLowerCamel(template.Id(params.DomainCamelName))
  57. // 创建
  58. if !createOptions.disable {
  59. builder.
  60. Url(http.MethodPost, domainPath+"/create").
  61. Request(func(c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (gateway.BuilderRequest, error) {
  62. err := gateway.AddJsonBodyTenantIDAndUserID(c, "tenantId", "createUserId")
  63. if err != nil {
  64. return nil, err
  65. }
  66. jsonBody, err := c.GetJsonBody()
  67. if err != nil {
  68. return nil, err
  69. }
  70. return &gateway.PostRequest{
  71. Url: params.ServiceVersionedUrl + domainPath + "/create",
  72. Body: jsonBody.Map(),
  73. }, nil
  74. }, createOptions.requestResponseCallback).
  75. Build(createOptions.middlewares...)
  76. }
  77. // 删除
  78. if !deleteOptions.disable {
  79. builder.
  80. Url(http.MethodDelete, domainPath+"/delete").
  81. Delete(&gateway.DeleteRequest{
  82. Url: params.ServiceVersionedUrl + domainPath + "/delete",
  83. }, deleteOptions.requestResponseCallback).
  84. Build(deleteOptions.middlewares...)
  85. }
  86. // 修改
  87. if !updateOptions.disable {
  88. builder.
  89. Url(http.MethodPut, domainPath+"/update").
  90. Request(func(c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (gateway.BuilderRequest, error) {
  91. err := gateway.AddJsonBodyTenantIDAndUserID(c, "", "updateUserId")
  92. if err != nil {
  93. return nil, err
  94. }
  95. jsonBody, err := c.GetJsonBody()
  96. if err != nil {
  97. return nil, err
  98. }
  99. return &gateway.PutRequest{
  100. Url: params.ServiceVersionedUrl + domainPath + "/update",
  101. Body: jsonBody.Map(),
  102. }, nil
  103. }, updateOptions.requestResponseCallback).
  104. Build(updateOptions.middlewares...)
  105. }
  106. // 查询
  107. if !queryOptions.disable {
  108. builder.
  109. Url(http.MethodGet, domainPath+"/query").
  110. Request(func(c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (gateway.BuilderRequest, error) {
  111. err := gateway.AddQueryParamsTenantIDAndUserID(c, "tenantId", "")
  112. if err != nil {
  113. return nil, err
  114. }
  115. return &gateway.GetRequest{
  116. Url: params.ServiceVersionedUrl + domainPath + "/query",
  117. QueryParams: c.GetQueryParams().Map(),
  118. }, nil
  119. }, queryOptions.requestResponseCallback).
  120. Build(queryOptions.middlewares...)
  121. }
  122. // 通过ID获取
  123. if !getByIDOptions.disable {
  124. builder.
  125. Url(http.MethodGet, domainPath+"/get").
  126. Get(&gateway.GetRequest{
  127. Url: params.ServiceVersionedUrl + domainPath + "/get",
  128. }, getByIDOptions.requestResponseCallback).
  129. Build(getByIDOptions.middlewares...)
  130. }
  131. }
  132. type EntityCRUDCreateOption func(options *EntityCRUDCreateOptions)
  133. type EntityCRUDDeleteOption func(options *EntityCRUDDeleteOptions)
  134. type EntityCRUDUpdateOption func(options *EntityCRUDUpdateOptions)
  135. type EntityCRUDQueryOption func(options *EntityCRUDQueryOptions)
  136. type EntityCRUDGetByIDOption func(options *EntityCRUDGetByIDOptions)
  137. type EntityCRUDCreateOptions struct {
  138. // 关闭创建
  139. disable bool
  140. // 创建请求响应回调
  141. requestResponseCallback gateway.RequestResponseCallback
  142. // 创建中间件
  143. middlewares []api.Handler
  144. }
  145. type EntityCRUDDeleteOptions struct {
  146. // 关闭删除
  147. disable bool
  148. // 删除请求响应回调
  149. requestResponseCallback gateway.RequestResponseCallback
  150. // 删除中间件
  151. middlewares []api.Handler
  152. }
  153. type EntityCRUDUpdateOptions struct {
  154. // 关闭更新
  155. disable bool
  156. // 更新请求响应回调
  157. requestResponseCallback gateway.RequestResponseCallback
  158. // 更新中间件
  159. middlewares []api.Handler
  160. }
  161. type EntityCRUDQueryOptions struct {
  162. // 关闭查询
  163. disable bool
  164. // 查询请求响应回调
  165. requestResponseCallback gateway.RequestResponseCallback
  166. // 查询中间件
  167. middlewares []api.Handler
  168. }
  169. type EntityCRUDGetByIDOptions struct {
  170. // 关闭根据ID查询
  171. disable bool
  172. // 根据ID请求响应回调
  173. requestResponseCallback gateway.RequestResponseCallback
  174. // 根据ID查询中间件
  175. middlewares []api.Handler
  176. }
  177. func WithEntityCRUDCreateCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDCreateOption {
  178. return func(options *EntityCRUDCreateOptions) {
  179. options.requestResponseCallback = callbacks
  180. }
  181. }
  182. func WithEntityCRUDCreateMiddlewares(middlewares []api.Handler) EntityCRUDCreateOption {
  183. return func(options *EntityCRUDCreateOptions) {
  184. options.middlewares = middlewares
  185. }
  186. }
  187. func WithEntityCRUDDisableDelete() EntityCRUDDeleteOption {
  188. return func(options *EntityCRUDDeleteOptions) {
  189. options.disable = true
  190. }
  191. }
  192. func WithEntityCRUDDeleteCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDDeleteOption {
  193. return func(options *EntityCRUDDeleteOptions) {
  194. options.requestResponseCallback = callbacks
  195. }
  196. }
  197. func WithEntityCRUDDeleteMiddlewares(middlewares []api.Handler) EntityCRUDDeleteOption {
  198. return func(options *EntityCRUDDeleteOptions) {
  199. options.middlewares = middlewares
  200. }
  201. }
  202. func WithEntityCRUDDisableUpdate() EntityCRUDUpdateOption {
  203. return func(options *EntityCRUDUpdateOptions) {
  204. options.disable = true
  205. }
  206. }
  207. func WithEntityCRUDUpdateCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDUpdateOption {
  208. return func(options *EntityCRUDUpdateOptions) {
  209. options.requestResponseCallback = callbacks
  210. }
  211. }
  212. func WithEntityCRUDUpdateMiddlewares(middlewares []api.Handler) EntityCRUDUpdateOption {
  213. return func(options *EntityCRUDUpdateOptions) {
  214. options.middlewares = middlewares
  215. }
  216. }
  217. func WithEntityCRUDDisableQuery() EntityCRUDQueryOption {
  218. return func(options *EntityCRUDQueryOptions) {
  219. options.disable = true
  220. }
  221. }
  222. func WithEntityCRUDQueryCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDQueryOption {
  223. return func(options *EntityCRUDQueryOptions) {
  224. options.requestResponseCallback = callbacks
  225. }
  226. }
  227. func WithEntityCRUDQueryMiddlewares(middlewares []api.Handler) EntityCRUDQueryOption {
  228. return func(options *EntityCRUDQueryOptions) {
  229. options.middlewares = middlewares
  230. }
  231. }
  232. func WithEntityCRUDDisableGetByID() EntityCRUDGetByIDOption {
  233. return func(options *EntityCRUDGetByIDOptions) {
  234. options.disable = true
  235. }
  236. }
  237. func WithEntityCRUDGetByIDCallbacks(callbacks gateway.RequestResponseCallback) EntityCRUDGetByIDOption {
  238. return func(options *EntityCRUDGetByIDOptions) {
  239. options.requestResponseCallback = callbacks
  240. }
  241. }
  242. func WithEntityCRUDGetByIDMiddlewares(middlewares []api.Handler) EntityCRUDGetByIDOption {
  243. return func(options *EntityCRUDGetByIDOptions) {
  244. options.middlewares = middlewares
  245. }
  246. }