refinement

This commit is contained in:
Tan Jiang 2016-02-17 14:29:05 +08:00
parent a8fde4d97a
commit 90aef78b1b
7 changed files with 46 additions and 45 deletions

View File

@ -60,7 +60,8 @@ create table project (
deleted tinyint (1) DEFAULT 0 NOT NULL, deleted tinyint (1) DEFAULT 0 NOT NULL,
public tinyint (1) DEFAULT 0 NOT NULL, public tinyint (1) DEFAULT 0 NOT NULL,
primary key (project_id), primary key (project_id),
FOREIGN KEY (owner_id) REFERENCES user(user_id) FOREIGN KEY (owner_id) REFERENCES user(user_id),
UNIQUE (name)
); );
insert into project values insert into project values

View File

@ -38,6 +38,8 @@ type projectReq struct {
Public bool `json:"public"` Public bool `json:"public"`
} }
const PROJECT_NAME_MAX_LEN int = 30
func (p *ProjectAPI) Prepare() { func (p *ProjectAPI) Prepare() {
p.userId = p.ValidateUser() p.userId = p.ValidateUser()
id_str := p.Ctx.Input.Param(":id") id_str := p.Ctx.Input.Param(":id")
@ -48,12 +50,12 @@ func (p *ProjectAPI) Prepare() {
log.Printf("Error parsing project id: %s, error: %v", id_str, err) log.Printf("Error parsing project id: %s, error: %v", id_str, err)
p.CustomAbort(400, "invalid project id") p.CustomAbort(400, "invalid project id")
} }
proj, err := dao.GetProjectById(models.Project{ProjectId: p.projectId}) exist, err := dao.ProjectExists(p.projectId)
if err != nil { if err != nil {
log.Printf("Error occurred in GetProjectById: %v", err) log.Printf("Error occurred in ProjectExists: %v", err)
p.CustomAbort(500, "Internal error.") p.CustomAbort(500, "Internal error.")
} }
if proj == nil { if !exist {
p.CustomAbort(404, fmt.Sprintf("project does not exist, id: %v", p.projectId)) p.CustomAbort(404, fmt.Sprintf("project does not exist, id: %v", p.projectId))
} }
} }
@ -66,6 +68,12 @@ func (p *ProjectAPI) Post() {
if req.Public { if req.Public {
public = 1 public = 1
} }
err := validateProjectReq(req)
if err != nil {
beego.Error("Invalid project request, error: ", err)
p.RenderError(400, "Invalid request for creating project")
return
}
projectName := req.ProjectName projectName := req.ProjectName
exist, err := dao.ProjectExists(projectName) exist, err := dao.ProjectExists(projectName)
if err != nil { if err != nil {
@ -76,13 +84,18 @@ func (p *ProjectAPI) Post() {
return return
} }
project := models.Project{OwnerId: p.userId, Name: projectName, CreationTime: time.Now(), Public: public} project := models.Project{OwnerId: p.userId, Name: projectName, CreationTime: time.Now(), Public: public}
dao.AddProject(project) err = dao.AddProject(project)
if err != nil {
beego.Error("Failed to add project, error: %v", err)
p.RenderError(500, "Failed to add project")
}
} }
func (p *ProjectAPI) Head() { func (p *ProjectAPI) Head() {
projectName := p.GetString("project_name") projectName := p.GetString("project_name")
result, err := dao.ProjectExists(projectName) result, err := dao.ProjectExists(projectName)
if err != nil { if err != nil {
beego.Error("Error while communicating with DB: ", err)
p.RenderError(500, "Error while communicating with DB") p.RenderError(500, "Error while communicating with DB")
return return
} }
@ -130,16 +143,6 @@ func (p *ProjectAPI) Put() {
if req.Public { if req.Public {
public = 1 public = 1
} }
proj, err := dao.GetProjectById(models.Project{ProjectId: projectId})
if err != nil {
beego.Error("Error occurred in GetProjectById:", err)
p.CustomAbort(500, "Internal error.")
}
if proj == nil {
p.RenderError(404, "")
return
}
if !isProjectAdmin(p.userId, projectId) { if !isProjectAdmin(p.userId, projectId) {
beego.Warning("Current user, id:", p.userId, ", does not have project admin role for project, id:", projectId) beego.Warning("Current user, id:", p.userId, ", does not have project admin role for project, id:", projectId)
p.RenderError(403, "") p.RenderError(403, "")
@ -152,18 +155,6 @@ func (p *ProjectAPI) Put() {
} }
} }
func (p *ProjectAPI) ListAccessLog() {
query := models.AccessLog{ProjectId: p.projectId}
accessLogList, err := dao.GetAccessLogs(query)
if err != nil {
log.Printf("Error occurred in GetAccessLogs: %v", err)
p.CustomAbort(500, "Internal error.")
}
p.Data["json"] = accessLogList
p.ServeJSON()
}
func (p *ProjectAPI) FilterAccessLog() { func (p *ProjectAPI) FilterAccessLog() {
var filter models.AccessLog var filter models.AccessLog
@ -193,3 +184,14 @@ func isProjectAdmin(userId int, pid int64) bool {
} }
return len(rolelist) > 0 return len(rolelist) > 0
} }
func validateProjectReq(req projectReq) error {
pn := req.ProjectName
if len(pn) == 0 {
return fmt.Errorf("Project name can not be empty")
}
if len(pn) > PROJECT_NAME_MAX_LEN {
return fmt.Errorf("Project name is too long")
}
return nil
}

View File

@ -121,7 +121,7 @@ func QueryProject(query models.Project) ([]models.Project, error) {
queryParam = append(queryParam, query.Name) queryParam = append(queryParam, query.Name)
} }
sql += " order by p.creation_time desc " sql += " order by p.name "
var r []models.Project var r []models.Project
_, err := o.Raw(sql, queryParam).QueryRows(&r) _, err := o.Raw(sql, queryParam).QueryRows(&r)

