aboutsummaryrefslogtreecommitdiff
path: root/models
diff options
context:
space:
mode:
authorUnknwon <u@gogs.io>2017-03-23 14:28:31 -0400
committerUnknwon <u@gogs.io>2017-03-23 14:28:31 -0400
commit66c1e6b0e8308068dbddaec03585f388875f4192 (patch)
tree1b34d0977ddd45ca2e6db84fb7939f874b04af2a /models
parentbeee6e03b15e594f396fb2fb769b58e543ef1794 (diff)
user/settings: complete repositories panel (#4312)
Diffstat (limited to 'models')
-rw-r--r--models/repo.go33
-rw-r--r--models/repo_collaboration.go32
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)
+}