sql_executor.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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.PostRequest{
  61. UrlFormFunc: func(c *api.Context, _ string, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (string, error) {
  62. jsonBody, err := c.GetJsonBody()
  63. if err != nil {
  64. return "", err
  65. }
  66. serviceShortName, ok := jsonBody.Get("serviceShortName").(string)
  67. if !ok {
  68. return "", errors.New("没有传递服务名缩写或服务名缩写不是string类型")
  69. }
  70. jsonBody.Delete("serviceShortName")
  71. serviceBaseUrl, loaded := serviceBaseUrlMap.Load(serviceShortName)
  72. if !loaded {
  73. return "", errors.New("没有注册对应的服务: " + serviceShortName)
  74. }
  75. var serviceUrl string
  76. if strutils.IsStringEmpty(options.serviceApiVersion) {
  77. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", "/sql/execute")
  78. if err != nil {
  79. return "", err
  80. }
  81. serviceUrl = innerServiceUrl
  82. } else {
  83. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", options.serviceApiVersion, "/sql/execute")
  84. if err != nil {
  85. return "", err
  86. }
  87. serviceUrl = innerServiceUrl
  88. }
  89. return serviceUrl, nil
  90. },
  91. BodyFormFunc: func(c *api.Context, _ any, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (any, error) {
  92. err := gateway.AddJsonBodyTenantIDAndUserID(c, "", "executorId")
  93. if err != nil {
  94. return nil, err
  95. }
  96. jsonBody, err := c.GetJsonBody()
  97. if err != nil {
  98. return nil, err
  99. }
  100. userInfo := c.GetUserInfo()
  101. if userInfo == nil {
  102. jsonBody.Set("executorName", "guest")
  103. } else {
  104. jsonBody.Set("executorName", userInfo.GetName)
  105. }
  106. return jsonBody.Map(), nil
  107. },
  108. }).
  109. Build(executeSqlMiddlewares...)
  110. builder.
  111. Url(http.MethodGet, "/sql/execute/log").
  112. Get(&gateway.GetRequest{
  113. UrlFormFunc: func(c *api.Context, _ string, historyRequests []gateway.BuilderRequest, resultMap map[string]any) (string, error) {
  114. queryParams := c.GetQueryParams()
  115. serviceShortName := queryParams.Get("serviceShortName")
  116. if strutils.IsStringEmpty(serviceShortName) {
  117. return "", errors.New("没有传递服务名缩写")
  118. }
  119. queryParams.Delete("serviceShortName")
  120. serviceBaseUrl, loaded := serviceBaseUrlMap.Load(serviceShortName)
  121. if !loaded {
  122. return "", errors.New("没有注册对应的服务: " + serviceShortName)
  123. }
  124. var serviceUrl string
  125. if strutils.IsStringEmpty(options.serviceApiVersion) {
  126. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", "/sql/execute/log")
  127. if err != nil {
  128. return "", err
  129. }
  130. serviceUrl = innerServiceUrl
  131. } else {
  132. innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", options.serviceApiVersion, "/sql/execute/log")
  133. if err != nil {
  134. return "", err
  135. }
  136. serviceUrl = innerServiceUrl
  137. }
  138. return serviceUrl, nil
  139. },
  140. QueryParamsFormFunc: gateway.FormQueryParamsWithTenantIDAndUserIDFunc("", "executorId"),
  141. }).
  142. Build(sqlExecuteLogMiddlewares...)
  143. // 查询注册的服务
  144. builder.
  145. Url(http.MethodGet, "/sql/execute/registered/services").
  146. Local(func(c *api.Context) {
  147. serviceShortNames := make([]string, 0)
  148. serviceBaseUrlMap.Range(func(key any, value any) bool {
  149. serviceShortNames = append(serviceShortNames, key.(string))
  150. return true
  151. })
  152. c.JSON(http.StatusOK, gin.H{
  153. "services": serviceShortNames,
  154. })
  155. }, queryRegisteredServicesMiddlewares...)
  156. }