Skip to content

Commit 89b5266

Browse files
QinYuuuuDev Agent
andauthored
Separate ce EE saas routes (#638)
Co-authored-by: Dev Agent <[email protected]>
1 parent 54bf54a commit 89b5266

File tree

11 files changed

+301
-407
lines changed

11 files changed

+301
-407
lines changed

api/handler/repo.go

Lines changed: 0 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -1329,41 +1329,6 @@ func (h *RepoHandler) CreateMirror(ctx *gin.Context) {
13291329
httpbase.OK(ctx, mirror)
13301330
}
13311331

1332-
// MirrorFromSaas godoc
1333-
// @Security ApiKey
1334-
// @Summary Mirror repo from OpenCSG Saas(only on-premises)
1335-
// @Tags Repository
1336-
// @Accept json
1337-
// @Produce json
1338-
// @Param repo_type path string true "models,datasets,codes or spaces" Enums(models,datasets,codes,spaces)
1339-
// @Param namespace path string true "repo owner name"
1340-
// @Param name path string true "repo name"
1341-
// @Success 200 {object} types.Response{data=database.Mirror} "OK"
1342-
// @Failure 400 {object} types.APIBadRequest "Bad request"
1343-
// @Failure 500 {object} types.APIInternalServerError "Internal server error"
1344-
// @Router /{repo_type}/{namespace}/{name}/mirror_from_saas [post]
1345-
func (h *RepoHandler) MirrorFromSaas(ctx *gin.Context) {
1346-
currentUser := httpbase.GetCurrentUser(ctx)
1347-
namespace, name, err := common.GetNamespaceAndNameFromContext(ctx)
1348-
if err != nil {
1349-
slog.ErrorContext(ctx.Request.Context(), "Bad request format", "error", err)
1350-
httpbase.BadRequest(ctx, err.Error())
1351-
return
1352-
}
1353-
repoType := common.RepoTypeFromContext(ctx)
1354-
if !strings.HasPrefix(namespace, types.OpenCSGPrefix) {
1355-
httpbase.BadRequest(ctx, "Repo could not be mirrored")
1356-
return
1357-
}
1358-
err = h.c.MirrorFromSaas(ctx.Request.Context(), namespace, name, currentUser, repoType)
1359-
if err != nil {
1360-
slog.ErrorContext(ctx.Request.Context(), "Failed to create mirror for", slog.String("repo_type", string(repoType)), slog.String("path", fmt.Sprintf("%s/%s", namespace, name)), "error", err)
1361-
httpbase.ServerError(ctx, err)
1362-
return
1363-
}
1364-
httpbase.OK(ctx, nil)
1365-
}
1366-
13671332
// GetMirror godoc
13681333
// @Security ApiKey
13691334
// @Summary Get a mirror
@@ -2080,43 +2045,6 @@ func (h *RepoHandler) SyncMirror(ctx *gin.Context) {
20802045
httpbase.OK(ctx, nil)
20812046
}
20822047

2083-
// GetMirrorProgress godoc
2084-
// @Security ApiKey
2085-
// @Summary Get Mirror sync progress
2086-
// @Tags Repository
2087-
// @Accept json
2088-
// @Produce json
2089-
// @Param repo_type path string true "models,datasets,codes or spaces" Enums(models,datasets,codes,spaces)
2090-
// @Param namespace path string true "repo owner name"
2091-
// @Param name path string true "repo name"
2092-
// @Success 200 {object} types.Response{data=types.LFSSyncProgressResp} "OK"
2093-
// @Failure 400 {object} types.APIBadRequest "Bad request"
2094-
// @Failure 500 {object} types.APIInternalServerError "Internal server error"
2095-
// @Router /{repo_type}/{namespace}/{name}/mirror/progress [get]
2096-
func (h *RepoHandler) MirrorProgress(ctx *gin.Context) {
2097-
repoType := common.RepoTypeFromContext(ctx)
2098-
namespace, name, err := common.GetNamespaceAndNameFromContext(ctx)
2099-
if err != nil {
2100-
slog.ErrorContext(ctx.Request.Context(), "failed to get namespace from context", "error", err)
2101-
httpbase.BadRequest(ctx, err.Error())
2102-
return
2103-
}
2104-
currentUser := httpbase.GetCurrentUser(ctx)
2105-
progress, err := h.c.MirrorProgress(ctx.Request.Context(), repoType, namespace, name, currentUser)
2106-
if err != nil {
2107-
if errors.Is(err, errorx.ErrForbidden) {
2108-
slog.Debug("not allowed to get mirror progress for", slog.String("repo_type", string(repoType)), slog.String("path", fmt.Sprintf("%s/%s", namespace, name)), "error", err)
2109-
httpbase.ForbiddenError(ctx, err)
2110-
return
2111-
}
2112-
2113-
slog.ErrorContext(ctx.Request.Context(), "Failed to get mirror progress for", slog.String("repo_type", string(repoType)), slog.String("path", fmt.Sprintf("%s/%s", namespace, name)), "error", err)
2114-
httpbase.ServerError(ctx, err)
2115-
return
2116-
}
2117-
httpbase.OK(ctx, progress)
2118-
}
2119-
21202048
func (h *RepoHandler) testStatus(ctx *gin.Context) {
21212049
ctx.Writer.Header().Set("Content-Type", "text/event-stream")
21222050
ctx.Writer.Header().Set("Cache-Control", "no-cache")

api/handler/repo_ce.go

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
//go:build !ee && !saas
2+
3+
package handler
4+
5+
import (
6+
"fmt"
7+
"log/slog"
8+
"strings"
9+
10+
"github.com/gin-gonic/gin"
11+
"opencsg.com/csghub-server/api/httpbase"
12+
"opencsg.com/csghub-server/common/types"
13+
"opencsg.com/csghub-server/common/utils/common"
14+
)
15+
16+
// MirrorFromSaas godoc
17+
// @Security ApiKey
18+
// @Summary Mirror repo from OpenCSG Saas(only on-premises)
19+
// @Tags Repository
20+
// @Accept json
21+
// @Produce json
22+
// @Param repo_type path string true "models,datasets,codes or spaces" Enums(models,datasets,codes,spaces)
23+
// @Param namespace path string true "repo owner name"
24+
// @Param name path string true "repo name"
25+
// @Success 200 {object} types.Response{data=database.Mirror} "OK"
26+
// @Failure 400 {object} types.APIBadRequest "Bad request"
27+
// @Failure 500 {object} types.APIInternalServerError "Internal server error"
28+
// @Router /{repo_type}/{namespace}/{name}/mirror_from_saas [post]
29+
func (h *RepoHandler) MirrorFromSaas(ctx *gin.Context) {
30+
currentUser := httpbase.GetCurrentUser(ctx)
31+
namespace, name, err := common.GetNamespaceAndNameFromContext(ctx)
32+
if err != nil {
33+
slog.ErrorContext(ctx.Request.Context(), "Bad request format", "error", err)
34+
httpbase.BadRequest(ctx, err.Error())
35+
return
36+
}
37+
repoType := common.RepoTypeFromContext(ctx)
38+
if !strings.HasPrefix(namespace, types.OpenCSGPrefix) {
39+
httpbase.BadRequest(ctx, "Repo could not be mirrored")
40+
return
41+
}
42+
err = h.c.MirrorFromSaas(ctx.Request.Context(), namespace, name, currentUser, repoType)
43+
if err != nil {
44+
slog.ErrorContext(ctx.Request.Context(), "Failed to create mirror for", slog.String("repo_type", string(repoType)), slog.String("path", fmt.Sprintf("%s/%s", namespace, name)), "error", err)
45+
httpbase.ServerError(ctx, err)
46+
return
47+
}
48+
httpbase.OK(ctx, nil)
49+
}

api/handler/repo_ce_test.go

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
//go:build !ee && !saas
2+
3+
package handler
4+
5+
import (
6+
"testing"
7+
8+
"github.com/gin-gonic/gin"
9+
"opencsg.com/csghub-server/common/types"
10+
)
11+
12+
func TestRepoHandler_MirrorFromSaas(t *testing.T) {
13+
t.Run("valid", func(t *testing.T) {
14+
tester := NewRepoTester(t).WithHandleFunc(func(rp *RepoHandler) gin.HandlerFunc {
15+
return rp.MirrorFromSaas
16+
})
17+
tester.WithUser()
18+
19+
tester.WithParam("namespace", types.OpenCSGPrefix+"repo")
20+
tester.WithKV("repo_type", types.ModelRepo)
21+
tester.mocks.repo.EXPECT().MirrorFromSaas(
22+
tester.Ctx(), "CSG_repo", "r", "u", types.ModelRepo,
23+
).Return(nil)
24+
25+
tester.Execute()
26+
tester.ResponseEq(t, 200, tester.OKText, nil)
27+
})
28+
29+
t.Run("invalid", func(t *testing.T) {
30+
tester := NewRepoTester(t).WithHandleFunc(func(rp *RepoHandler) gin.HandlerFunc {
31+
return rp.MirrorFromSaas
32+
})
33+
tester.WithUser()
34+
35+
tester.WithKV("repo_type", types.ModelRepo)
36+
tester.Execute()
37+
tester.ResponseEq(t, 400, "Repo could not be mirrored", nil)
38+
})
39+
}

api/handler/repo_test.go

Lines changed: 0 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -678,35 +678,6 @@ func TestRepoHandler_CreateMirror(t *testing.T) {
678678
tester.ResponseEq(t, 200, tester.OKText, &database.Mirror{ID: 123})
679679
}
680680

681-
func TestRepoHandler_MirrorFromSaas(t *testing.T) {
682-
t.Run("valid", func(t *testing.T) {
683-
tester := NewRepoTester(t).WithHandleFunc(func(rp *RepoHandler) gin.HandlerFunc {
684-
return rp.MirrorFromSaas
685-
})
686-
tester.WithUser()
687-
688-
tester.WithParam("namespace", types.OpenCSGPrefix+"repo")
689-
tester.WithKV("repo_type", types.ModelRepo)
690-
tester.mocks.repo.EXPECT().MirrorFromSaas(
691-
tester.Ctx(), "CSG_repo", "r", "u", types.ModelRepo,
692-
).Return(nil)
693-
694-
tester.Execute()
695-
tester.ResponseEq(t, 200, tester.OKText, nil)
696-
})
697-
698-
t.Run("invalid", func(t *testing.T) {
699-
tester := NewRepoTester(t).WithHandleFunc(func(rp *RepoHandler) gin.HandlerFunc {
700-
return rp.MirrorFromSaas
701-
})
702-
tester.WithUser()
703-
704-
tester.WithKV("repo_type", types.ModelRepo)
705-
tester.Execute()
706-
tester.ResponseEq(t, 400, "Repo could not be mirrored", nil)
707-
})
708-
}
709-
710681
func TestRepoHandler_GetMirror(t *testing.T) {
711682
tester := NewRepoTester(t).WithHandleFunc(func(rp *RepoHandler) gin.HandlerFunc {
712683
return rp.GetMirror
@@ -985,24 +956,6 @@ func TestRepoHandler_SyncMirror(t *testing.T) {
985956
tester.ResponseEq(t, 200, tester.OKText, nil)
986957
}
987958

988-
func TestRepoHandler_MirrorProgress(t *testing.T) {
989-
tester := NewRepoTester(t).WithHandleFunc(func(rp *RepoHandler) gin.HandlerFunc {
990-
return rp.MirrorProgress
991-
})
992-
tester.WithUser()
993-
994-
tester.WithKV("repo_type", types.ModelRepo)
995-
tester.WithParam("id", "1")
996-
tester.mocks.repo.EXPECT().MirrorProgress(
997-
tester.Ctx(), types.ModelRepo, "u", "r", "u",
998-
).Return(types.LFSSyncProgressResp{Progress: []types.SingleLFSProgress{{Oid: "o1"}}}, nil)
999-
1000-
tester.Execute()
1001-
tester.ResponseEq(
1002-
t, 200, tester.OKText, types.LFSSyncProgressResp{Progress: []types.SingleLFSProgress{{Oid: "o1"}}},
1003-
)
1004-
}
1005-
1006959
func TestRepoHandler_CreateRepo(t *testing.T) {
1007960
tests := []struct {
1008961
name string

api/router/api.go

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -652,12 +652,6 @@ func createModelRoutes(config *config.Config,
652652
modelsGroup.PUT("/:namespace/:name/mirror", middlewareCollection.Auth.NeedLogin, repoCommonHandler.UpdateMirror)
653653
modelsGroup.DELETE("/:namespace/:name/mirror", middlewareCollection.Auth.NeedLogin, repoCommonHandler.DeleteMirror)
654654
modelsGroup.POST("/:namespace/:name/mirror/sync", middlewareCollection.Auth.NeedLogin, repoCommonHandler.SyncMirror)
655-
modelsGroup.GET("/:namespace/:name/mirror/progress", middlewareCollection.Auth.NeedLogin, repoCommonHandler.MirrorProgress)
656-
// mirror from SaaS, only on-premises available
657-
if !config.Saas {
658-
modelsGroup.POST("/:namespace/:name/mirror_from_saas", middlewareCollection.Auth.NeedLogin, repoCommonHandler.MirrorFromSaas)
659-
}
660-
661655
// runtime framework
662656
modelsGroup.GET("/:namespace/:name/runtime_framework", repoCommonHandler.RuntimeFrameworkList)
663657
modelsGroup.GET("/:namespace/:name/runtime_framework_v2", repoCommonHandler.RuntimeFrameworkListV2)
@@ -789,11 +783,6 @@ func createDatasetRoutes(
789783
datasetsGroup.PUT("/:namespace/:name/mirror", middleware.MustLogin(), repoCommonHandler.UpdateMirror)
790784
datasetsGroup.DELETE("/:namespace/:name/mirror", middleware.MustLogin(), repoCommonHandler.DeleteMirror)
791785
datasetsGroup.POST("/:namespace/:name/mirror/sync", middleware.MustLogin(), repoCommonHandler.SyncMirror) // TODO: check license
792-
datasetsGroup.GET("/:namespace/:name/mirror/progress", middleware.MustLogin(), repoCommonHandler.MirrorProgress)
793-
// mirror from SaaS, only on-premises available
794-
if !config.Saas {
795-
datasetsGroup.POST("/:namespace/:name/mirror_from_saas", middlewareCollection.Auth.NeedLogin, repoCommonHandler.MirrorFromSaas)
796-
}
797786
}
798787
}
799788

@@ -845,11 +834,6 @@ func createCodeRoutes(
845834
codesGroup.PUT("/:namespace/:name/mirror", middlewareCollection.Auth.NeedLogin, repoCommonHandler.UpdateMirror)
846835
codesGroup.DELETE("/:namespace/:name/mirror", middlewareCollection.Auth.NeedLogin, repoCommonHandler.DeleteMirror)
847836
codesGroup.POST("/:namespace/:name/mirror/sync", middlewareCollection.Auth.NeedLogin, repoCommonHandler.SyncMirror)
848-
codesGroup.GET("/:namespace/:name/mirror/progress", middlewareCollection.Auth.NeedLogin, repoCommonHandler.MirrorProgress)
849-
// mirror from SaaS, only on-premises available
850-
if !config.Saas {
851-
codesGroup.POST("/:namespace/:name/mirror_from_saas", middlewareCollection.Auth.NeedLogin, repoCommonHandler.MirrorFromSaas)
852-
}
853837
}
854838
}
855839

@@ -938,11 +922,6 @@ func createSpaceRoutes(config *config.Config,
938922
spaces.PUT("/:namespace/:name/mirror", middlewareCollection.Auth.NeedLogin, repoCommonHandler.UpdateMirror)
939923
spaces.DELETE("/:namespace/:name/mirror", middlewareCollection.Auth.NeedLogin, repoCommonHandler.DeleteMirror)
940924
spaces.POST("/:namespace/:name/mirror/sync", middlewareCollection.Auth.NeedLogin, repoCommonHandler.SyncMirror)
941-
spaces.GET("/:namespace/:name/mirror/progress", middlewareCollection.Auth.NeedLogin, repoCommonHandler.MirrorProgress)
942-
// mirror from SaaS, only on-premises available
943-
if !config.Saas {
944-
spaces.POST("/:namespace/:name/mirror_from_saas", middlewareCollection.Auth.NeedLogin, repoCommonHandler.MirrorFromSaas)
945-
}
946925
spaces.GET("/:namespace/:name/run", middlewareCollection.Auth.NeedLogin, repoCommonHandler.DeployList)
947926
spaces.GET("/:namespace/:name/run/:id", middlewareCollection.Auth.NeedLogin, repoCommonHandler.DeployDetail)
948927
spaces.GET("/:namespace/:name/run/:id/status", middlewareCollection.Auth.NeedLogin, repoCommonHandler.DeployStatus)
@@ -1208,8 +1187,6 @@ func createPromptRoutes(
12081187
promptGrp.PUT("/:namespace/:name/mirror", middlewareCollection.Auth.NeedLogin, repoCommonHandler.UpdateMirror)
12091188
promptGrp.DELETE("/:namespace/:name/mirror", middlewareCollection.Auth.NeedLogin, repoCommonHandler.DeleteMirror)
12101189
promptGrp.POST("/:namespace/:name/mirror/sync", middlewareCollection.Auth.NeedLogin, repoCommonHandler.SyncMirror)
1211-
promptGrp.GET("/:namespace/:name/mirror/progress", middlewareCollection.Auth.NeedLogin, repoCommonHandler.MirrorProgress)
1212-
promptGrp.POST("/:namespace/:name/mirror_from_saas", middlewareCollection.Auth.NeedLogin, repoCommonHandler.MirrorFromSaas)
12131190
}
12141191
promptInfoGrp := apiGroup.Group("/prompts_info")
12151192
promptInfoGrp.GET("/:namespace/:name", promptHandler.PromptDetail)

api/router/api_ce.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,24 @@
33
package router
44

55
import (
6+
"fmt"
7+
68
"github.com/gin-gonic/gin"
79
"opencsg.com/csghub-server/api/handler"
810
"opencsg.com/csghub-server/api/middleware"
911
"opencsg.com/csghub-server/common/config"
12+
"opencsg.com/csghub-server/common/types"
1013
)
1114

1215
func useAdvancedMiddleware(r *gin.Engine, config *config.Config) {}
1316

1417
func createAdvancedRoutes(apiGroup *gin.RouterGroup, middlewareCollection middleware.MiddlewareCollection, config *config.Config) error {
18+
repoHandler, err := handler.NewRepoHandler(config)
19+
if err != nil {
20+
return fmt.Errorf("failed to create repo handler: %w", err)
21+
}
22+
createRepoRoutes(apiGroup, middlewareCollection, repoHandler)
23+
1524
return nil
1625
}
1726

@@ -21,3 +30,29 @@ func createExtendedUserRoutes(apiGroup *gin.RouterGroup, middlewareCollection mi
2130
func createXnetRoutes(_ *gin.Engine, _ middleware.MiddlewareCollection, _ *config.Config) error {
2231
return nil
2332
}
33+
34+
func createRepoRoutes(apiGroup *gin.RouterGroup, middlewareCollection middleware.MiddlewareCollection, repoHandler *handler.RepoHandler) {
35+
modelsGroup := apiGroup.Group("/models")
36+
modelsGroup.Use(middleware.RepoType(types.ModelRepo), middlewareCollection.Repo.RepoExists)
37+
modelsGroup.POST("/:namespace/:name/mirror_from_saas", middlewareCollection.Auth.NeedLogin, repoHandler.MirrorFromSaas)
38+
39+
datasetsGroup := apiGroup.Group("/datasets")
40+
datasetsGroup.Use(middleware.RepoType(types.DatasetRepo), middlewareCollection.Repo.RepoExists)
41+
datasetsGroup.POST("/:namespace/:name/mirror_from_saas", middlewareCollection.Auth.NeedLogin, repoHandler.MirrorFromSaas)
42+
43+
codesGroup := apiGroup.Group("/codes")
44+
codesGroup.Use(middleware.RepoType(types.CodeRepo), middlewareCollection.Repo.RepoExists)
45+
codesGroup.POST("/:namespace/:name/mirror_from_saas", middlewareCollection.Auth.NeedLogin, repoHandler.MirrorFromSaas)
46+
47+
spacesGroup := apiGroup.Group("/spaces")
48+
spacesGroup.Use(middleware.RepoType(types.SpaceRepo), middlewareCollection.Repo.RepoExists)
49+
spacesGroup.POST("/:namespace/:name/mirror_from_saas", middlewareCollection.Auth.NeedLogin, repoHandler.MirrorFromSaas)
50+
51+
promptGroup := apiGroup.Group("/prompts")
52+
promptGroup.Use(middleware.RepoType(types.PromptRepo), middlewareCollection.Repo.RepoExists)
53+
promptGroup.POST("/:namespace/:name/mirror_from_saas", middlewareCollection.Auth.NeedLogin, repoHandler.MirrorFromSaas)
54+
55+
mcpGroup := apiGroup.Group("/mcps")
56+
mcpGroup.Use(middleware.RepoType(types.MCPServerRepo), middlewareCollection.Repo.RepoExists)
57+
mcpGroup.POST("/:namespace/:name/mirror_from_saas", middlewareCollection.Auth.NeedLogin, repoHandler.MirrorFromSaas)
58+
}

api/router/api_mcp.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,6 @@ func CreateMCPServerRoutes(
5454
mcpGroup.PUT("/:namespace/:name/incr_downloads", middlewareCollection.Auth.NeedLogin, repoCommonHandler.IncrDownloads)
5555
mcpGroup.POST("/:namespace/:name/upload_file", middlewareCollection.Auth.NeedLogin, repoCommonHandler.UploadFile)
5656
mcpGroup.GET("/:namespace/:name/mirror", middlewareCollection.Auth.NeedLogin, repoCommonHandler.GetMirror)
57-
mcpGroup.POST("/:namespace/:name/mirror_from_saas", middlewareCollection.Auth.NeedLogin, repoCommonHandler.MirrorFromSaas)
5857
mcpGroup.POST("/:namespace/:name/mirror/sync", middlewareCollection.Auth.NeedLogin, repoCommonHandler.SyncMirror)
59-
mcpGroup.GET("/:namespace/:name/mirror/progress", middlewareCollection.Auth.NeedLogin, repoCommonHandler.MirrorProgress)
6058
}
6159
}

0 commit comments

Comments
 (0)