@@ -246,6 +246,44 @@ func (repo *Repository) recalculateTeamAccesses(e Engine, ignTeamID int64) (err
246
246
return repo .refreshAccesses (e , accessMap )
247
247
}
248
248
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
+
249
287
func (repo * Repository ) recalculateAccesses (e Engine ) error {
250
288
if repo .Owner .IsOrganization () {
251
289
return repo .recalculateTeamAccesses (e , 0 )
0 commit comments