diff options
author | Peter Smit <peter@smitmail.eu> | 2015-01-23 09:54:16 +0200 |
---|---|---|
committer | Peter Smit <peter@smitmail.eu> | 2015-01-23 09:54:16 +0200 |
commit | 76f89047183fc70a077ac37b4168d90539f12e09 (patch) | |
tree | 4d57f8e0fa667a3a08f1ee55c49b9c0f95085844 /models/repo.go | |
parent | c6b87aaf02b711d8b1ee7a40f57ba23f560e2a63 (diff) | |
download | gitea-76f89047183fc70a077ac37b4168d90539f12e09.tar.gz gitea-76f89047183fc70a077ac37b4168d90539f12e09.zip |
Introducing Collaboration Struct
Diffstat (limited to 'models/repo.go')
-rw-r--r-- | models/repo.go | 105 |
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"` +} |