sql_executor.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package sql_executor
  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/strutils"
  6. "github.com/gin-gonic/gin"
  7. "github.com/pkg/errors"
  8. "net/http"
  9. "net/url"
  10. "sync"
  11. )
  12. type Option func(options *Options)
  13. type Options struct {
  14. serviceApiVersion string
  15. globalMiddlewares []api.Handler
  16. executeSqlMiddlewares []api.Handler
  17. sqlExecuteLogMiddlewares []api.Handler
  18. queryRegisteredServicesMiddlewares []api.Handler
  19. }
  20. func WithServiceApiVersion(serviceApiVersion string) Option {
  21. return func(options *Options) {
  22. options.serviceApiVersion = serviceApiVersion
  23. }
  24. }
  25. func WithGlobalMiddlewares(middlewares ...api.Handler) Option {
  26. return func(options *Options) {
  27. options.globalMiddlewares = middlewares
  28. }
  29. }
  30. func WithExecuteSqlMiddlewares(middlewares ...api.Handler) Option {
  31. return func(options *Options) {
  32. options.executeSqlMiddlewares = middlewares
  33. }
  34. }
  35. func WithSqlExecuteLogMiddlewares(middlewares ...api.Handler) Option {
  36. return func(options *Options) {
  37. options.sqlExecuteLogMiddlewares = middlewares
  38. }
  39. }
  40. func WithQueryRegisteredServicesMiddlewares(middlewares ...api.Handler) Option {
  41. return func(options *Options) {
  42. options.queryRegisteredServicesMiddlewares = middlewares
  43. }
  44. }
  45. var serviceBaseUrlMap sync.Map
  46. func RegisterService(serviceShortName string, baseUrl string) {
  47. serviceBaseUrlMap.Store(serviceShortName, baseUrl)
  48. }
  49. func BuildGateway(gw *gateway.Gateway, opts ...Option) {
  50. options := new(Options)
  51. for _, opt := range opts {
  52. opt(options)
  53. }
  54. executeSqlMiddlewares := append(options.globalMiddlewares, options.executeSqlMiddlewares...)
  55. sqlExecuteLogMiddlewares := append(options.globalMiddlewares, options.sqlExecuteLogMiddlewares...)
  56. queryRegisteredServicesMiddlewares := append(options.globalMiddlewares, options.queryRegisteredServicesMiddlewares...)
  57. builder := gw.NewBuilder(api.RouterPrefix, "")
  58. builder.
  59. Url(http.MethodPost, "/sql/execute").
  60. Post(gateway.NewPostRequest("",
  61. gateway.PostRequestWithUrlTransferFunc(
  62. func(c *api.Context, _ string, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (string, error) {
  63. jsonBody, err := c.GetJsonBody()
  64. if err != nil {
  65. return "", err
  66. }
  67. serviceShortName, ok := jsonBody.Get("serviceShortName").(string)
  68. if !ok {
  69. return "", errors.New("没有传递服务名缩写或服务名缩写不是string类型")
  70. }
  71. jsonBody.Delete("serviceShortName")
  72. serviceBaseUrl, loaded := serviceBaseUrlMap.Load(serviceShortName)
  73. if !loaded {
  74. return "", errors.New("没有注册对应的服务: " + serviceShortName)
  75. }
  76. var serviceUrl string
  77. if strutils.IsStringEmpty(options.serviceApiVersion) {
  78. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", "/sql/execute")
  79. if err != nil {
  80. return "", err
  81. }
  82. serviceUrl = innerServiceUrl
  83. } else {
  84. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", options.serviceApiVersion, "/sql/execute")
  85. if err != nil {
  86. return "", err
  87. }
  88. serviceUrl = innerServiceUrl
  89. }
  90. return serviceUrl, nil
  91. }),
  92. gateway.PostRequestWithBodyForm(
  93. func(c *api.Context, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
  94. err := gateway.AddJsonBodyTenantIDAndUserID(c, "", "executorId")
  95. if err != nil {
  96. return nil, err
  97. }
  98. jsonBody, err := c.GetJsonBody()
  99. if err != nil {
  100. return nil, err
  101. }
  102. userInfo := c.GetUserInfo()
  103. if userInfo == nil {
  104. jsonBody.Set("executorName", "guest")
  105. } else {
  106. jsonBody.Set("executorName", userInfo.GetName)
  107. }
  108. return jsonBody.Map(), nil
  109. })), nil).
  110. Build(executeSqlMiddlewares...)
  111. builder.
  112. Url(http.MethodGet, "/sql/execute/log").
  113. Get(gateway.NewGetRequest("",
  114. gateway.GetRequestWithUrlTransferFunc(
  115. func(c *api.Context, _ string, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (string, error) {
  116. queryParams := c.GetQueryParams()
  117. serviceShortName := queryParams.Get("serviceShortName")
  118. if strutils.IsStringEmpty(serviceShortName) {
  119. return "", errors.New("没有传递服务名缩写")
  120. }
  121. queryParams.Delete("serviceShortName")
  122. serviceBaseUrl, loaded := serviceBaseUrlMap.Load(serviceShortName)
  123. if !loaded {
  124. return "", errors.New("没有注册对应的服务: " + serviceShortName)
  125. }
  126. var serviceUrl string
  127. if strutils.IsStringEmpty(options.serviceApiVersion) {
  128. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", "/sql/execute/log")
  129. if err != nil {
  130. return "", err
  131. }
  132. serviceUrl = innerServiceUrl
  133. } else {
  134. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", options.serviceApiVersion, "/sql/execute/log")
  135. if err != nil {
  136. return "", err
  137. }
  138. serviceUrl = innerServiceUrl
  139. }
  140. return serviceUrl, nil
  141. }),
  142. gateway.GetRequestWithQueryParamsForm(
  143. gateway.FormQueryParamsWithTenantIDAndUserIDFunc("", "executorId")),
  144. ), nil).
  145. Build(sqlExecuteLogMiddlewares...)
  146. // 查询注册的服务
  147. builder.
  148. Url(http.MethodGet, "/sql/execute/registered/services").
  149. Local(func(c *api.Context) {
  150. serviceShortNames := make([]string, 0)
  151. serviceBaseUrlMap.Range(func(key any, value any) bool {
  152. serviceShortNames = append(serviceShortNames, key.(string))
  153. return true
  154. })
  155. c.JSON(http.StatusOK, gin.H{
  156. "services": serviceShortNames,
  157. })
  158. }, queryRegisteredServicesMiddlewares...)
  159. }