aboutsummaryrefslogtreecommitdiffstats
path: root/models/repo.go
diff options
context:
space:
mode:
authorPeter Smit <peter@smitmail.eu>2015-01-23 09:54:16 +0200
committerPeter Smit <peter@smitmail.eu>2015-01-23 09:54:16 +0200
commit76f89047183fc70a077ac37b4168d90539f12e09 (patch)
tree4d57f8e0fa667a3a08f1ee55c49b9c0f95085844 /models/repo.go
parentc6b87aaf02b711d8b1ee7a40f57ba23f560e2a63 (diff)
downloadgitea-76f89047183fc70a077ac37b4168d90539f12e09.tar.gz
gitea-76f89047183fc70a077ac37b4168d90539f12e09.zip
Introducing Collaboration Struct
Diffstat (limited to 'models/repo.go')
-rw-r--r--models/repo.go105
1 files changed, 58 insertions, 47 deletions
diff --git a/models/repo.go b/models/repo.go
index 65689b6a1e..663e227ae4 100644
--- a/models/repo.go
+++ b/models/repo.go
@@ -1065,71 +1065,74 @@ func GetRepositoryCount(user *User) (int64, error) {
return x.Count(&Repository{OwnerId: user.Id})
}
-// GetCollaboratorNames returns a list of user name of repository's collaborators.
-func GetCollaboratorNames(repoName string) ([]string, error) {
- accesses := make([]*Access, 0, 10)
- if err := x.Find(&accesses, &Access{RepoName: strings.ToLower(repoName)}); err != nil {
+// GetCollaborators returns the collaborators for a repository
+func (r *Repository) GetCollaborators() ([]*User, error) {
+ collaborations := make([]*Collaboration, 0)
+ if err := x.Find(&collaborations, &Collaboration{RepoID: r.Id}); err != nil {
return nil, err
}
- names := make([]string, len(accesses))
- for i := range accesses {
- names[i] = accesses[i].UserName
+ users := make([]*User, len(collaborations))
+ for i, c := range collaborations {
+ user, err := GetUserById(c.UserID)
+ if err != nil {
+ return nil, err
+ }
+ users[i] = user
}
- return names, nil
+ return users, nil
}
-// CollaborativeRepository represents a repository with collaborative information.
-type CollaborativeRepository struct {
- *Repository
- CanPush bool
-}
+// Add collaborator and accompanying access
+func (r *Repository) AddCollaborator(u *User) error {
+ collaboration := &Collaboration{RepoID: r.Id, UserID: u.Id}
-// GetCollaborativeRepos returns a list of repositories that user is collaborator.
-func GetCollaborativeRepos(uname string) ([]*CollaborativeRepository, error) {
- uname = strings.ToLower(uname)
- accesses := make([]*Access, 0, 10)
- if err := x.Find(&accesses, &Access{UserName: uname}); err != nil {
- return nil, err
+ has, err := x.Get(collaboration)
+ if err != nil {
+ return err
+ }
+ if has {
+ return nil
}
- repos := make([]*CollaborativeRepository, 0, 10)
- for _, access := range accesses {
- infos := strings.Split(access.RepoName, "/")
- if infos[0] == uname {
- continue
- }
-
- u, err := GetUserByName(infos[0])
- if err != nil {
- return nil, err
- }
+ if _, err = x.InsertOne(collaboration); err != nil {
+ return err
+ }
- repo, err := GetRepositoryByName(u.Id, infos[1])
- if err != nil {
- return nil, err
- }
- repo.Owner = u
- repos = append(repos, &CollaborativeRepository{repo, access.Mode == WRITABLE})
+ if err = r.GetOwner(); err != nil {
+ return err
}
- return repos, nil
+
+ return AddAccess(&Access{UserName: u.LowerName, RepoName: path.Join(r.Owner.LowerName, r.LowerName), Mode: WRITABLE})
}
-// GetCollaborators returns a list of users of repository's collaborators.
-func GetCollaborators(repoName string) (us []*User, err error) {
- accesses := make([]*Access, 0, 10)
- if err = x.Find(&accesses, &Access{RepoName: strings.ToLower(repoName)}); err != nil {
- return nil, err
+// Delete collaborator and accompanying access
+func (r *Repository) DeleteCollaborator(u *User) error {
+ collaboration := &Collaboration{RepoID: r.Id, UserID: u.Id}
+
+ if has, err := x.Delete(collaboration); err != nil || has == 0 {
+ return err
}
- us = make([]*User, len(accesses))
- for i := range accesses {
- us[i], err = GetUserByName(accesses[i].UserName)
+ if err := r.GetOwner(); err != nil {
+ return err
+ }
+
+ needDelete := true
+ if r.Owner.IsOrganization() {
+ auth, err := GetHighestAuthorize(r.Owner.Id, u.Id, r.Id, 0)
if err != nil {
- return nil, err
+ return err
}
+ if auth > 0 {
+ needDelete = false
+ }
+ }
+ if needDelete {
+ return DeleteAccess(&Access{UserName: u.LowerName, RepoName: path.Join(r.Owner.LowerName, r.LowerName), Mode: WRITABLE})
}
- return us, nil
+
+ return nil
}
type SearchOption struct {
@@ -1547,3 +1550,11 @@ func ForkRepository(u *User, oldRepo *Repository, name, desc string) (*Repositor
return repo, nil
}
+
+// A Collaboration is a relation between an individual and a repository
+type Collaboration struct {
+ ID int64 `xorm:"pk autoincr"`
+ RepoID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"`
+ UserID int64 `xorm:"UNIQUE(s) INDEX NOT NULL"`
+ Created time.Time `xorm:"CREATED"`
+}