diff options
author | Unknwon <u@gogs.io> | 2017-03-23 14:28:31 -0400 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2017-03-23 14:28:31 -0400 |
commit | 66c1e6b0e8308068dbddaec03585f388875f4192 (patch) | |
tree | 1b34d0977ddd45ca2e6db84fb7939f874b04af2a /models | |
parent | beee6e03b15e594f396fb2fb769b58e543ef1794 (diff) |
user/settings: complete repositories panel (#4312)
Diffstat (limited to 'models')
-rw-r--r-- | models/repo.go | 33 | ||||
-rw-r--r-- | models/repo_collaboration.go | 32 |
2 files changed, 58 insertions, 7 deletions
diff --git a/models/repo.go b/models/repo.go index 0f448ba6..925a6f90 100644 --- a/models/repo.go +++ b/models/repo.go @@ -228,6 +228,21 @@ func (repo *Repository) AfterSet(colName string, _ xorm.Cell) { } } +func (repo *Repository) loadAttributes(e Engine) (err error) { + if repo.Owner == nil { + repo.Owner, err = getUserByID(e, repo.OwnerID) + if err != nil { + return fmt.Errorf("getUserByID [%d]: %v", repo.OwnerID, err) + } + } + + return nil +} + +func (repo *Repository) LoadAttributes() error { + return repo.loadAttributes(x) +} + // MustOwner always returns a valid *User object to avoid // conceptually impossible error handling. // It creates a fake object that contains error deftail @@ -1559,6 +1574,24 @@ func GetRecentUpdatedRepositories(page, pageSize int) (repos []*Repository, err Where("is_private=?", false).Limit(pageSize).Desc("updated_unix").Find(&repos) } +// GetUserAndCollaborativeRepositories returns list of repositories the user owns and collaborates. +func GetUserAndCollaborativeRepositories(userID int64) ([]*Repository, error) { + repos := make([]*Repository, 0, 10) + if err := x.Alias("repo"). + Join("INNER", "collaboration", "collaboration.repo_id = repo.id"). + Where("collaboration.user_id = ?", userID). + Find(&repos); err != nil { + return nil, fmt.Errorf("select collaborative repositories: %v", err) + } + + ownRepos := make([]*Repository, 0, 10) + if err := x.Where("owner_id = ?", userID).Find(&ownRepos); err != nil { + return nil, fmt.Errorf("select own repositories: %v", err) + } + + return append(repos, ownRepos...), nil +} + func getRepositoryCount(e Engine, u *User) (int64, error) { return x.Count(&Repository{OwnerID: u.ID}) } diff --git a/models/repo_collaboration.go b/models/repo_collaboration.go index 2ab52c37..24033409 100644 --- a/models/repo_collaboration.go +++ b/models/repo_collaboration.go @@ -7,6 +7,8 @@ package models import ( "fmt" + log "gopkg.in/clog.v1" + api "github.com/gogits/go-gogs-client" ) @@ -31,14 +33,22 @@ func (c *Collaboration) ModeI18nKey() string { } } -//IsCollaborator returns true if the user is a collaborator -func (repo *Repository) IsCollaborator(uid int64) (bool, error) { +// IsCollaborator returns true if the user is a collaborator of the repository. +func IsCollaborator(repoID, userID int64) bool { collaboration := &Collaboration{ - RepoID: repo.ID, - UserID: uid, + RepoID: repoID, + UserID: userID, } + has, err := x.Get(collaboration) + if err != nil { + log.Error(2, "get collaboration [repo_id: %d, user_id: %d]: %v", repoID, userID, err) + return false + } + return has +} - return x.Get(collaboration) +func (repo *Repository) IsCollaborator(userID int64) bool { + return IsCollaborator(repo.ID, userID) } // AddCollaborator adds new collaboration to a repository with default access mode. @@ -186,10 +196,14 @@ func (repo *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessM } // DeleteCollaboration removes collaboration relation between the user and repository. -func (repo *Repository) DeleteCollaboration(uid int64) (err error) { +func DeleteCollaboration(repo *Repository, userID int64) (err error) { + if !IsCollaborator(repo.ID, userID) { + return nil + } + collaboration := &Collaboration{ RepoID: repo.ID, - UserID: uid, + UserID: userID, } sess := x.NewSession() @@ -206,3 +220,7 @@ func (repo *Repository) DeleteCollaboration(uid int64) (err error) { return sess.Commit() } + +func (repo *Repository) DeleteCollaboration(userID int64) error { + return DeleteCollaboration(repo, userID) +} |