in api/internal/handler/data_loader/route_export.go [140:292]
func (h *Handler) RouteToOpenAPI3(c droplet.Context, routes []*entity.Route) (*openapi3.Swagger, error) {
paths := openapi3.Paths{}
paramsRefs := []*openapi3.ParameterRef{}
requestBody := &openapi3.RequestBody{}
components := &openapi3.Components{}
secSchemas := openapi3.SecuritySchemes{}
_pathNumber := GetPathNumber()
for _, route := range routes {
extensions := make(map[string]interface{})
servicePlugins := make(map[string]interface{})
plugins := make(map[string]interface{})
serviceLabels := make(map[string]string)
pathItem := &openapi3.PathItem{}
path := openapi3.Operation{}
path.Summary = route.Desc
path.OperationID = route.Name
if route.ServiceID != nil {
serviceID := utils.InterfaceToString(route.ServiceID)
service, err = h.serviceStore.Get(c.Context(), serviceID)
if err != nil {
if err == data.ErrNotFound {
return nil, fmt.Errorf(consts.IDNotFound, "service", route.ServiceID)
}
return nil, err
}
_service := service.(*entity.Service)
servicePlugins = _service.Plugins
serviceLabels = _service.Labels
}
//Parse upstream
_upstream, err := h.ParseRouteUpstream(c, route)
if err != nil {
log.Errorf("ParseRouteUpstream err: ", err)
return nil, err
} else if _upstream != nil {
extensions["x-apisix-upstream"] = _upstream
}
if route.Host != "" {
extensions["x-apisix-host"] = route.Host
}
if route.Hosts != nil {
extensions["x-apisix-hosts"] = route.Hosts
}
//Parse Labels
labels, err := ParseLabels(route, serviceLabels)
if err != nil {
log.Errorf("parseLabels err: ", err)
return nil, err
}
if labels != nil {
extensions["x-apisix-labels"] = labels
}
if route.RemoteAddr != "" {
extensions["x-apisix-remote_addr"] = route.RemoteAddr
}
if route.RemoteAddrs != nil {
extensions["x-apisix-remote_addrs"] = route.RemoteAddrs
}
if route.FilterFunc != "" {
extensions["x-apisix-filter_func"] = route.FilterFunc
}
if route.Script != nil {
extensions["x-apisix-script"] = route.Script
}
if route.ServiceProtocol != "" {
extensions["x-apisix-service_protocol"] = route.ServiceProtocol
}
if route.Vars != nil {
extensions["x-apisix-vars"] = route.Vars
}
if route.ID != nil {
extensions["x-apisix-id"] = route.ID
}
// Parse Route URIs
paths, paramsRefs = ParseRouteUris(route, paths, paramsRefs, pathItem, _pathNumber())
//Parse Route Plugins
path, secSchemas, paramsRefs, plugins, err = ParseRoutePlugins(route, paramsRefs, plugins, path, servicePlugins, secSchemas, requestBody)
if err != nil {
log.Errorf("parseRoutePlugins err: ", err)
return nil, err
}
if len(plugins) > 0 {
extensions["x-apisix-plugins"] = plugins
}
extensions["x-apisix-priority"] = route.Priority
extensions["x-apisix-status"] = route.Status
extensions["x-apisix-enable_websocket"] = route.EnableWebsocket
path.Extensions = extensions
path.Parameters = paramsRefs
path.RequestBody = &openapi3.RequestBodyRef{Value: requestBody}
path.Responses = openapi3.NewResponses()
if route.Methods != nil && len(route.Methods) > 0 {
routeMethods = route.Methods
} else {
routeMethods = _allHTTPMethods
}
for i := range routeMethods {
switch strings.ToUpper(routeMethods[i]) {
case http.MethodGet:
pathItem.Get = ParsePathItem(path, http.MethodGet)
case http.MethodPost:
pathItem.Post = ParsePathItem(path, http.MethodPost)
case http.MethodPut:
pathItem.Put = ParsePathItem(path, http.MethodPut)
case http.MethodDelete:
pathItem.Delete = ParsePathItem(path, http.MethodDelete)
case http.MethodPatch:
pathItem.Patch = ParsePathItem(path, http.MethodPatch)
case http.MethodHead:
pathItem.Head = ParsePathItem(path, http.MethodHead)
case http.MethodConnect:
pathItem.Connect = ParsePathItem(path, http.MethodConnect)
case http.MethodTrace:
pathItem.Trace = ParsePathItem(path, http.MethodTrace)
case http.MethodOptions:
pathItem.Options = ParsePathItem(path, http.MethodOptions)
}
}
}
components.SecuritySchemes = secSchemas
swagger := openapi3.Swagger{
OpenAPI: openApi,
Info: &openapi3.Info{Title: title, Version: openApi},
Paths: paths,
Components: *components,
}
return &swagger, nil
}