@ -246,6 +246,55 @@ func (repo *Repository) recalculateTeamAccesses(e Engine, ignTeamID int64) (err
return repo . refreshAccesses ( e , accessMap )
}
// recalculateUserAccess recalculates new access for a single user
// Usable if we know access only affected one user
func ( repo * Repository ) recalculateUserAccess ( e Engine , uid int64 ) ( err error ) {
minMode := AccessModeRead
if ! repo . IsPrivate {
minMode = AccessModeWrite
}
accessMode := AccessModeNone
collaborator , err := repo . getCollaboration ( e , uid )
if err != nil {
return err
} else if collaborator != nil {
accessMode = collaborator . Mode
}
if err = repo . getOwner ( e ) ; err != nil {
return err
} else if repo . Owner . IsOrganization ( ) {
var teams [ ] Team
if err := e . Join ( "INNER" , "team_repo" , "team_repo.team_id = team.id" ) .
Join ( "INNER" , "team_user" , "team_user.team_id = team.id" ) .
Where ( "team.org_id = ?" , repo . OwnerID ) .
And ( "team_repo.repo_id=?" , repo . ID ) .
And ( "team_user.uid=?" , uid ) .
Find ( & teams ) ; err != nil {
return err
}
for _ , t := range teams {
if t . IsOwnerTeam ( ) {
t . Authorize = AccessModeOwner
}
accessMode = maxAccessMode ( accessMode , t . Authorize )
}
}
// Delete old user accesses and insert new one for repository.
if _ , err = e . Delete ( & Access { RepoID : repo . ID , UserID : uid } ) ; err != nil {
return fmt . Errorf ( "delete old user accesses: %v" , err )
} else if accessMode >= minMode {
if _ , err = e . Insert ( & Access { RepoID : repo . ID , UserID : uid , Mode : accessMode } ) ; err != nil {
return fmt . Errorf ( "insert new user accesses: %v" , err )
}
}
return nil
}
func ( repo * Repository ) recalculateAccesses ( e Engine ) error {
if repo . Owner . IsOrganization ( ) {
return repo . recalculateTeamAccesses ( e , 0 )