Skip to content

Commit b9f35f9

Browse files
committed
refactor(api): reduce NewAPIHandler cognitive complexity by extracting helpers
1 parent fa5d5fa commit b9f35f9

File tree

1 file changed

+84
-35
lines changed

1 file changed

+84
-35
lines changed

management/server/http/handler.go

Lines changed: 84 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -100,26 +100,62 @@ const (
100100

101101
// NewAPIHandler creates the Management service HTTP API handler registering all the available endpoints.
102102
func NewAPIHandler(ctx context.Context, deps APIHandlerDeps) (http.Handler, error) {
103+
if err := registerBypassPaths(apiPrefix); err != nil {
104+
return nil, err
105+
}
106+
107+
rootRouter := mux.NewRouter()
108+
prefix := apiPrefix
109+
router := rootRouter.PathPrefix(prefix).Subrouter()
110+
111+
setupMiddleware(router, deps)
112+
113+
if err := registerIntegrations(ctx, router, deps); err != nil {
114+
return nil, err
115+
}
116+
117+
embeddedIdP, embeddedIdpEnabled := deps.IdpManager.(*idpmanager.EmbeddedIdPManager)
118+
instanceManager, err := nbinstance.NewManager(ctx, deps.AccountManager.GetStore(), embeddedIdP)
119+
if err != nil {
120+
return nil, fmt.Errorf("failed to create instance manager: %w", err)
121+
}
122+
123+
registerCoreEndpoints(router, deps, instanceManager)
124+
registerReverseProxyAndOAuth(router, deps)
103125

104-
// Register bypass paths for unauthenticated endpoints
105-
if err := bypass.AddBypassPath("/api/instance"); err != nil {
106-
return nil, fmt.Errorf("failed to add bypass path: %w", err)
126+
if embeddedIdpEnabled {
127+
corsMiddleware := cors.AllowAll()
128+
rootRouter.PathPrefix("/oauth2").Handler(corsMiddleware.Handler(embeddedIdP.Handler()))
107129
}
108-
if err := bypass.AddBypassPath("/api/setup"); err != nil {
109-
return nil, fmt.Errorf("failed to add bypass path: %w", err)
130+
131+
return rootRouter, nil
132+
}
133+
134+
func registerBypassPaths(prefix string) error {
135+
if err := bypass.AddBypassPath(prefix + "/instance"); err != nil {
136+
return fmt.Errorf("failed to add bypass path: %w", err)
137+
}
138+
139+
if err := bypass.AddBypassPath(prefix + "/setup"); err != nil {
140+
return fmt.Errorf("failed to add bypass path: %w", err)
110141
}
111-
// Public invite endpoints (tokens start with nbi_)
112-
if err := bypass.AddBypassPath("/api/users/invites/nbi_*"); err != nil {
113-
return nil, fmt.Errorf("failed to add bypass path: %w", err)
142+
143+
if err := bypass.AddBypassPath(prefix + "/users/invites/nbi_*"); err != nil {
144+
return fmt.Errorf("failed to add bypass path: %w", err)
114145
}
115-
if err := bypass.AddBypassPath("/api/users/invites/nbi_*/accept"); err != nil {
116-
return nil, fmt.Errorf("failed to add bypass path: %w", err)
146+
147+
if err := bypass.AddBypassPath(prefix + "/users/invites/nbi_*/accept"); err != nil {
148+
return fmt.Errorf("failed to add bypass path: %w", err)
117149
}
118-
// OAuth callback for proxy authentication
150+
119151
if err := bypass.AddBypassPath(types.ProxyCallbackEndpointFull); err != nil {
120-
return nil, fmt.Errorf("failed to add bypass path: %w", err)
152+
return fmt.Errorf("failed to add bypass path: %w", err)
121153
}
122154

155+
return nil
156+
}
157+
158+
func setupMiddleware(router *mux.Router, deps APIHandlerDeps) {
123159
var rateLimitingConfig *middleware.RateLimiterConfig
124160
if os.Getenv(rateLimitingEnabledKey) == "true" {
125161
rpm := 6
@@ -160,26 +196,32 @@ func NewAPIHandler(ctx context.Context, deps APIHandlerDeps) (http.Handler, erro
160196
)
161197

162198
corsMiddleware := cors.AllowAll()
163-
164-
rootRouter := mux.NewRouter()
165199
metricsMiddleware := deps.AppMetrics.HTTPMiddleware()
166200

167-
prefix := apiPrefix
168-
router := rootRouter.PathPrefix(prefix).Subrouter()
169-
170201
router.Use(metricsMiddleware.Handler, corsMiddleware.Handler, authMiddleware.Handler)
202+
}
171203

172-
if _, err := integrations.RegisterHandlers(ctx, prefix, router, deps.AccountManager, deps.IntegratedValidator, deps.AppMetrics.GetMeter(), deps.PermissionsManager, deps.PeersManager, deps.ProxyController, deps.SettingsManager); err != nil {
173-
return nil, fmt.Errorf("register integrations endpoints: %w", err)
204+
func registerIntegrations(ctx context.Context, router *mux.Router, deps APIHandlerDeps) error {
205+
prefix := apiPrefix
206+
if _, err := integrations.RegisterHandlers(
207+
ctx,
208+
prefix,
209+
router,
210+
deps.AccountManager,
211+
deps.IntegratedValidator,
212+
deps.AppMetrics.GetMeter(),
213+
deps.PermissionsManager,
214+
deps.PeersManager,
215+
deps.ProxyController,
216+
deps.SettingsManager,
217+
); err != nil {
218+
return fmt.Errorf("register integrations endpoints: %w", err)
174219
}
175220

176-
// Check if embedded IdP is enabled for instance manager
177-
embeddedIdP, embeddedIdpEnabled := deps.IdpManager.(*idpmanager.EmbeddedIdPManager)
178-
instanceManager, err := nbinstance.NewManager(ctx, deps.AccountManager.GetStore(), embeddedIdP)
179-
if err != nil {
180-
return nil, fmt.Errorf("failed to create instance manager: %w", err)
181-
}
221+
return nil
222+
}
182223

224+
func registerCoreEndpoints(router *mux.Router, deps APIHandlerDeps, instanceManager nbinstance.Manager) {
183225
accounts.AddEndpoints(deps.AccountManager, deps.SettingsManager, router, deps.EnableDeploymentMaturity)
184226
peers.AddEndpoints(deps.AccountManager, router, deps.NetworkMapController, deps.PermissionsManager)
185227
users.AddEndpoints(deps.AccountManager, router)
@@ -193,26 +235,33 @@ func NewAPIHandler(ctx context.Context, deps APIHandlerDeps) (http.Handler, erro
193235
routes.AddEndpoints(deps.AccountManager, router)
194236
dns.AddEndpoints(deps.AccountManager, router)
195237
events.AddEndpoints(deps.AccountManager, router)
196-
networks.AddEndpoints(deps.NetworksManager, deps.ResourceManager, deps.RouterManager, deps.GroupsManager, deps.AccountManager, router)
238+
networks.AddEndpoints(
239+
deps.NetworksManager,
240+
deps.ResourceManager,
241+
deps.RouterManager,
242+
deps.GroupsManager,
243+
deps.AccountManager,
244+
router,
245+
)
197246
zonesManager.RegisterEndpoints(router, deps.ZonesManager)
198247
recordsManager.RegisterEndpoints(router, deps.RecordsManager)
199248
idp.AddEndpoints(deps.AccountManager, router)
200249
instance.AddEndpoints(instanceManager, router)
201250
instance.AddVersionEndpoint(instanceManager, router)
251+
}
252+
253+
func registerReverseProxyAndOAuth(router *mux.Router, deps APIHandlerDeps) {
202254
if deps.ReverseProxyManager != nil && deps.ReverseProxyDomainManager != nil {
203-
reverseproxymanager.RegisterEndpoints(deps.ReverseProxyManager, *deps.ReverseProxyDomainManager, deps.ReverseProxyAccessLogs, router)
255+
reverseproxymanager.RegisterEndpoints(
256+
deps.ReverseProxyManager,
257+
*deps.ReverseProxyDomainManager,
258+
deps.ReverseProxyAccessLogs,
259+
router,
260+
)
204261
}
205262

206-
// Register OAuth callback handler for proxy authentication
207263
if deps.ProxyGRPCServer != nil {
208264
oauthHandler := proxy.NewAuthCallbackHandler(deps.ProxyGRPCServer, deps.TrustedHTTPProxies)
209265
oauthHandler.RegisterEndpoints(router)
210266
}
211-
212-
// Mount embedded IdP handler at /oauth2 path if configured
213-
if embeddedIdpEnabled {
214-
rootRouter.PathPrefix("/oauth2").Handler(corsMiddleware.Handler(embeddedIdP.Handler()))
215-
}
216-
217-
return rootRouter, nil
218267
}

0 commit comments

Comments
 (0)