Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

61 changes: 61 additions & 0 deletions _mocks/opencsg.com/csghub-server/component/mock_RepoComponent.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

37 changes: 37 additions & 0 deletions api/handler/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -3015,3 +3015,40 @@ func (h *RepoHandler) ChangePath(ctx *gin.Context) {
}
httpbase.OK(ctx, nil)
}

// GetRepos godoc
// @Security ApiKey
// @Summary Get repo paths with search query
// @Tags Repository
// @Accept json
// @Produce json
// @Param current_user query string false "current user name"
// @Param search query string true "search query"
// @Param type query string true "repository type query" enums(model, dataset, code, space, mcpserver)
// @Success 200 {object} types.Response{data=[]string} "OK"
// @Failure 400 {object} types.APIBadRequest "Bad request"
// @Failure 500 {object} types.APIInternalServerError "Internal server error"
// @Router /repos [get]
func (h *RepoHandler) GetRepos(ctx *gin.Context) {
currentUser := httpbase.GetCurrentUser(ctx)
search := ctx.Query("search")
repositoryType := ctx.Query("type")
repoType := types.RepositoryType(repositoryType)
if repoType == types.UnknownRepo {
httpbase.BadRequest(ctx, "Unknown repository type")
return
}

repos, err := h.c.GetRepos(ctx.Request.Context(), search, currentUser, repoType)
if err != nil {
slog.Error(
"Failed to get repos",
slog.Any("error", err))
httpbase.ServerError(ctx, err)
return
}
slog.Debug(
"Get repos succeed",
slog.String("search", search))
httpbase.OK(ctx, repos)
}
12 changes: 12 additions & 0 deletions api/handler/repo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1528,3 +1528,15 @@ func TestRepoHandler_CommitFiles(t *testing.T) {
t, 200, tester.OKText, nil,
)
}

