@@ -246,6 +246,44 @@ func (repo *Repository) recalculateTeamAccesses(e Engine, ignTeamID int64) (err
246246 return repo .refreshAccesses (e , accessMap )
247247}
248248
249+ // recalculateUserAccess recalculates new access for a single user
250+ // Usable if we know access only affected one user
251+ func (repo * Repository ) recalculateUserAccess (e Engine , uid int64 ) (err error ) {
252+ access := AccessModeNone
253+ collaborator , err := repo .getCollaboration (e , uid )
254+ if err != nil {
255+ return err
256+ } else if collaborator != nil {
257+ access = collaborator .Mode
258+ }
259+
260+ var teams []Team
261+ if err := e .Join ("INNER" , "team_repo" , "team_repo.team_id = team.id" ).
262+ Join ("INNER" , "team_user" , "team_user.team_id = team.id" ).
263+ Where ("team.org_id = ?" , repo .OwnerID ).
264+ And ("team_repo.repo_id=?" , repo .ID ).
265+ And ("team_user.uid=?" , uid ).
266+ Find (& teams ); err != nil {
267+ return err
268+ }
269+
270+ for _ , t := range teams {
271+ if t .IsOwnerTeam () {
272+ t .Authorize = AccessModeOwner
273+ }
274+
275+ access = maxAccessMode (access , t .Authorize )
276+ }
277+
278+ // Delete old user accesses and insert new one for repository.
279+ if _ , err = e .Delete (& Access {RepoID : repo .ID , UserID : uid }); err != nil {
280+ return fmt .Errorf ("delete old user accesses: %v" , err )
281+ } else if _ , err = e .Insert (& Access {RepoID : repo .ID , UserID : uid , Mode : access }); err != nil {
282+ return fmt .Errorf ("insert new user accesses: %v" , err )
283+ }
284+ return nil
285+ }
286+
249287func (repo * Repository ) recalculateAccesses (e Engine ) error {
250288 if repo .Owner .IsOrganization () {
251289 return repo .recalculateTeamAccesses (e , 0 )
0 commit comments