From d7b867ebcc3d213628ac79d191121f0fc87de4f2 Mon Sep 17 00:00:00 2001 From: Wenkai Yin Date: Thu, 9 Mar 2017 13:32:26 +0800 Subject: [PATCH] bug fix in search API: do not return duplicate projects when user does not login --- src/common/dao/project.go | 2 +- src/ui/api/search.go | 40 ++++++++++++++++++++++----------------- src/ui/api/search_test.go | 14 +++++++++++++- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/common/dao/project.go b/src/common/dao/project.go index 9f476dd0c..effe17c12 100644 --- a/src/common/dao/project.go +++ b/src/common/dao/project.go @@ -171,7 +171,7 @@ func SearchProjects(userID int) ([]models.Project, error) { sql := `select distinct p.project_id, p.name, p.public, - p.owner_id, p.creation_time, p.update_time, pm.role role + p.owner_id, p.creation_time, p.update_time from project p left join project_member pm on p.project_id = pm.project_id diff --git a/src/ui/api/search.go b/src/ui/api/search.go index ea3b80cee..4d0bd57f0 100644 --- a/src/ui/api/search.go +++ b/src/ui/api/search.go @@ -73,30 +73,36 @@ func (s *SearchAPI) Get() { sort.Sort(projectSorter) projectResult := []models.Project{} for _, p := range projects { - match := true if len(keyword) > 0 && !strings.Contains(p.Name, keyword) { - match = false + continue } - if match { - if userID != dao.NonExistUserID { - if isSysAdmin { - p.Role = models.PROJECTADMIN - } - if p.Role == models.PROJECTADMIN { - p.Togglable = true + + if userID != dao.NonExistUserID { + if isSysAdmin { + p.Role = models.PROJECTADMIN + } else { + roles, err := dao.GetUserProjectRoles(userID, p.ProjectID) + if err != nil { + log.Errorf("failed to get user's project role: %v", err) + s.CustomAbort(http.StatusInternalServerError, "") } + p.Role = roles[0].RoleID } - repos, err := dao.GetRepositoryByProjectName(p.Name) - if err != nil { - log.Errorf("failed to get repositories of project %s: %v", p.Name, err) - s.CustomAbort(http.StatusInternalServerError, "") + if p.Role == models.PROJECTADMIN { + p.Togglable = true } - - p.RepoCount = len(repos) - - projectResult = append(projectResult, p) } + + repos, err := dao.GetRepositoryByProjectName(p.Name) + if err != nil { + log.Errorf("failed to get repositories of project %s: %v", p.Name, err) + s.CustomAbort(http.StatusInternalServerError, "") + } + + p.RepoCount = len(repos) + + projectResult = append(projectResult, p) } repositoryResult, err := filterRepositories(projects, keyword) diff --git a/src/ui/api/search_test.go b/src/ui/api/search_test.go index ee5442a88..62649503f 100644 --- a/src/ui/api/search_test.go +++ b/src/ui/api/search_test.go @@ -28,7 +28,19 @@ func TestSearch(t *testing.T) { } //--------case 2 : Response Code = 200, sysAdmin and search repo--------// - httpStatusCode, result, err = apiTest.SearchGet("docker", *admin) + httpStatusCode, result, err = apiTest.SearchGet("library", *admin) + if err != nil { + t.Error("Error while search project or repository", err.Error()) + t.Log(err) + } else { + assert.Equal(int(200), httpStatusCode, "httpStatusCode should be 200") + assert.Equal("library", result.Repositories[0].ProjectName, "Project name should be library") + assert.Equal("library/docker", result.Repositories[0].RepositoryName, "Repository name should be library/docker") + assert.Equal(int32(1), result.Repositories[0].ProjectPublic, "Project public status should be 1 (true)") + } + + //--------case 3 : Response Code = 200, normal user and search repo--------// + httpStatusCode, result, err = apiTest.SearchGet("library", *testUser) if err != nil { t.Error("Error while search project or repository", err.Error()) t.Log(err)