delete owner_id column from table repository

This commit is contained in:
Wenkai Yin 2017-04-27 18:19:28 +08:00
parent eb39fbf814
commit 4f9d9ed5d8
17 changed files with 182 additions and 222 deletions

View File

@ -116,7 +116,6 @@ create table repository (
repository_id int NOT NULL AUTO_INCREMENT, repository_id int NOT NULL AUTO_INCREMENT,
name varchar(255) NOT NULL, name varchar(255) NOT NULL,
project_id int NOT NULL, project_id int NOT NULL,
owner_id int NOT NULL,
description text, description text,
pull_count int DEFAULT 0 NOT NULL, pull_count int DEFAULT 0 NOT NULL,
star_count int DEFAULT 0 NOT NULL, star_count int DEFAULT 0 NOT NULL,

View File

@ -113,13 +113,11 @@ create table repository (
repository_id INTEGER PRIMARY KEY, repository_id INTEGER PRIMARY KEY,
name varchar(255) NOT NULL, name varchar(255) NOT NULL,
project_id int NOT NULL, project_id int NOT NULL,
owner_id int NOT NULL,
description text, description text,
pull_count int DEFAULT 0 NOT NULL, pull_count int DEFAULT 0 NOT NULL,
star_count int DEFAULT 0 NOT NULL, star_count int DEFAULT 0 NOT NULL,
creation_time timestamp default CURRENT_TIMESTAMP, creation_time timestamp default CURRENT_TIMESTAMP,
update_time timestamp default CURRENT_TIMESTAMP, update_time timestamp default CURRENT_TIMESTAMP,
FOREIGN KEY (owner_id) REFERENCES user(user_id),
FOREIGN KEY (project_id) REFERENCES project(project_id), FOREIGN KEY (project_id) REFERENCES project(project_id),
UNIQUE (name) UNIQUE (name)
); );

View File

