-
Notifications
You must be signed in to change notification settings - Fork 2
/
provider.go
84 lines (68 loc) · 2.25 KB
/
provider.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
package router
import (
"fmt"
"net/http"
"strings"
"github.com/go-chi/chi/v5"
"github.com/go-chi/render"
"github.com/rs/zerolog/log"
"github.com/unweave/unweave-v1/api/middleware"
"github.com/unweave/unweave-v1/api/types"
"github.com/unweave/unweave-v1/services/providersrv"
)
type ProviderRouter struct {
r chi.Router
delegates map[types.Provider]*providersrv.ProviderService
supported []string
}
func NewProviderRouter(services ...*providersrv.ProviderService) *ProviderRouter {
supported := make([]string, 0, len(services))
delegates := make(map[types.Provider]*providersrv.ProviderService)
for _, svc := range services {
supported = append(supported, svc.Provider().String())
delegates[svc.Provider()] = svc
}
return &ProviderRouter{
delegates: delegates,
supported: supported,
}
}
func (p *ProviderRouter) Routes() []Route {
var routes []Route
_ = chi.Walk(p.r, func(method string, route string, handler http.Handler, middlewares ...func(http.Handler) http.Handler) error {
r := Route{
Handler: handler,
Method: method,
Path: route,
}
routes = append(routes, r)
return nil
})
return routes
}
func (p *ProviderRouter) ProviderListNodeTypesHandler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
log.Ctx(ctx).Info().Msgf("Executing ProviderListNodeTypes request")
provider := types.Provider(chi.URLParam(r, "provider"))
filterAvailable := r.URL.Query().Get("available") == "true"
// TODO: This should be change to middleware.GetAccountIDFromContext once the route is
// moved to /accounts/{accountID}/providers/{provider}/node-types
userID := middleware.GetUserIDFromContext(ctx)
service, ok := p.delegates[provider]
if !ok {
err := &types.Error{
Code: http.StatusBadRequest,
Message: "Invalid provider",
Suggestion: fmt.Sprintf("Valid providers are: %s ", strings.Join(p.supported, ", ")),
}
_ = render.Render(w, r.WithContext(ctx), types.ErrHTTPError(err, "Failed to list node types"))
return
}
nodeTypes, err := service.ListNodeTypes(ctx, userID, filterAvailable)
if err != nil {
render.Render(w, r.WithContext(ctx), types.ErrHTTPError(err, "Failed to list node types"))
return
}
res := &types.NodeTypesListResponse{NodeTypes: nodeTypes}
render.JSON(w, r, res)
}