simple_bind_item.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. package binding
  2. import (
  3. "git.sxidc.com/go-framework/baize/framework/core/api"
  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/infrastructure"
  8. "net/http"
  9. )
  10. // PostBind 进行POST绑定,创建POST API并完成接口逻辑编写
  11. // 类型参数:
  12. // - O: 响应数据类型,对应response.SendResponseFunc的data的类型
  13. // 参数:
  14. // - binder: 用来执行绑定的binder
  15. // - item: 执行绑定的参数
  16. // - middlewares: 该绑定的中间件
  17. func PostBind[O any](binder *Binder, item *SimpleBindItem[O], middlewares ...Middleware) {
  18. item.bind(binder, http.MethodPost, middlewares...)
  19. }
  20. // DeleteBind 进行DELETE绑定,创建DELETE API并完成接口逻辑编写
  21. // 类型参数:
  22. // - O: 响应数据类型,对应response.SendResponseFunc的data的类型
  23. // 参数:
  24. // - binder: 用来执行绑定的binder
  25. // - item: 执行绑定的参数
  26. // - middlewares: 该绑定的中间件
  27. func DeleteBind[O any](binder *Binder, item *SimpleBindItem[O], middlewares ...Middleware) {
  28. item.bind(binder, http.MethodDelete, middlewares...)
  29. }
  30. // PutBind 进行PUT绑定,创建PUT API并完成接口逻辑编写
  31. // 类型参数:
  32. // - O: 响应数据类型,对应response.SendResponseFunc的data的类型
  33. // 参数:
  34. // - binder: 用来执行绑定的binder
  35. // - item: 执行绑定的参数
  36. // - middlewares: 该绑定的中间件
  37. // 返回值: 无
  38. func PutBind[O any](binder *Binder, item *SimpleBindItem[O], middlewares ...Middleware) {
  39. item.bind(binder, http.MethodPut, middlewares...)
  40. }
  41. // GetBind 进行GET绑定,创建GET API并完成接口逻辑编写
  42. // 类型参数:
  43. // - O: 响应数据类型,对应response.SendResponseFunc的data的类型
  44. // 参数:
  45. // - binder: 用来执行绑定的binder
  46. // - item: 执行绑定的参数
  47. // - middlewares: 该绑定的中间件
  48. // 返回值: 无
  49. func GetBind[O any](binder *Binder, item *SimpleBindItem[O], middlewares ...Middleware) {
  50. item.bind(binder, http.MethodGet, middlewares...)
  51. }
  52. // FormDomainObjectsFunc 构造领域对象函数类型
  53. // 参数:
  54. // - c: 上下文
  55. // - params: 请求参数
  56. // 返回值:
  57. // - 基于请求参数构造的领域对象,回传到ServiceFunc的objects参数
  58. // - 错误
  59. type FormDomainObjectsFunc func(c *api.Context, params request.Params) ([]domain.Object, error)
  60. // ServiceFunc 服务函数(业务逻辑函数)
  61. // 类型参数:
  62. // - O: 响应数据类型,对应response.SendResponseFunc的data的类型
  63. // 参数:
  64. // - c: 上下文
  65. // - params: 请求参数
  66. // - objects: 基于请求参数构造出的领域对象
  67. // - i: 基础设施
  68. // 返回值:
  69. // - 响应数据
  70. // - 错误
  71. type ServiceFunc[O any] func(c *api.Context, params request.Params, objects []domain.Object, i *infrastructure.Infrastructure) (O, error)
  72. // SimpleBindItem 简化的BindItem
  73. type SimpleBindItem[O any] struct {
  74. // URL相对路径
  75. Path string
  76. // 响应泛型函数,如果不响应,需要使用NoResponse零值占位
  77. SendResponseFunc response.SendResponseFunc[O]
  78. // 使用的请求参数,非必传,当请求参数为nil时,说明该接口没有参数
  79. RequestParams request.Params
  80. // 可选的请求参数绑定函数
  81. // 非必传,POST和PUT请求默认为JsonBody,DELETE和GET默认为QueryParams
  82. // 额外还提供了一些转化函数:
  83. // BindPathParams: 绑定路径参数
  84. // BindMultipartForm: 绑定multipart form
  85. // BindFormBody: 绑定form body
  86. // XMLBody: 绑定XML body
  87. BindRequestParamsFunc request.BindRequestParamsFunc
  88. // 通过请求参数构造使用的领域对象,之后在ServiceFunc中会按照构造实体的顺序进行回调
  89. // 非必传,如果该字段为nil,则说明没有领域对象
  90. // 与Objects字段二选一使用,如果都指定,会按照该字段处理
  91. FormDomainObjectsFunc FormDomainObjectsFunc
  92. // 使用的领域对象,当使用Tag对实体进行标注后,可以直接通过该字段给定实体,之后在ServiceFunc中会按照给定实体的顺序进行回调
  93. // 非必传,如果为nil或长度为0,则说明没有领域对象
  94. // 与FormObjectsFunc字段二选一使用,如果都指定,会按照FormObjectsFunc字段处理
  95. Objects []domain.Object
  96. // 应用服务泛型函数
  97. ServiceFunc ServiceFunc[O]
  98. }
  99. func (item *SimpleBindItem[O]) bind(binder *Binder, method string, middlewares ...Middleware) {
  100. bindingItem := &BindItem[O]{
  101. Method: method,
  102. SimpleBindItem: item,
  103. }
  104. bindingItem.bind(binder, middlewares...)
  105. }