@ -215,24 +215,6 @@ func GetRecentLogs(userID, linesNum int, startTime, endTime string) ([]models.Ac
return logs, nil return logs, nil
} }
// GetAccessLogCreator ...
func GetAccessLogCreator(repoName string) (string, error) {
o := GetOrmer()
sql := "select * from user where user_id = (select user_id from access_log where operation = 'push' and repo_name = ? order by op_time desc limit 1)"
var u []models.User
n, err := o.Raw(sql, repoName).QueryRows(&u)
if err != nil {
return "", err
}
if n == 0 {
return "", nil
}
return u[0].Username, nil
}
// CountPull ... // CountPull ...
func CountPull(repoName string) (int64, error) { func CountPull(repoName string) (int64, error) {
o := GetOrmer() o := GetOrmer()

View File

@ -192,7 +192,7 @@ func testForMySQL(m *testing.M) int {
}, },
} }
log.Infof("MYSQL_HOST: %s, MYSQL_USR: %s, MYSQL_PORT: %s, MYSQL_PWD: %s\n", dbHost, dbUser, dbPort, dbPassword) log.Infof("MYSQL_HOST: %s, MYSQL_USR: %s, MYSQL_PORT: %d, MYSQL_PWD: %s\n", dbHost, dbUser, dbPort, dbPassword)
return testForAll(m, database) return testForAll(m, database)
} }
@ -650,26 +650,6 @@ func TestAccessLog(t *testing.T) {
} }
} }
func TestGetAccessLogCreator(t *testing.T) {
var err error
err = AccessLog(currentUser.Username, currentProject.Name, currentProject.Name+"/tomcat", repoTag2, "push")
if err != nil {
t.Errorf("Error occurred in AccessLog: %v", err)
}
err = AccessLog(currentUser.Username, currentProject.Name, currentProject.Name+"/tomcat", repoTag2, "push")
if err != nil {
t.Errorf("Error occurred in AccessLog: %v", err)
}
user, err := GetAccessLogCreator(currentProject.Name + "/tomcat")
if err != nil {
t.Errorf("Error occurred in GetAccessLogCreator: %v", err)
}
if user != currentUser.Username {
t.Errorf("The access log creator does not match, expected: %s, actual: %s", currentUser.Username, user)
}
}
func TestCountPull(t *testing.T) { func TestCountPull(t *testing.T) {
var err error var err error
err = AccessLog(currentUser.Username, currentProject.Name, currentProject.Name+"/tomcat", repoTag2, "pull") err = AccessLog(currentUser.Username, currentProject.Name, currentProject.Name+"/tomcat", repoTag2, "pull")
@ -1595,8 +1575,7 @@ func TestGetOrmer(t *testing.T) {
func TestAddRepository(t *testing.T) { func TestAddRepository(t *testing.T) {
repoRecord := models.RepoRecord{ repoRecord := models.RepoRecord{
Name: currentProject.Name + "/" + repositoryName, Name: currentProject.Name + "/" + repositoryName,
OwnerName: currentUser.Username, ProjectID: currentProject.ProjectID,
ProjectName: currentProject.Name,
Description: "testing repo", Description: "testing repo",
PullCount: 0, PullCount: 0,
StarCount: 0, StarCount: 0,

View File

@ -24,13 +24,15 @@ import (
// AddRepository adds a repo to the database. // AddRepository adds a repo to the database.
func AddRepository(repo models.RepoRecord) error { func AddRepository(repo models.RepoRecord) error {
o := GetOrmer() if repo.ProjectID == 0 {
sql := "insert into repository (owner_id, project_id, name, description, pull_count, star_count, creation_time, update_time) " + return fmt.Errorf("invalid project ID: %d", repo.ProjectID)
"select (select user_id as owner_id from user where username=?), " + }
"(select project_id as project_id from project where name=?), ?, ?, ?, ?, ?, NULL "
_, err := o.Raw(sql, repo.OwnerName, repo.ProjectName, repo.Name, repo.Description, o := GetOrmer()
repo.PullCount, repo.StarCount, time.Now()).Exec() now := time.Now()
repo.CreationTime = now
repo.UpdateTime = now
_, err := o.Insert(&repo)
return err return err
} }
@ -104,7 +106,7 @@ func GetRepositoryByProjectName(name string) ([]*models.RepoRecord, error) {
//GetTopRepos returns the most popular repositories //GetTopRepos returns the most popular repositories
func GetTopRepos(userID int, count int) ([]*models.RepoRecord, error) { func GetTopRepos(userID int, count int) ([]*models.RepoRecord, error) {
sql := sql :=
`select r.repository_id, r.name, r.owner_id, `select r.repository_id, r.name,
r.project_id, r.description, r.pull_count, r.project_id, r.description, r.pull_count,
r.star_count, r.creation_time, r.update_time r.star_count, r.creation_time, r.update_time
from repository r from repository r

View File

@ -27,9 +27,8 @@ var (
project = "library" project = "library"
name = "library/repository-test" name = "library/repository-test"
repository = &models.RepoRecord{ repository = &models.RepoRecord{
Name: name, Name: name,
OwnerName: "admin", ProjectID: 1,
ProjectName: project,
} }
) )
@ -214,9 +213,8 @@ func TestGetTopRepos(t *testing.T) {
require.NoError(err) require.NoError(err)
repository1 := &models.RepoRecord{ repository1 := &models.RepoRecord{
Name: fmt.Sprintf("%v/repository1", project1.Name), Name: fmt.Sprintf("%v/repository1", project1.Name),
OwnerName: admin.Username, ProjectID: project1.ProjectID,
ProjectName: project1.Name,
} }
err = AddRepository(*repository1) err = AddRepository(*repository1)
require.NoError(err) require.NoError(err)
@ -225,9 +223,8 @@ func TestGetTopRepos(t *testing.T) {
require.NoError(err) require.NoError(err)
repository2 := &models.RepoRecord{ repository2 := &models.RepoRecord{
Name: fmt.Sprintf("%v/repository2", project1.Name), Name: fmt.Sprintf("%v/repository2", project1.Name),
OwnerName: admin.Username, ProjectID: project1.ProjectID,
ProjectName: project1.Name,
} }
err = AddRepository(*repository2) err = AddRepository(*repository2)
require.NoError(err) require.NoError(err)
@ -237,9 +234,8 @@ func TestGetTopRepos(t *testing.T) {
require.NoError(err) require.NoError(err)
repository3 := &models.RepoRecord{ repository3 := &models.RepoRecord{
Name: fmt.Sprintf("%v/repository3", project2.Name), Name: fmt.Sprintf("%v/repository3", project2.Name),
OwnerName: admin.Username, ProjectID: project2.ProjectID,
ProjectName: project2.Name,
} }
err = AddRepository(*repository3) err = AddRepository(*repository3)
require.NoError(err) require.NoError(err)
@ -259,9 +255,8 @@ func TestGetTopRepos(t *testing.T) {
deletedPublicProject.ProjectID, err = AddProject(deletedPublicProject) deletedPublicProject.ProjectID, err = AddProject(deletedPublicProject)
require.NoError(err) require.NoError(err)
deletedPublicRepository1 := &models.RepoRecord{ deletedPublicRepository1 := &models.RepoRecord{
Name: fmt.Sprintf("%v/repository1", deletedPublicProject.Name), Name: fmt.Sprintf("%v/repository1", deletedPublicProject.Name),
OwnerName: admin.Username, ProjectID: deletedPublicProject.ProjectID,
ProjectName: deletedPublicProject.Name,
} }
err = AddRepository(*deletedPublicRepository1) err = AddRepository(*deletedPublicRepository1)
require.NoError(err) require.NoError(err)
@ -303,9 +298,8 @@ func TestGetTotalOfRepositoriesByProject(t *testing.T) {
} }
if err := addRepository(&models.RepoRecord{ if err := addRepository(&models.RepoRecord{
Name: repoName, Name: repoName,
OwnerName: "admin", ProjectID: projectID,
ProjectName: "library",
}); err != nil { }); err != nil {
t.Errorf("failed to add repository %s: %v", repoName, err) t.Errorf("failed to add repository %s: %v", repoName, err)
return return
@ -333,9 +327,8 @@ func TestGetRepositoriesByProject(t *testing.T) {
repoName := "library/repository" repoName := "library/repository"
if err := addRepository(&models.RepoRecord{ if err := addRepository(&models.RepoRecord{
Name: repoName, Name: repoName,
OwnerName: "admin", ProjectID: projectID,
ProjectName: "library",
}); err != nil { }); err != nil {
t.Errorf("failed to add repository %s: %v", repoName, err) t.Errorf("failed to add repository %s: %v", repoName, err)
return return

View File

@ -20,7 +20,7 @@ import (
// AccessLog holds information about logs which are used to record the actions that user take to the resourses. // AccessLog holds information about logs which are used to record the actions that user take to the resourses.
type AccessLog struct { type AccessLog struct {
LogID int `orm:"pk;column(log_id)" json:"log_id"` LogID int `orm:"pk;auto;column(log_id)" json:"log_id"`
UserID int `orm:"column(user_id)" json:"user_id"` UserID int `orm:"column(user_id)" json:"user_id"`
ProjectID int64 `orm:"column(project_id)" json:"project_id"` ProjectID int64 `orm:"column(project_id)" json:"project_id"`
RepoName string `orm:"column(repo_name)" json:"repo_name"` RepoName string `orm:"column(repo_name)" json:"repo_name"`

View File

@ -20,7 +20,7 @@ import (
// Project holds the details of a project. // Project holds the details of a project.
type Project struct { type Project struct {
ProjectID int64 `orm:"pk;column(project_id)" json:"project_id"` ProjectID int64 `orm:"pk;auto;column(project_id)" json:"project_id"`
OwnerID int `orm:"column(owner_id)" json:"owner_id"` OwnerID int `orm:"column(owner_id)" json:"owner_id"`
Name string `orm:"column(name)" json:"name"` Name string `orm:"column(name)" json:"name"`
CreationTime time.Time `orm:"column(creation_time)" json:"creation_time"` CreationTime time.Time `orm:"column(creation_time)" json:"creation_time"`

View File

@ -48,7 +48,7 @@ const (
// RepPolicy is the model for a replication policy, which associate to a project and a target (destination) // RepPolicy is the model for a replication policy, which associate to a project and a target (destination)
type RepPolicy struct { type RepPolicy struct {
ID int64 `orm:"column(id)" json:"id"` ID int64 `orm:"pk;auto;column(id)" json:"id"`
ProjectID int64 `orm:"column(project_id)" json:"project_id"` ProjectID int64 `orm:"column(project_id)" json:"project_id"`
ProjectName string `json:"project_name,omitempty"` ProjectName string `json:"project_name,omitempty"`
TargetID int64 `orm:"column(target_id)" json:"target_id"` TargetID int64 `orm:"column(target_id)" json:"target_id"`
@ -95,7 +95,7 @@ func (r *RepPolicy) Valid(v *validation.Validation) {
// RepJob is the model for a replication job, which is the execution unit on job service, currently it is used to transfer/remove // RepJob is the model for a replication job, which is the execution unit on job service, currently it is used to transfer/remove
// a repository to/from a remote registry instance. // a repository to/from a remote registry instance.
type RepJob struct { type RepJob struct {
ID int64 `orm:"column(id)" json:"id"` ID int64 `orm:"pk;auto;column(id)" json:"id"`
Status string `orm:"column(status)" json:"status"` Status string `orm:"column(status)" json:"status"`
Repository string `orm:"column(repository)" json:"repository"` Repository string `orm:"column(repository)" json:"repository"`
PolicyID int64 `orm:"column(policy_id)" json:"policy_id"` PolicyID int64 `orm:"column(policy_id)" json:"policy_id"`
@ -109,7 +109,7 @@ type RepJob struct {
// RepTarget is the model for a replication targe, i.e. destination, which wraps the endpoint URL and username/password of a remote registry. // RepTarget is the model for a replication targe, i.e. destination, which wraps the endpoint URL and username/password of a remote registry.
type RepTarget struct { type RepTarget struct {
ID int64 `orm:"column(id)" json:"id"` ID int64 `orm:"pk;auto;column(id)" json:"id"`
URL string `orm:"column(url)" json:"endpoint"` URL string `orm:"column(url)" json:"endpoint"`
Name string `orm:"column(name)" json:"name"` Name string `orm:"column(name)" json:"name"`
Username string `orm:"column(username)" json:"username"` Username string `orm:"column(username)" json:"username"`

View File

@ -20,11 +20,8 @@ import (
// RepoRecord holds the record of an repository in DB, all the infors are from the registry notification event. // RepoRecord holds the record of an repository in DB, all the infors are from the registry notification event.
type RepoRecord struct { type RepoRecord struct {
RepositoryID string `orm:"column(repository_id);pk" json:"repository_id"` RepositoryID int64 `orm:"pk;auto;column(repository_id)" json:"repository_id"`
Name string `orm:"column(name)" json:"name"` Name string `orm:"column(name)" json:"name"`
OwnerName string `orm:"-"`
OwnerID int64 `orm:"column(owner_id)" json:"owner_id"`
ProjectName string `orm:"-"`
ProjectID int64 `orm:"column(project_id)" json:"project_id"` ProjectID int64 `orm:"column(project_id)" json:"project_id"`
Description string `orm:"column(description)" json:"description"` Description string `orm:"column(description)" json:"description"`
PullCount int64 `orm:"column(pull_count)" json:"pull_count"` PullCount int64 `orm:"column(pull_count)" json:"pull_count"`

View File

@ -25,7 +25,7 @@ const (
// Role holds the details of a role. // Role holds the details of a role.
type Role struct { type Role struct {
RoleID int `orm:"pk;column(role_id)" json:"role_id"` RoleID int `orm:"pk;auto;column(role_id)" json:"role_id"`
RoleCode string `orm:"column(role_code)" json:"role_code"` RoleCode string `orm:"column(role_code)" json:"role_code"`
Name string `orm:"column(name)" json:"role_name"` Name string `orm:"column(name)" json:"role_name"`

View File

@ -20,7 +20,7 @@ import (
// User holds the details of a user. // User holds the details of a user.
type User struct { type User struct {
UserID int `orm:"pk;column(user_id)" json:"user_id"` UserID int `orm:"pk;auto;column(user_id)" json:"user_id"`
Username string `orm:"column(username)" json:"username"` Username string `orm:"column(username)" json:"username"`
Email string `orm:"column(email)" json:"email"` Email string `orm:"column(email)" json:"email"`
Password string `orm:"column(password)" json:"password"` Password string `orm:"column(password)" json:"password"`

View File

@ -11,130 +11,127 @@
// 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.
/* /*
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 api package api
import ( import (
"os" "os"
"github.com/vmware/harbor/src/common/dao" "github.com/vmware/harbor/src/common/dao"
"github.com/vmware/harbor/src/common/models" "github.com/vmware/harbor/src/common/models"
) )
const ( const (
//Prepare Test info //Prepare Test info
TestUserName = "testUser0001" TestUserName = "testUser0001"
TestUserPwd = "testUser0001" TestUserPwd = "testUser0001"
TestUserEmail = "testUser0001@mydomain.com" TestUserEmail = "testUser0001@mydomain.com"
TestProName = "testProject0001" TestProName = "testProject0001"
TestTargetName = "testTarget0001" TestTargetName = "testTarget0001"
TestRepoName = "testRepo0001" TestRepoName = "testRepo0001"
AdminName = "admin" AdminName = "admin"
DefaultProjectName = "library" DefaultProjectName = "library"
) )
func CommonAddUser() { func CommonAddUser() {
commonUser := models.User{ commonUser := models.User{
Username: TestUserName, Username: TestUserName,
Password: TestUserPwd, Password: TestUserPwd,
Email: TestUserEmail, Email: TestUserEmail,
} }
_, _ = dao.Register(commonUser) _, _ = dao.Register(commonUser)
} }
func CommonGetUserID() int { func CommonGetUserID() int {
queryUser := &models.User{ queryUser := &models.User{
Username: TestUserName, Username: TestUserName,
} }
commonUser, _ := dao.GetUser(*queryUser) commonUser, _ := dao.GetUser(*queryUser)
return commonUser.UserID return commonUser.UserID
} }
func CommonDelUser() { func CommonDelUser() {
queryUser := &models.User{ queryUser := &models.User{
Username: TestUserName, Username: TestUserName,
} }
commonUser, _ := dao.GetUser(*queryUser) commonUser, _ := dao.GetUser(*queryUser)
_ = dao.DeleteUser(commonUser.UserID) _ = dao.DeleteUser(commonUser.UserID)
} }
func CommonAddProject() { func CommonAddProject() {
queryUser := &models.User{ queryUser := &models.User{
Username: "admin", Username: "admin",
} }
adminUser, _ := dao.GetUser(*queryUser) adminUser, _ := dao.GetUser(*queryUser)
commonProject := &models.Project{ commonProject := &models.Project{
Name: TestProName, Name: TestProName,
OwnerID: adminUser.UserID, OwnerID: adminUser.UserID,
} }
_, _ = dao.AddProject(*commonProject) _, _ = dao.AddProject(*commonProject)
} }
func CommonDelProject() { func CommonDelProject() {
commonProject, _ := dao.GetProjectByName(TestProName) commonProject, _ := dao.GetProjectByName(TestProName)
_ = dao.DeleteProject(commonProject.ProjectID) _ = dao.DeleteProject(commonProject.ProjectID)
} }
func CommonAddTarget() { func CommonAddTarget() {
endPoint := os.Getenv("REGISTRY_URL") endPoint := os.Getenv("REGISTRY_URL")
commonTarget := &models.RepTarget{ commonTarget := &models.RepTarget{
URL: endPoint, URL: endPoint,
Name: TestTargetName, Name: TestTargetName,
Username: adminName, Username: adminName,
Password: adminPwd, Password: adminPwd,
} }
_, _ = dao.AddRepTarget(*commonTarget) _, _ = dao.AddRepTarget(*commonTarget)
} }
func CommonGetTarget() int { func CommonGetTarget() int {
target, _ := dao.GetRepTargetByName(TestTargetName) target, _ := dao.GetRepTargetByName(TestTargetName)
return int(target.ID) return int(target.ID)
} }
func CommonDelTarget() { func CommonDelTarget() {
target, _ := dao.GetRepTargetByName(TestTargetName) target, _ := dao.GetRepTargetByName(TestTargetName)
_ = dao.DeleteRepTarget(target.ID) _ = dao.DeleteRepTarget(target.ID)
} }
func CommonPolicyEabled(policyID int, enabled int) { func CommonPolicyEabled(policyID int, enabled int) {
_ = dao.UpdateRepPolicyEnablement(int64(policyID), enabled) _ = dao.UpdateRepPolicyEnablement(int64(policyID), enabled)
} }
func CommonAddRepository() { func CommonAddRepository() {
commonRepository := &models.RepoRecord{ commonRepository := &models.RepoRecord{
RepositoryID: "1", RepositoryID: 1,
Name: TestRepoName, Name: TestRepoName,
OwnerName: AdminName, ProjectID: 1,
OwnerID: 1, PullCount: 1,
ProjectName: DefaultProjectName, }
ProjectID: 1, _ = dao.AddRepository(*commonRepository)
PullCount: 1, }
}
_ = dao.AddRepository(*commonRepository) func CommonDelRepository() {
} _ = dao.DeleteRepository(TestRepoName)
}
func CommonDelRepository() {
_ = dao.DeleteRepository(TestRepoName)
}

View File

@ -45,9 +45,8 @@ type RepositoryAPI struct {
} }
type repoResp struct { type repoResp struct {
ID string `json:"id"` ID int64 `json:"id"`
Name string `json:"name"` Name string `json:"name"`
OwnerID int64 `json:"owner_id"`
ProjectID int64 `json:"project_id"` ProjectID int64 `json:"project_id"`
Description string `json:"description"` Description string `json:"description"`
PullCount int64 `json:"pull_count"` PullCount int64 `json:"pull_count"`
@ -147,7 +146,6 @@ func populateTagsCount(repositories []*models.RepoRecord) ([]*repoResp, error) {
repo := &repoResp{ repo := &repoResp{
ID: repository.RepositoryID, ID: repository.RepositoryID,
Name: repository.Name, Name: repository.Name,
OwnerID: repository.OwnerID,
ProjectID: repository.ProjectID, ProjectID: repository.ProjectID,
Description: repository.Description, Description: repository.Description,
PullCount: repository.PullCount, PullCount: repository.PullCount,

View File

@ -270,18 +270,21 @@ func SyncRegistry() error {
log.Debugf("Start adding repositories into DB... ") log.Debugf("Start adding repositories into DB... ")
for _, repoToAdd := range reposToAdd { for _, repoToAdd := range reposToAdd {
project, _ := utils.ParseRepository(repoToAdd) project, _ := utils.ParseRepository(repoToAdd)
user, err := dao.GetAccessLogCreator(repoToAdd)
if err != nil {
log.Errorf("Error happens when getting the repository owner from access log: %v", err)
}
if len(user) == 0 {
user = "anonymous"
}
pullCount, err := dao.CountPull(repoToAdd) pullCount, err := dao.CountPull(repoToAdd)
if err != nil { if err != nil {
log.Errorf("Error happens when counting pull count from access log: %v", err) log.Errorf("Error happens when counting pull count from access log: %v", err)
} }
repoRecord := models.RepoRecord{Name: repoToAdd, OwnerName: user, ProjectName: project, PullCount: pullCount} pro, err := dao.GetProjectByName(project)
if err != nil {
log.Errorf("failed to get project %s: %v", project, err)
continue
}
repoRecord := models.RepoRecord{
Name: repoToAdd,
ProjectID: pro.ProjectID,
PullCount: pullCount,
}
if err := dao.AddRepository(repoRecord); err != nil { if err := dao.AddRepository(repoRecord); err != nil {
log.Errorf("Error happens when adding the missing repository: %v", err) log.Errorf("Error happens when adding the missing repository: %v", err)
} else { } else {

View File

@ -76,7 +76,15 @@ func (n *NotificationHandler) Post() {
return return
} }
log.Debugf("Add repository %s into DB.", repository) log.Debugf("Add repository %s into DB.", repository)
repoRecord := models.RepoRecord{Name: repository, OwnerName: user, ProjectName: project} pro, err := dao.GetProjectByName(project)
if err != nil {
log.Errorf("failed to get project %s: %v", project, err)
return
}
repoRecord := models.RepoRecord{
Name: repository,
ProjectID: pro.ProjectID,
}
if err := dao.AddRepository(repoRecord); err != nil { if err := dao.AddRepository(repoRecord); err != nil {
log.Errorf("Error happens when adding repository: %v", err) log.Errorf("Error happens when adding repository: %v", err)
} }

View File

@ -37,3 +37,7 @@ Changelog for harbor database schema
- alter column `name` on table `project`: varchar(30)->varchar(41) - alter column `name` on table `project`: varchar(30)->varchar(41)
- create table `repository` - create table `repository`
- alter column `password` on table `replication_target`: varchar(40)->varchar(128) - alter column `password` on table `replication_target`: varchar(40)->varchar(128)
## 1.2.0
- delete column `owner_id` from table `repository`