View File

@ -1,16 +1,16 @@
/* /*
Copyright (c) 2016 VMware, Inc. All Rights Reserved. Copyright (c) 2016 VMware, Inc. All Rights Reserved.
Licensed under the Apache License, Version 2.0 (the "License"); Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License. you may not use this file except in compliance with the License.
You may obtain a copy of the License at You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0 http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
*/ */
package models package models

View File

@ -53,7 +53,6 @@ func init() {
beego.Router("/api/search", &api.SearchAPI{}) beego.Router("/api/search", &api.SearchAPI{})
beego.Router("/api/projects/:pid/members/?:mid", &api.ProjectMemberAPI{}) beego.Router("/api/projects/:pid/members/?:mid", &api.ProjectMemberAPI{})
beego.Router("/api/projects/?:id", &api.ProjectAPI{}) beego.Router("/api/projects/?:id", &api.ProjectAPI{})
beego.Router("/api/projects/:id/logs", &api.ProjectAPI{}, "get:ListAccessLog")
beego.Router("/api/projects/:id/logs/filter", &api.ProjectAPI{}, "post:FilterAccessLog") beego.Router("/api/projects/:id/logs/filter", &api.ProjectAPI{}, "post:FilterAccessLog")
beego.Router("/api/users/?:id", &api.UserAPI{}) beego.Router("/api/users/?:id", &api.UserAPI{})
beego.Router("/api/repositories", &api.RepositoryAPI{}) beego.Router("/api/repositories", &api.RepositoryAPI{})

View File

@ -168,7 +168,6 @@ func makeTokenCore(issuer, subject, audience string, expiration int,
signature := base64UrlEncode(signatureBytes) signature := base64UrlEncode(signatureBytes)
tokenString := fmt.Sprintf("%s.%s", payload, signature) tokenString := fmt.Sprintf("%s.%s", payload, signature)
//log.Printf("token: %s", tokenString)
return token.NewToken(tokenString) return token.NewToken(tokenString)
} }

View File

@ -354,9 +354,9 @@ jQuery(function(){
$.when( $.when(
new AjaxUtil({ new AjaxUtil({
url : "/api/projects/" + projectId + "/logs", url : "/api/projects/" + projectId + "/logs/filter",
dataRaw: {"timestamp": new Date().getTime()}, data: {},
type: "get", type: "post",
success: function(data){ success: function(data){
return data || []; return data || [];
} }