crud.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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 CRUD(builder *gateway.Builder, params *CRUDParams, opts ...any) {
  10. createOptions := new(CRUDCreateOptions)
  11. deleteOptions := new(CRUDDeleteOptions)
  12. updateOptions := new(CRUDUpdateOptions)
  13. queryOptions := new(CRUDQueryOptions)
  14. getByIDOptions := new(CRUDGetByIDOptions)
  15. for _, opt := range opts {
  16. switch o := opt.(type) {
  17. case CRUDCreateOption:
  18. o(createOptions)
  19. case CRUDDeleteOption:
  20. o(deleteOptions)
  21. case CRUDUpdateOption:
  22. o(updateOptions)
  23. case CRUDQueryOption:
  24. o(queryOptions)
  25. case CRUDGetByIDOption:
  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 CRUDParams struct {
  39. // 除去后缀的服务URL,如http://localhost:8080/example/api/v1
  40. ServiceVersionedUrl string
  41. // 领域名称
  42. DomainCamelName string
  43. // 可选配置项,通过WithXXX配置
  44. createOptions *CRUDCreateOptions
  45. deleteOptions *CRUDDeleteOptions
  46. updateOptions *CRUDUpdateOptions
  47. queryOptions *CRUDQueryOptions
  48. getByIDOptions *CRUDGetByIDOptions
  49. }
  50. func (params *CRUDParams) 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. newBody, err := gateway.AddJsonBodyTenantIDAndUserID(c, "tenantId", "createUserId")
  63. if err != nil {
  64. return nil, err
  65. }
  66. return &gateway.PostRequest{
  67. Url: params.ServiceVersionedUrl + domainPath + "/create",
  68. Body: newBody,
  69. }, nil
  70. }, createOptions.requestResponseCallback).
  71. Build(createOptions.middlewares...)
  72. }
  73. // 删除
  74. if !deleteOptions.disable {
  75. builder.
  76. Url(http.MethodDelete, domainPath+"/delete").
  77. Delete(&gateway.DeleteRequest{
  78. Url: params.ServiceVersionedUrl + domainPath + "/delete",
  79. }, deleteOptions.requestResponseCallback).
  80. Build(deleteOptions.middlewares...)
  81. }
  82. // 修改
  83. if !updateOptions.disable {
  84. builder.
  85. Url(http.MethodPut, domainPath+"/update").
  86. Request(func(c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (gateway.BuilderRequest, error) {
  87. newBody, err := gateway.AddJsonBodyTenantIDAndUserID(c, "", "updateUserId")
  88. if err != nil {
  89. return nil, err
  90. }
  91. return &gateway.PutRequest{
  92. Url: params.ServiceVersionedUrl + domainPath + "/update",
  93. Body: newBody,
  94. }, nil
  95. }, updateOptions.requestResponseCallback).
  96. Build(updateOptions.middlewares...)
  97. }
  98. // 查询
  99. if !queryOptions.disable {
  100. builder.
  101. Url(http.MethodGet, domainPath+"/query").
  102. Request(func(c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (gateway.BuilderRequest, error) {
  103. newQueryParams, err := gateway.AddQueryParamsTenantIDAndUserID(c, "tenantId", "")
  104. if err != nil {
  105. return nil, err
  106. }
  107. return &gateway.GetRequest{
  108. Url: params.ServiceVersionedUrl + domainPath + "/query",
  109. QueryParams: newQueryParams,
  110. }, nil
  111. }, updateOptions.requestResponseCallback).
  112. Build(queryOptions.middlewares...)
  113. }
  114. // 通过ID获取
  115. if !getByIDOptions.disable {
  116. builder.
  117. Url(http.MethodGet, domainPath+"/get").
  118. Get(&gateway.GetRequest{
  119. Url: params.ServiceVersionedUrl + domainPath + "/get",
  120. }, getByIDOptions.requestResponseCallback).
  121. Build(getByIDOptions.middlewares...)
  122. }
  123. }
  124. type CRUDCreateOption func(options *CRUDCreateOptions)
  125. type CRUDDeleteOption func(options *CRUDDeleteOptions)
  126. type CRUDUpdateOption func(options *CRUDUpdateOptions)
  127. type CRUDQueryOption func(options *CRUDQueryOptions)
  128. type CRUDGetByIDOption func(options *CRUDGetByIDOptions)
  129. type CRUDCreateOptions struct {
  130. // 关闭创建
  131. disable bool
  132. // 创建请求响应回调
  133. requestResponseCallback gateway.RequestResponseCallback
  134. // 创建中间件
  135. middlewares []api.Handler
  136. }
  137. type CRUDDeleteOptions struct {
  138. // 关闭删除
  139. disable bool
  140. // 删除请求响应回调
  141. requestResponseCallback gateway.RequestResponseCallback
  142. // 删除中间件
  143. middlewares []api.Handler
  144. }
  145. type CRUDUpdateOptions struct {
  146. // 关闭更新
  147. disable bool
  148. // 更新请求响应回调
  149. requestResponseCallback gateway.RequestResponseCallback
  150. // 更新中间件
  151. middlewares []api.Handler
  152. }
  153. type CRUDQueryOptions struct {
  154. // 关闭查询
  155. disable bool
  156. // 查询请求响应回调
  157. requestResponseCallback gateway.RequestResponseCallback
  158. // 查询中间件
  159. middlewares []api.Handler
  160. }
  161. type CRUDGetByIDOptions struct {
  162. // 关闭根据ID查询
  163. disable bool
  164. // 根据ID请求响应回调
  165. requestResponseCallback gateway.RequestResponseCallback
  166. // 根据ID查询中间件
  167. middlewares []api.Handler
  168. }
  169. func WithCRUDCreateCallbacks(callbacks gateway.RequestResponseCallback) CRUDCreateOption {
  170. return func(options *CRUDCreateOptions) {
  171. options.requestResponseCallback = callbacks
  172. }
  173. }
  174. func WithCRUDCreateMiddlewares(middlewares []api.Handler) CRUDCreateOption {
  175. return func(options *CRUDCreateOptions) {
  176. options.middlewares = middlewares
  177. }
  178. }
  179. func WithCRUDDisableDelete() CRUDDeleteOption {
  180. return func(options *CRUDDeleteOptions) {
  181. options.disable = true
  182. }
  183. }
  184. func WithCRUDDeleteCallbacks(callbacks gateway.RequestResponseCallback) CRUDDeleteOption {
  185. return func(options *CRUDDeleteOptions) {
  186. options.requestResponseCallback = callbacks
  187. }
  188. }
  189. func WithCRUDDeleteMiddlewares(middlewares []api.Handler) CRUDDeleteOption {
  190. return func(options *CRUDDeleteOptions) {
  191. options.middlewares = middlewares
  192. }
  193. }
  194. func WithCRUDDisableUpdate() CRUDUpdateOption {
  195. return func(options *CRUDUpdateOptions) {
  196. options.disable = true
  197. }
  198. }
  199. func WithCRUDUpdateCallbacks(callbacks gateway.RequestResponseCallback) CRUDUpdateOption {
  200. return func(options *CRUDUpdateOptions) {
  201. options.requestResponseCallback = callbacks
  202. }
  203. }
  204. func WithCRUDUpdateMiddlewares(middlewares []api.Handler) CRUDUpdateOption {
  205. return func(options *CRUDUpdateOptions) {
  206. options.middlewares = middlewares
  207. }
  208. }
  209. func WithCRUDDisableQuery() CRUDQueryOption {
  210. return func(options *CRUDQueryOptions) {
  211. options.disable = true
  212. }
  213. }
  214. func WithCRUDQueryCallbacks(callbacks gateway.RequestResponseCallback) CRUDQueryOption {
  215. return func(options *CRUDQueryOptions) {
  216. options.requestResponseCallback = callbacks
  217. }
  218. }
  219. func WithCRUDQueryMiddlewares(middlewares []api.Handler) CRUDQueryOption {
  220. return func(options *CRUDQueryOptions) {
  221. options.middlewares = middlewares
  222. }
  223. }
  224. func WithCRUDDisableGetByID() CRUDGetByIDOption {
  225. return func(options *CRUDGetByIDOptions) {
  226. options.disable = true
  227. }
  228. }
  229. func WithCRUDGetByIDCallbacks(callbacks gateway.RequestResponseCallback) CRUDGetByIDOption {
  230. return func(options *CRUDGetByIDOptions) {
  231. options.requestResponseCallback = callbacks
  232. }
  233. }
  234. func WithCRUDGetByIDMiddlewares(middlewares []api.Handler) CRUDGetByIDOption {
  235. return func(options *CRUDGetByIDOptions) {
  236. options.middlewares = middlewares
  237. }
  238. }