diff options
author | Unknwon <u@gogs.io> | 2017-02-24 13:56:02 -0500 |
---|---|---|
committer | Unknwon <u@gogs.io> | 2017-02-24 13:56:02 -0500 |
commit | 10b93efc4a3061d01b75b44b91a617698971e38b (patch) | |
tree | de3d093876a0de391de72f081a7b15afa6fd27cc /models | |
parent | 0696d430c9baa409297dc06ffa0ab84c0ea44a29 (diff) |
repo: able to add organization member as repository collaborator
Diffstat (limited to 'models')
-rw-r--r-- | models/access.go | 2 | ||||
-rw-r--r-- | models/org_team.go | 37 | ||||
-rw-r--r-- | models/repo_collaboration.go | 28 |
3 files changed, 34 insertions, 33 deletions
diff --git a/models/access.go b/models/access.go index 0844a0fe..75af8485 100644 --- a/models/access.go +++ b/models/access.go @@ -229,7 +229,7 @@ func (repo *Repository) recalculateAccesses(e Engine) error { return repo.recalculateTeamAccesses(e, 0) } - accessMap := make(map[int64]AccessMode, 20) + accessMap := make(map[int64]AccessMode, 10) if err := repo.refreshCollaboratorAccesses(e, accessMap); err != nil { return fmt.Errorf("refreshCollaboratorAccesses: %v", err) } diff --git a/models/org_team.go b/models/org_team.go index d4a6b1e3..7d690238 100644 --- a/models/org_team.go +++ b/models/org_team.go @@ -444,39 +444,34 @@ func GetTeamMembers(teamID int64) ([]*User, error) { return getTeamMembers(x, teamID) } -func getUserTeams(e Engine, orgId, uid int64) ([]*Team, error) { - tus := make([]*TeamUser, 0, 5) - if err := e.Where("uid=?", uid).And("org_id=?", orgId).Find(&tus); err != nil { +func getUserTeams(e Engine, orgID, userID int64) ([]*Team, error) { + teamUsers := make([]*TeamUser, 0, 5) + if err := e.Where("uid = ?", userID).And("org_id = ?", orgID).Find(&teamUsers); err != nil { return nil, err } - ts := make([]*Team, len(tus)) - for i, tu := range tus { - t := new(Team) - has, err := e.Id(tu.TeamID).Get(t) - if err != nil { - return nil, err - } else if !has { - return nil, ErrTeamNotExist - } - ts[i] = t + teamIDs := make([]int64, len(teamUsers)) + for i := range teamUsers { + teamIDs[i] = teamUsers[i].TeamID } - return ts, nil + + teams := make([]*Team, 0, len(teamIDs)) + return teams, e.Where("org_id = ?", orgID).In("id", teamIDs).Find(&teams) } // GetUserTeams returns all teams that user belongs to in given organization. -func GetUserTeams(orgId, uid int64) ([]*Team, error) { - return getUserTeams(x, orgId, uid) +func GetUserTeams(orgID, userID int64) ([]*Team, error) { + return getUserTeams(x, orgID, userID) } // AddTeamMember adds new membership of given team to given organization, // the user will have membership to given organization automatically when needed. -func AddTeamMember(orgID, teamID, uid int64) error { - if IsTeamMember(orgID, teamID, uid) { +func AddTeamMember(orgID, teamID, userID int64) error { + if IsTeamMember(orgID, teamID, userID) { return nil } - if err := AddOrgUser(orgID, uid); err != nil { + if err := AddOrgUser(orgID, userID); err != nil { return err } @@ -498,7 +493,7 @@ func AddTeamMember(orgID, teamID, uid int64) error { } tu := &TeamUser{ - UID: uid, + UID: userID, OrgID: orgID, TeamID: teamID, } @@ -517,7 +512,7 @@ func AddTeamMember(orgID, teamID, uid int64) error { // We make sure it exists before. ou := new(OrgUser) - if _, err = sess.Where("uid = ?", uid).And("org_id = ?", orgID).Get(ou); err != nil { + if _, err = sess.Where("uid = ?", userID).And("org_id = ?", orgID).Get(ou); err != nil { return err } ou.NumTeams++ diff --git a/models/repo_collaboration.go b/models/repo_collaboration.go index 889ff4ce..2ab52c37 100644 --- a/models/repo_collaboration.go +++ b/models/repo_collaboration.go @@ -62,17 +62,10 @@ func (repo *Repository) AddCollaborator(u *User) error { return err } - if _, err = sess.InsertOne(collaboration); err != nil { + if _, err = sess.Insert(collaboration); err != nil { return err - } - - if repo.Owner.IsOrganization() { - err = repo.recalculateTeamAccesses(sess, 0) - } else { - err = repo.recalculateAccesses(sess) - } - if err != nil { - return fmt.Errorf("recalculateAccesses 'team=%v': %v", repo.Owner.IsOrganization(), err) + } else if err = repo.recalculateAccesses(sess); err != nil { + return fmt.Errorf("recalculateAccesses [repo_id: %v]: %v", repo.ID, err) } return sess.Commit() @@ -148,6 +141,19 @@ func (repo *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessM } collaboration.Mode = mode + // If it's an organizational repository, merge with team access level for highest permission + if repo.Owner.IsOrganization() { + teams, err := GetUserTeams(repo.OwnerID, userID) + if err != nil { + return fmt.Errorf("GetUserTeams: [org_id: %d, user_id: %d]: %v", repo.OwnerID, userID, err) + } + for i := range teams { + if mode < teams[i].Authorize { + mode = teams[i].Authorize + } + } + } + sess := x.NewSession() defer sessionRelease(sess) if err = sess.Begin(); err != nil { @@ -173,7 +179,7 @@ func (repo *Repository) ChangeCollaborationAccessMode(userID int64, mode AccessM _, err = sess.Insert(access) } if err != nil { - return fmt.Errorf("update access table: %v", err) + return fmt.Errorf("update/insert access table: %v", err) } return sess.Commit() |