func TestRepoHandler_GetRepos(t *testing.T) {
tester := NewRepoTester(t).WithHandleFunc(func(rp *RepoHandler) gin.HandlerFunc {
return rp.GetRepos
})
tester.mocks.repo.EXPECT().GetRepos(mock.Anything, "search", "u", types.ModelRepo).Return([]string{}, nil).Once()
tester.WithQuery("type", "model").WithQuery("search", "search").WithUser().Execute()

tester.ResponseEq(
t, 200, tester.OKText, []string{},
)
}
3 changes: 3 additions & 0 deletions api/router/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,9 @@ func NewRouter(config *config.Config, enableSwagger bool) (*gin.Engine, error) {
versionHandler := handler.NewVersionHandler()
apiGroup.GET("/version", versionHandler.Version)

// Admin user get repo path list
apiGroup.GET("/repos", middlewareCollection.Auth.NeedAdmin, repoCommonHandler.GetRepos)

// TODO:use middleware to handle common response
//
memoryStore := persist.NewMemoryStore(1 * time.Minute)
Expand Down
16 changes: 16 additions & 0 deletions builder/store/database/repository.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ type RepoStore interface {
FindByRepoTypeAndPaths(ctx context.Context, repoType types.RepositoryType, path []string) ([]Repository, error)
FindUnhashedRepos(ctx context.Context, batchSize int, lastID int64) ([]Repository, error)
UpdateRepoSensitiveCheckStatus(ctx context.Context, repoID int64, status types.SensitiveCheckStatus) error
GetReposBySearch(ctx context.Context, search string, repoType types.RepositoryType, page, pageSize int) ([]*Repository, int, error)
}

func (s *repoStoreImpl) UpdateRepoSensitiveCheckStatus(ctx context.Context, repoID int64, status types.SensitiveCheckStatus) error {
Expand Down Expand Up @@ -1395,3 +1396,18 @@ func (s *repoStoreImpl) FindUnhashedRepos(ctx context.Context, batchSize int, la
Scan(ctx)
return res, err
}

func (s *repoStoreImpl) GetReposBySearch(ctx context.Context, search string, repoType types.RepositoryType, page, pageSize int) ([]*Repository, int, error) {
var (
res []*Repository
count int
err error
)
count, err = s.db.Operator.Core.NewSelect().
Model(&res).
Where("path like ? and repository_type = ?", fmt.Sprintf("%%%s%%", search), repoType).
Offset((page - 1) * pageSize).
Limit(pageSize).
ScanAndCount(ctx)
return res, count, err
}
30 changes: 30 additions & 0 deletions builder/store/database/repository_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1821,3 +1821,33 @@ func TestRepoStore_UpdateRepoSensitiveCheckStatus(t *testing.T) {
require.Nil(t, err)
require.Equal(t, types.SensitiveCheckPass, rp.SensitiveCheckStatus)
}

func TestRepoStore_GetReposBySearch(t *testing.T) {
db := tests.InitTestDB()
defer db.Close()
ctx := context.TODO()

// insert a new repo
rs := database.NewRepoStoreWithDB(db)
for i := 0; i < 10; i++ {
_, err := db.Operator.Core.NewInsert().Model(&database.Repository{
UserID: 1,
Path: fmt.Sprintf("%s/%d", "path", i),
GitPath: fmt.Sprintf("datasets_%s/%d", "path", i),
Name: fmt.Sprintf("name_%d", i),
DefaultBranch: "main",
Nickname: "ww",
Description: "ww",
Private: false,
RepositoryType: types.DatasetRepo,
Source: "opencsg",
Hashed: false,
}).Exec(ctx)
require.Nil(t, err)
}

repos, total, err := rs.GetReposBySearch(ctx, "path/1", types.DatasetRepo, 1, 10)
require.Nil(t, err)
require.NotNil(t, repos)
require.Equal(t, 1, total)
}
13 changes: 13 additions & 0 deletions component/repo.go
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ type RepoComponent interface {
BatchMigrateRepoToHashedPath(ctx context.Context, auto bool, batchSize int, lastID int64) (int64, error)
GetMirrorTaskStatusAndSyncStatus(repo *database.Repository) (types.MirrorTaskStatus, types.RepositorySyncStatus)
CheckDeployPermissionForUser(ctx context.Context, deployReq types.DeployActReq) (*database.User, *database.Deploy, error)
GetRepos(ctx context.Context, search, currentUser string, repoType types.RepositoryType) ([]string, error)
IsXnetEnabled(ctx context.Context, repoType types.RepositoryType, namespace, name, username string) (*types.XetEnabled, error)
}

Expand Down Expand Up @@ -4073,3 +4074,15 @@ func (c *repoComponentImpl) GetMirrorTaskStatusAndSyncStatus(repo *database.Repo
func (c *repoComponentImpl) RandomPath() []string {
return strings.SplitN(uuid.NewString(), "-", 2)
}

func (c *repoComponentImpl) GetRepos(ctx context.Context, search, currentUser string, repoType types.RepositoryType) ([]string, error) {
var repoPaths []string
repos, _, err := c.repoStore.GetReposBySearch(ctx, search, repoType, 1, 10)
if err != nil {
return repoPaths, fmt.Errorf("failed to get repos, error: %w", err)
}
for _, repo := range repos {
repoPaths = append(repoPaths, repo.Path)
}
return repoPaths, nil
}
13 changes: 13 additions & 0 deletions component/repo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3244,3 +3244,16 @@ func TestRepoComponent_SendAssetManagementMsg(t *testing.T) {
require.Nil(t, err)
wg.Wait()
}

func TestRepoComponent_GetRepos(t *testing.T) {
ctx := context.Background()

repoComp := initializeTestRepoComponent(ctx, t)

repoComp.mocks.stores.RepoMock().EXPECT().GetReposBySearch(ctx, "search", types.ModelRepo, 1, 10).
Return([]*database.Repository{{ID: 1, Path: "ns/name"}}, 1, nil).Once()
paths, err := repoComp.GetRepos(ctx, "search", "u", types.ModelRepo)
require.NoError(t, err)
require.Equal(t, 1, len(paths))
require.Equal(t, "ns/name", paths[0])
}
Loading