aboutsummaryrefslogtreecommitdiff
path: root/models
diff options
context:
space:
mode:
authorUnknwon <u@gogs.io>2017-02-24 13:56:02 -0500
committerUnknwon <u@gogs.io>2017-02-24 13:56:02 -0500
commit10b93efc4a3061d01b75b44b91a617698971e38b (patch)
treede3d093876a0de391de72f081a7b15afa6fd27cc /models
parent0696d430c9baa409297dc06ffa0ab84c0ea44a29 (diff)
repo: able to add organization member as repository collaborator
Diffstat (limited to 'models')
-rw-r--r--models/access.go2
-rw-r--r--models/org_team.go37
-rw-r--r--models/repo_collaboration.go28
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()