mirror of https://github.com/goharbor/harbor.git
refinement
This commit is contained in:
parent
a8fde4d97a
commit
90aef78b1b
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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{})
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 || [];
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue