Skip to content

Commit fb54b9f

Browse files
authored
api refactor: remove/merge admin endpoints to public (#185)
1 parent 1453390 commit fb54b9f

File tree

4 files changed

+18
-95
lines changed

4 files changed

+18
-95
lines changed

internal/client/client.go

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,6 @@ func pingWithRetry(c *Client) error {
8181
// Close is a no-op in API mode
8282
func (c *Client) Close() error { return nil }
8383

84-
func (c *Client) baseURLWithoutVersion() string {
85-
base := strings.TrimRight(c.BaseURL, "/")
86-
if strings.HasSuffix(base, "/v0") {
87-
return base[:len(base)-3]
88-
}
89-
return base
90-
}
91-
9284
func (c *Client) newRequest(method, pathWithQuery string) (*http.Request, error) {
9385
fullURL := strings.TrimRight(c.BaseURL, "/") + pathWithQuery
9486
req, err := http.NewRequest(method, fullURL, nil)
@@ -101,19 +93,6 @@ func (c *Client) newRequest(method, pathWithQuery string) (*http.Request, error)
10193
return req, nil
10294
}
10395

104-
func (c *Client) newAdminRequest(method, pathWithQuery string) (*http.Request, error) {
105-
base := c.baseURLWithoutVersion()
106-
fullURL := strings.TrimRight(base, "/") + pathWithQuery
107-
req, err := http.NewRequest(method, fullURL, nil)
108-
if err != nil {
109-
return nil, err
110-
}
111-
if c.token != "" {
112-
req.Header.Set("Authorization", "Bearer "+c.token)
113-
}
114-
return req, nil
115-
}
116-
11796
func (c *Client) doJSON(req *http.Request, out any) error {
11897
if out != nil {
11998
req.Header.Set("Accept", "application/json")
@@ -178,7 +157,7 @@ func (c *Client) GetAllServers() ([]*v0.ServerResponse, error) {
178157
var all []*v0.ServerResponse
179158

180159
for {
181-
req, err := c.newAdminRequest(http.MethodGet, "/admin/v0/servers?limit="+strconv.Itoa(limit)+"&cursor="+url.QueryEscape(cursor))
160+
req, err := c.newRequest(http.MethodGet, "/servers?limit="+strconv.Itoa(limit)+"&cursor="+url.QueryEscape(cursor))
182161
if err != nil {
183162
return nil, err
184163
}
@@ -291,7 +270,7 @@ func (c *Client) GetServerVersions(name string) ([]v0.ServerResponse, error) {
291270
func (c *Client) GetAllServerVersionsAdmin(name string) ([]v0.ServerResponse, error) {
292271
encName := url.PathEscape(name)
293272

294-
req, err := c.newAdminRequest(http.MethodGet, "/admin/v0/servers/"+encName+"/versions")
273+
req, err := c.newRequest(http.MethodGet, "/servers/"+encName+"/versions")
295274
if err != nil {
296275
return nil, err
297276
}
@@ -445,7 +424,7 @@ func (c *Client) CreateMCPServer(server *v0.ServerJSON) (*v0.ServerResponse, err
445424
func (c *Client) GetSkillVersions(name string) ([]*models.SkillResponse, error) {
446425
encName := url.PathEscape(name)
447426

448-
req, err := c.newAdminRequest(http.MethodGet, "/admin/v0/skills/"+encName+"/versions")
427+
req, err := c.newRequest(http.MethodGet, "/skills/"+encName+"/versions")
449428
if err != nil {
450429
return nil, err
451430
}
@@ -495,7 +474,7 @@ func (c *Client) GetSkillByNameAndVersionAdmin(name, version string) (*models.Sk
495474
encName := url.PathEscape(name)
496475
encVersion := url.PathEscape(version)
497476

498-
req, err := c.newAdminRequest(http.MethodGet, "/admin/v0/skills/"+encName+"/versions/"+encVersion)
477+
req, err := c.newRequest(http.MethodGet, "/skills/"+encName+"/versions/"+encVersion)
499478
if err != nil {
500479
return nil, err
501480
}
@@ -517,7 +496,7 @@ func (c *Client) GetAgentByNameAndVersionAdmin(name, version string) (*models.Ag
517496
encName := url.PathEscape(name)
518497
encVersion := url.PathEscape(version)
519498

520-
req, err := c.newAdminRequest(http.MethodGet, "/admin/v0/agents/"+encName+"/versions/"+encVersion)
499+
req, err := c.newRequest(http.MethodGet, "/agents/"+encName+"/versions/"+encVersion)
521500
if err != nil {
522501
return nil, err
523502
}
@@ -539,7 +518,7 @@ func (c *Client) DeleteAgent(name, version string) error {
539518
encName := url.PathEscape(name)
540519
encVersion := url.PathEscape(version)
541520

542-
req, err := c.newAdminRequest(http.MethodDelete, "/admin/v0/agents/"+encName+"/versions/"+encVersion)
521+
req, err := c.newRequest(http.MethodDelete, "/agents/"+encName+"/versions/"+encVersion)
543522
if err != nil {
544523
return err
545524
}
@@ -553,7 +532,7 @@ func (c *Client) DeleteSkill(name, version string) error {
553532
encName := url.PathEscape(name)
554533
encVersion := url.PathEscape(version)
555534

556-
req, err := c.newAdminRequest(http.MethodDelete, "/admin/v0/skills/"+encName+"/versions/"+encVersion)
535+
req, err := c.newRequest(http.MethodDelete, "/skills/"+encName+"/versions/"+encVersion)
557536
if err != nil {
558537
return err
559538
}
@@ -566,7 +545,7 @@ func (c *Client) DeleteMCPServer(name, version string) error {
566545
encName := url.PathEscape(name)
567546
encVersion := url.PathEscape(version)
568547

569-
req, err := c.newAdminRequest(http.MethodDelete, "/admin/v0/servers/"+encName+"/versions/"+encVersion)
548+
req, err := c.newRequest(http.MethodDelete, "/servers/"+encName+"/versions/"+encVersion)
570549
if err != nil {
571550
return err
572551
}
@@ -724,7 +703,7 @@ func (c *Client) RemoveDeployment(name string, version string, resourceType stri
724703

725704
// StartIndex starts an embeddings indexing job.
726705
func (c *Client) StartIndex(req internalv0.IndexRequest) (*internalv0.IndexJobResponse, error) {
727-
httpReq, err := c.newAdminRequest(http.MethodPost, "/admin/v0/embeddings/index")
706+
httpReq, err := c.newRequest(http.MethodPost, "/embeddings/index")
728707
if err != nil {
729708
return nil, err
730709
}
@@ -746,7 +725,7 @@ func (c *Client) StartIndex(req internalv0.IndexRequest) (*internalv0.IndexJobRe
746725
// GetIndexStatus gets the status of an indexing job.
747726
func (c *Client) GetIndexStatus(jobID string) (*internalv0.JobStatusResponse, error) {
748727
encJobID := url.PathEscape(jobID)
749-
httpReq, err := c.newAdminRequest(http.MethodGet, "/admin/v0/embeddings/index/"+encJobID)
728+
httpReq, err := c.newRequest(http.MethodGet, "/embeddings/index/"+encJobID)
750729
if err != nil {
751730
return nil, err
752731
}
@@ -760,8 +739,7 @@ func (c *Client) GetIndexStatus(jobID string) (*internalv0.JobStatusResponse, er
760739

761740
// StreamIndexURL returns the URL for SSE streaming indexing.
762741
func (c *Client) streamIndexURL() string {
763-
base := c.baseURLWithoutVersion()
764-
return base + "/admin/v0/embeddings/index/stream"
742+
return strings.TrimRight(c.BaseURL, "/") + "/embeddings/index/stream"
765743
}
766744

767745
// NewSSERequest creates a new HTTP POST request for SSE streaming with JSON body.

internal/registry/api/router/router.go

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ func handle404(w http.ResponseWriter, r *http.Request) {
104104
detail := "Endpoint not found. See /docs for the API documentation."
105105

106106
// Provide suggestions for common API endpoint mistakes
107-
if !strings.HasPrefix(path, "/v0/") && !strings.HasPrefix(path, "/admin/v0/") {
107+
if !strings.HasPrefix(path, "/v0/") {
108108
detail = fmt.Sprintf(
109109
"Endpoint not found. Did you mean '/v0%s'? See /docs for the API documentation.",
110110
path,
@@ -168,10 +168,6 @@ func NewHumaAPI(cfg *config.Config, registry service.RegistryService, mux *http.
168168
Name: "auth",
169169
Description: "Authentication operations for obtaining tokens to publish servers",
170170
},
171-
{
172-
Name: "admin",
173-
Description: "Administrative operations for managing servers (requires elevated permissions)",
174-
},
175171
{
176172
Name: "health",
177173
Description: "Health check endpoint for monitoring service availability",
@@ -196,7 +192,7 @@ func NewHumaAPI(cfg *config.Config, registry service.RegistryService, mux *http.
196192
routeOpts.Mux = mux
197193
}
198194

199-
// Register all API routes (public and admin) for all versions
195+
// Register all API routes under /v0
200196
RegisterRoutes(api, cfg, registry, metrics, versionInfo, routeOpts)
201197

202198
// Add /metrics for Prometheus metrics using promhttp
@@ -209,7 +205,6 @@ func NewHumaAPI(cfg *config.Config, registry service.RegistryService, mux *http.
209205
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
210206
// Check if this is an API route - if so, return 404
211207
if strings.HasPrefix(r.URL.Path, "/v0/") ||
212-
strings.HasPrefix(r.URL.Path, "/admin/v0/") ||
213208
r.URL.Path == "/health" ||
214209
r.URL.Path == "/ping" ||
215210
r.URL.Path == "/metrics" ||

internal/registry/api/router/v0.go

Lines changed: 5 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,7 @@ type RouteOptions struct {
2121
Mux *http.ServeMux
2222
}
2323

24-
// RegisterRoutes registers all API routes (public and admin) for all versions
25-
// This is the single entry point for all route registration
24+
// RegisterRoutes registers all API routes under /v0.
2625
func RegisterRoutes(
2726
api huma.API,
2827
cfg *config.Config,
@@ -31,23 +30,11 @@ func RegisterRoutes(
3130
versionInfo *v0.VersionBody,
3231
opts *RouteOptions,
3332
) {
34-
// Public API endpoints
35-
registerPublicRoutes(api, "/v0", cfg, registry, metrics, versionInfo)
33+
pathPrefix := "/v0"
3634

37-
// Admin API endpoints
38-
registerAdminRoutes(api, "/admin/v0", cfg, registry, metrics, versionInfo, opts)
39-
}
40-
41-
// registerPublicRoutes registers public API routes for a version.
42-
func registerPublicRoutes(
43-
api huma.API,
44-
pathPrefix string,
45-
cfg *config.Config,
46-
registry service.RegistryService,
47-
metrics *telemetry.Metrics,
48-
versionInfo *v0.VersionBody,
49-
) {
50-
registerCommonEndpoints(api, pathPrefix, cfg, metrics, versionInfo)
35+
v0.RegisterHealthEndpoint(api, pathPrefix, cfg, metrics)
36+
v0.RegisterPingEndpoint(api, pathPrefix)
37+
v0.RegisterVersionEndpoint(api, pathPrefix, versionInfo)
5138
v0.RegisterServersEndpoints(api, pathPrefix, registry)
5239
v0.RegisterServersCreateEndpoint(api, pathPrefix, registry)
5340
v0.RegisterEditEndpoints(api, pathPrefix, registry)
@@ -57,47 +44,11 @@ func registerPublicRoutes(
5744
v0.RegisterAgentsCreateEndpoint(api, pathPrefix, registry)
5845
v0.RegisterSkillsEndpoints(api, pathPrefix, registry)
5946
v0.RegisterSkillsCreateEndpoint(api, pathPrefix, registry)
60-
}
61-
62-
// registerAdminRoutes registers admin API routes for a version
63-
func registerAdminRoutes(
64-
api huma.API,
65-
pathPrefix string,
66-
cfg *config.Config,
67-
registry service.RegistryService,
68-
metrics *telemetry.Metrics,
69-
versionInfo *v0.VersionBody,
70-
opts *RouteOptions,
71-
) {
72-
registerCommonEndpoints(api, pathPrefix, cfg, metrics, versionInfo)
73-
v0.RegisterServersEndpoints(api, pathPrefix, registry)
74-
v0.RegisterServersCreateEndpoint(api, pathPrefix, registry)
75-
v0.RegisterEditEndpoints(api, pathPrefix, registry)
76-
v0.RegisterDeploymentsEndpoints(api, pathPrefix, registry)
77-
v0.RegisterAgentsEndpoints(api, pathPrefix, registry)
78-
v0.RegisterAgentsCreateEndpoint(api, pathPrefix, registry)
79-
v0.RegisterSkillsEndpoints(api, pathPrefix, registry)
80-
v0.RegisterSkillsCreateEndpoint(api, pathPrefix, registry)
8147

82-
// Register embeddings endpoints if services are available
8348
if opts != nil && opts.Indexer != nil && opts.JobManager != nil {
8449
v0.RegisterEmbeddingsEndpoints(api, pathPrefix, opts.Indexer, opts.JobManager)
85-
// Also register SSE handler on the mux if available
8650
if opts.Mux != nil {
8751
v0.RegisterEmbeddingsSSEHandler(opts.Mux, pathPrefix, opts.Indexer, opts.JobManager)
8852
}
8953
}
9054
}
91-
92-
// registerCommonEndpoints registers endpoints that are common to both public and admin routes
93-
func registerCommonEndpoints(
94-
api huma.API,
95-
pathPrefix string,
96-
cfg *config.Config,
97-
metrics *telemetry.Metrics,
98-
versionInfo *v0.VersionBody,
99-
) {
100-
v0.RegisterHealthEndpoint(api, pathPrefix, cfg, metrics)
101-
v0.RegisterPingEndpoint(api, pathPrefix)
102-
v0.RegisterVersionEndpoint(api, pathPrefix, versionInfo)
103-
}

internal/registry/api/server.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@ func TrailingSlashMiddleware(next http.Handler) http.Handler {
4141
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
4242
// Only apply trailing slash logic to API routes
4343
isAPIRoute := strings.HasPrefix(r.URL.Path, "/v0/") ||
44-
strings.HasPrefix(r.URL.Path, "/admin/v0/") ||
4544
r.URL.Path == "/health" ||
4645
r.URL.Path == "/ping" ||
4746
r.URL.Path == "/metrics" ||

0 commit comments

Comments
 (0)