// Get ... func (s *SearchAPI) Get() { userID, _, ok := s.GetUserIDForRequest() if !ok { userID = dao.NonExistUserID } keyword := s.GetString("q") isSysAdmin, err := dao.IsAdminRole(userID) if err != nil { log.Errorf("failed to check whether the user %d is system admin: %v", userID, err) s.CustomAbort(http.StatusInternalServerError, "internal error") } var projects []models.Project if isSysAdmin { projects, err = dao.GetProjects("") if err != nil { log.Errorf("failed to get all projects: %v", err) s.CustomAbort(http.StatusInternalServerError, "internal error") } } else { projects, err = dao.SearchProjects(userID) if err != nil { log.Errorf("failed to get user %d 's relevant projects: %v", userID, err) s.CustomAbort(http.StatusInternalServerError, "internal error") } } projectSorter := &models.ProjectSorter{Projects: projects} sort.Sort(projectSorter) projectResult := []map[string]interface{}{} for _, p := range projects { match := true if len(keyword) > 0 && !strings.Contains(p.Name, keyword) { match = false } if match { entry := make(map[string]interface{}) entry["id"] = p.ProjectID entry["name"] = p.Name entry["public"] = p.Public projectResult = append(projectResult, entry) } } repositories, err := cache.GetRepoFromCache() if err != nil { log.Errorf("failed to list repositories: %v", err) s.CustomAbort(http.StatusInternalServerError, "") } sort.Strings(repositories) repositoryResult := filterRepositories(repositories, projects, keyword) result := &searchResult{Project: projectResult, Repository: repositoryResult} s.Data["json"] = result s.ServeJSON() }
// List ... func (p *ProjectAPI) List() { var total int64 var public int var err error page, pageSize := p.GetPaginationParams() var projectList []models.Project projectName := p.GetString("project_name") isPublic := p.GetString("is_public") if len(isPublic) > 0 { public, err = strconv.Atoi(isPublic) if err != nil { log.Errorf("Error parsing public property: %v, error: %v", isPublic, err) p.CustomAbort(http.StatusBadRequest, "invalid project Id") } } isAdmin := false if public == 1 { total, err = dao.GetTotalOfProjects(projectName, 1) if err != nil { log.Errorf("failed to get total of projects: %v", err) p.CustomAbort(http.StatusInternalServerError, "") } projectList, err = dao.GetProjects(projectName, 1, pageSize, pageSize*(page-1)) if err != nil { log.Errorf("failed to get projects: %v", err) p.CustomAbort(http.StatusInternalServerError, "") } } else { //if the request is not for public projects, user must login or provide credential p.userID = p.ValidateUser() isAdmin, err = dao.IsAdminRole(p.userID) if err != nil { log.Errorf("Error occured in check admin, error: %v", err) p.CustomAbort(http.StatusInternalServerError, "Internal error.") } if isAdmin { total, err = dao.GetTotalOfProjects(projectName) if err != nil { log.Errorf("failed to get total of projects: %v", err) p.CustomAbort(http.StatusInternalServerError, "") } projectList, err = dao.GetProjects(projectName, pageSize, pageSize*(page-1)) if err != nil { log.Errorf("failed to get projects: %v", err) p.CustomAbort(http.StatusInternalServerError, "") } } else { total, err = dao.GetTotalOfUserRelevantProjects(p.userID, projectName) if err != nil { log.Errorf("failed to get total of projects: %v", err) p.CustomAbort(http.StatusInternalServerError, "") } projectList, err = dao.GetUserRelevantProjects(p.userID, projectName, pageSize, pageSize*(page-1)) if err != nil { log.Errorf("failed to get projects: %v", err) p.CustomAbort(http.StatusInternalServerError, "") } } } for i := 0; i < len(projectList); i++ { if public != 1 { if isAdmin { projectList[i].Role = models.PROJECTADMIN } else { roles, err := dao.GetUserProjectRoles(p.userID, projectList[i].ProjectID) if err != nil { log.Errorf("failed to get user's project role: %v", err) p.CustomAbort(http.StatusInternalServerError, "") } projectList[i].Role = roles[0].RoleID } if projectList[i].Role == models.PROJECTADMIN { projectList[i].Togglable = true } } repos, err := dao.GetRepositoryByProjectName(projectList[i].Name) if err != nil { log.Errorf("failed to get repositories of project %s: %v", projectList[i].Name, err) p.CustomAbort(http.StatusInternalServerError, "") } projectList[i].RepoCount = len(repos) } p.SetPaginationHeader(total, page, pageSize) p.Data["json"] = projectList p.ServeJSON() }