package configuration import ( "git.sxidc.com/go-framework/baize/framework/core/api" "git.sxidc.com/go-framework/baize/framework/gateway" "git.sxidc.com/go-tools/utils/strutils" "git.sxidc.com/service-supports/fserr" "net/http" "net/url" "sync" ) type Option func(options *Options) type Options struct { serviceApiVersion string } func WithServiceApiVersion(serviceApiVersion string) Option { return func(options *Options) { options.serviceApiVersion = serviceApiVersion } } var serviceBaseUrlMap sync.Map func RegisterService(serviceShortName string, baseUrl string) { serviceBaseUrlMap.Store(serviceShortName, baseUrl) } func BuildGateway(builder *gateway.Builder, opts ...Option) { options := new(Options) for _, opt := range opts { opt(options) } // 创建 builder. Url(http.MethodPost, "/configuration/create"). Post(gateway.NewPostRequest("", gateway.PostRequestWithUrlTransferFunc( func(c *api.Context, _ string, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (string, error) { jsonBody, err := c.GetJsonBody() if err != nil { return "", err } serviceShortName, ok := jsonBody.Get("serviceShortName").(string) if !ok { return "", fserr.New("没有传递服务名缩写或服务名缩写不是string类型") } jsonBody.Delete("serviceShortName") serviceBaseUrl, loaded := serviceBaseUrlMap.Load(serviceShortName) if !loaded { return "", fserr.New("没有注册对应的服务: " + serviceShortName) } var serviceUrl string if strutils.IsStringEmpty(options.serviceApiVersion) { innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", "/configuration/create") if err != nil { return "", err } serviceUrl = innerServiceUrl } else { innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", options.serviceApiVersion, "/configuration/create") if err != nil { return "", err } serviceUrl = innerServiceUrl } return serviceUrl, nil })), nil). Build() // 删除 builder. Url(http.MethodPost, "/configuration/delete"). Post(gateway.NewPostRequest("", gateway.PostRequestWithUrlTransferFunc( func(c *api.Context, _ string, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (string, error) { jsonBody, err := c.GetJsonBody() if err != nil { return "", err } serviceShortName, ok := jsonBody.Get("serviceShortName").(string) if !ok { return "", fserr.New("没有传递服务名缩写或服务名缩写不是string类型") } jsonBody.Delete("serviceShortName") serviceBaseUrl, loaded := serviceBaseUrlMap.Load(serviceShortName) if !loaded { return "", fserr.New("没有注册对应的服务: " + serviceShortName) } var serviceUrl string if strutils.IsStringEmpty(options.serviceApiVersion) { innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", "/configuration/delete") if err != nil { return "", err } serviceUrl = innerServiceUrl } else { innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", options.serviceApiVersion, "/configuration/delete") if err != nil { return "", err } serviceUrl = innerServiceUrl } return serviceUrl, nil })), nil). Build() // 查询 builder. Url(http.MethodGet, "/configuration/values"). Get(gateway.NewGetRequest("", gateway.GetRequestWithUrlTransferFunc( func(c *api.Context, _ string, historyRequest []gateway.BuilderRequest, resultMap map[string]any) (string, error) { queryParams := c.GetQueryParams() serviceShortName := queryParams.Get("serviceShortName") if strutils.IsStringEmpty(serviceShortName) { return "", fserr.New("没有传递服务名缩写") } queryParams.Delete("serviceShortName") serviceBaseUrl, loaded := serviceBaseUrlMap.Load(serviceShortName) if !loaded { return "", fserr.New("没有注册对应的服务: " + serviceShortName) } var serviceUrl string if strutils.IsStringEmpty(options.serviceApiVersion) { innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", "/configuration/values") if err != nil { return "", err } serviceUrl = innerServiceUrl } else { innerServiceUrl, err := url.JoinPath(serviceBaseUrl.(string), serviceShortName, "/api", options.serviceApiVersion, "/configuration/values") if err != nil { return "", err } serviceUrl = innerServiceUrl } return serviceUrl, nil })), nil). Build() }