From 313887967eeceacf1882c6ce4fef9b53b023ee9c Mon Sep 17 00:00:00 2001 From: wemeya Date: Tue, 17 May 2016 17:03:40 +0800 Subject: [PATCH] change api for statistics and project --- api/project.go | 51 +++++++++++++++++++++++++++--------------------- api/search.go | 2 +- api/statistic.go | 5 ++--- dao/dao_test.go | 5 ++--- dao/project.go | 37 +++++++++++++++++++++++++---------- 5 files changed, 61 insertions(+), 39 deletions(-) diff --git a/api/project.go b/api/project.go index e933d5a3f..989f5a5ab 100644 --- a/api/project.go +++ b/api/project.go @@ -113,34 +113,41 @@ func (p *ProjectAPI) Head() { // Get ... func (p *ProjectAPI) Get() { - queryProject := models.Project{UserID: p.userID} - projectName := p.GetString("project_name") - if len(projectName) > 0 { - queryProject.Name = "%" + projectName + "%" - } - isPublic := p.GetString("is_public") - if len(isPublic) > 0 { - public, err := strconv.ParseInt(isPublic, 10, 64) - if err != nil { - log.Errorf("Error parsing public property: %d, error: %v", isPublic, err) - p.CustomAbort(http.StatusBadRequest, "invalid project Id") - } - queryProject.Public = int(public) - } + var projectList []models.Project 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.") } - var projectList []models.Project - if isAdmin { - projectList, err = dao.GetAllProjects() - } else { - projectList, err = dao.GetUserRelevantProjects(queryProject) + projectName := p.GetString("project_name") + if len(projectName) > 0 { + projectName = "%" + projectName + "%" } - if err != nil { - log.Errorf("Error occured in QueryProject, error: %v", err) - p.CustomAbort(http.StatusInternalServerError, "Internal error.") + var public int + isPublic := p.GetString("is_public") + if len(isPublic) > 0 { + public, err = strconv.Atoi(isPublic) + if err != nil { + log.Errorf("Error parsing public property: %d, error: %v", isPublic, err) + p.CustomAbort(http.StatusBadRequest, "invalid project Id") + } + } + if public == 1 { + projectList, err = dao.GetPublicProjects(projectName) + if err != nil { + log.Errorf("Error occured in GetPulicProjects, error: %v", err) + p.CustomAbort(http.StatusInternalServerError, "Internal error.") + } + } else { + if isAdmin { + projectList, err = dao.GetAllProjects(projectName) + } else { + projectList, err = dao.GetUserRelevantProjects(p.userID, projectName) + } + if err != nil { + log.Errorf("Error occured in GetUserRelevantProjects, error: %v", err) + p.CustomAbort(http.StatusInternalServerError, "Internal error.") + } } for i := 0; i < len(projectList); i++ { if isAdmin { diff --git a/api/search.go b/api/search.go index f22b6b7f7..3acdc7ca8 100644 --- a/api/search.go +++ b/api/search.go @@ -55,7 +55,7 @@ func (s *SearchAPI) Get() { var projects []models.Project if isSysAdmin { - projects, err = dao.GetAllProjects() + projects, err = dao.GetAllProjects("") if err != nil { log.Errorf("failed to get all projects: %v", err) s.CustomAbort(http.StatusInternalServerError, "internal error") diff --git a/api/statistic.go b/api/statistic.go index 4d0561840..e90140b17 100644 --- a/api/statistic.go +++ b/api/statistic.go @@ -38,7 +38,6 @@ func (s *StatisticAPI) Prepare() { // Get total projects and repos of the user func (s *StatisticAPI) Get() { - queryProject := models.Project{UserID: s.userID} isAdmin, err := dao.IsAdminRole(s.userID) if err != nil { log.Errorf("Error occured in check admin, error: %v", err) @@ -46,9 +45,9 @@ func (s *StatisticAPI) Get() { } var projectList []models.Project if isAdmin { - projectList, err = dao.GetAllProjects() + projectList, err = dao.GetAllProjects("") } else { - projectList, err = dao.GetUserRelevantProjects(queryProject) + projectList, err = dao.GetUserRelevantProjects(s.userID, "") } if err != nil { log.Errorf("Error occured in QueryProject, error: %v", err) diff --git a/dao/dao_test.go b/dao/dao_test.go index 3845524b9..7f9f07978 100644 --- a/dao/dao_test.go +++ b/dao/dao_test.go @@ -599,8 +599,7 @@ func TestProjectPermission(t *testing.T) { } func TestGetUserRelevantProjects(t *testing.T) { - project := models.Project{UserID: currentUser.UserID} - projects, err := GetUserRelevantProjects(project) + projects, err := GetUserRelevantProjects(currentUser.UserID, "") if err != nil { t.Errorf("Error occurred in GetUserRelevantProjects: %v", err) } @@ -613,7 +612,7 @@ func TestGetUserRelevantProjects(t *testing.T) { } func TestGetAllProjects(t *testing.T) { - projects, err := GetAllProjects() + projects, err := GetAllProjects("") if err != nil { t.Errorf("Error occurred in GetAllProjects: %v", err) } diff --git a/dao/project.go b/dao/project.go index 57df692c9..616a50716 100644 --- a/dao/project.go +++ b/dao/project.go @@ -193,7 +193,7 @@ func SearchProjects(userID int) ([]models.Project, error) { } // GetUserRelevantProjects returns the projects based on publicity and user, disregarding the names etc. -func GetUserRelevantProjects(query models.Project) ([]models.Project, error) { +func GetUserRelevantProjects(userId int, projectName string) ([]models.Project, error) { o := orm.NewOrm() sql := `select distinct @@ -203,33 +203,50 @@ func GetUserRelevantProjects(query models.Project) ([]models.Project, error) { where p.deleted = 0 and pm.user_id= ?` queryParam := make([]interface{}, 1) - queryParam = append(queryParam, query.UserID) - if query.Public == 1 { - sql += ` and p.public = ?` - queryParam = append(queryParam, query.Public) - } - if query.Name != "" { + queryParam = append(queryParam, userId) + if projectName != "" { sql += " and p.name like ? " - queryParam = append(queryParam, query.Name) + queryParam = append(queryParam, projectName) } sql += " order by p.name " var r []models.Project _, err := o.Raw(sql, queryParam).QueryRows(&r) - if err != nil { return nil, err } return r, nil } +//GetPublicProjects return all public projects whose name like projectName +func GetPublicProjects(projectName string) ([]models.Project, error) { + o := orm.NewOrm() + var publicProjects []models.Project + sql := `select project_id, name, public + from project + where deleted = 0 and public=1` + if len(projectName) > 0 { + sql += " and name like '" + projectName + "'" + } + sql += " order by name " + _, err := o.Raw(sql).QueryRows(&publicProjects) + if err != nil { + return nil, err + } + return publicProjects, nil +} + // GetAllProjects returns all projects which are not deleted -func GetAllProjects() ([]models.Project, error) { +func GetAllProjects(projectName string) ([]models.Project, error) { o := orm.NewOrm() sql := `select project_id, name, public from project where deleted = 0` + if len(projectName) > 0 { + sql += " and name like '" + projectName + "'" + } + sql += " order by name " var projects []models.Project if _, err := o.Raw(sql).QueryRows(&projects); err != nil { return nil, err