Skip to content

Commit 47c0784

Browse files
committed
refactor: simplify logic with delete not in behaviour
1 parent ed4fb36 commit 47c0784

File tree

5 files changed

+78
-90
lines changed

5 files changed

+78
-90
lines changed

server/api/login.go

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -314,7 +314,7 @@ func updateRepoPermissions(c *gin.Context, user *model.User, _store store.Store,
314314
return err
315315
}
316316

317-
allowedRepoIDs := map[int64]bool{}
317+
repoIDs := make([]int64, 0)
318318

319319
for _, forgeRepo := range repos {
320320
// make sure forgeID is set
@@ -342,27 +342,13 @@ func updateRepoPermissions(c *gin.Context, user *model.User, _store store.Store,
342342
return err
343343
}
344344

345-
allowedRepoIDs[dbRepo.ID] = true
345+
repoIDs = append(repoIDs, dbRepo.ID)
346346
}
347347

348-
currentRepos, err := _store.RepoList(user, false, true, nil)
349-
if err != nil {
348+
if err := _store.PermPrune(user.ID, repoIDs); err != nil {
350349
return err
351350
}
352351

353-
toDelete := make([]int64, 0)
354-
for _, r := range currentRepos {
355-
if !allowedRepoIDs[r.ID] {
356-
toDelete = append(toDelete, r.ID)
357-
}
358-
}
359-
360-
if len(toDelete) > 0 {
361-
if err := _store.PermDeleteByUserAndRepoIDs(user.ID, toDelete); err != nil {
362-
return err
363-
}
364-
}
365-
366352
return nil
367353
}
368354

server/api/login_test.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ func TestHandleAuth(t *testing.T) {
164164
_store.On("OrgFindByName", user.Login, user.ForgeID).Return(nil, nil)
165165
_store.On("OrgCreate", mock.Anything).Return(nil)
166166
_store.On("UpdateUser", mock.Anything).Return(nil)
167-
_store.On("RepoList", mock.Anything, false, true, (*model.RepoFilter)(nil)).Return([]*model.Repo{}, nil)
167+
_store.On("PermPrune", mock.Anything, []int64{}).Return(nil)
168168
_forge.On("Repos", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil)
169169

170170
api.HandleAuth(c)
@@ -197,7 +197,7 @@ func TestHandleAuth(t *testing.T) {
197197
_store.On("GetUserByRemoteID", user.ForgeID, user.ForgeRemoteID).Return(user, nil)
198198
_store.On("OrgGet", org.ID).Return(org, nil)
199199
_store.On("UpdateUser", mock.Anything).Return(nil)
200-
_store.On("RepoList", mock.Anything, false, true, (*model.RepoFilter)(nil)).Return([]*model.Repo{}, nil)
200+
_store.On("PermPrune", mock.Anything, []int64{}).Return(nil)
201201
_forge.On("Repos", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil)
202202

203203
api.HandleAuth(c)
@@ -293,7 +293,7 @@ func TestHandleAuth(t *testing.T) {
293293
_store.On("OrgFindByName", user.Login, user.ForgeID).Return(nil, types.RecordNotExist)
294294
_store.On("OrgCreate", mock.Anything).Return(nil)
295295
_store.On("UpdateUser", mock.Anything).Return(nil)
296-
_store.On("RepoList", mock.Anything, false, true, (*model.RepoFilter)(nil)).Return([]*model.Repo{}, nil)
296+
_store.On("PermPrune", mock.Anything, []int64{}).Return(nil)
297297
_forge.On("Repos", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil)
298298

299299
api.HandleAuth(c)
@@ -328,7 +328,7 @@ func TestHandleAuth(t *testing.T) {
328328
_store.On("OrgFindByName", user.Login, user.ForgeID).Return(org, nil)
329329
_store.On("OrgUpdate", mock.Anything).Return(nil)
330330
_store.On("UpdateUser", mock.Anything).Return(nil)
331-
_store.On("RepoList", mock.Anything, false, true, (*model.RepoFilter)(nil)).Return([]*model.Repo{}, nil)
331+
_store.On("PermPrune", mock.Anything, []int64{}).Return(nil)
332332
_forge.On("Repos", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil)
333333

334334
api.HandleAuth(c)
@@ -363,7 +363,7 @@ func TestHandleAuth(t *testing.T) {
363363
_store.On("OrgGet", user.OrgID).Return(org, nil)
364364
_store.On("OrgUpdate", mock.Anything).Return(nil)
365365
_store.On("UpdateUser", mock.Anything).Return(nil)
366-
_store.On("RepoList", mock.Anything, false, true, (*model.RepoFilter)(nil)).Return([]*model.Repo{}, nil)
366+
_store.On("PermPrune", mock.Anything, []int64{}).Return(nil)
367367
_forge.On("Repos", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil)
368368

369369
api.HandleAuth(c)
@@ -398,11 +398,7 @@ func TestHandleAuth(t *testing.T) {
398398
_store.On("UpdateUser", mock.Anything).Return(nil)
399399

400400
_forge.On("Repos", mock.Anything, mock.Anything, mock.Anything).Return([]*model.Repo{}, nil)
401-
402-
dbRepo := &model.Repo{ID: 42, FullName: "woodpecker-ci/woodpecker", IsActive: true}
403-
_store.On("RepoList", mock.Anything, false, true, (*model.RepoFilter)(nil)).Return([]*model.Repo{dbRepo}, nil)
404-
405-
_store.On("PermDeleteByUserAndRepoIDs", user.ID, []int64{dbRepo.ID}).Return(nil)
401+
_store.On("PermPrune", mock.Anything, []int64{}).Return(nil)
406402

407403
api.HandleAuth(c)
408404

server/store/datastore/permission.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -84,11 +84,17 @@ func userIDAndRepoIDCond(perm *model.Perm) builder.Cond {
8484
return builder.Eq{"user_id": perm.UserID, "repo_id": perm.RepoID}
8585
}
8686

87-
// PermDeleteByUserAndRepoIDs deletes permission rows for a user for the given repo IDs.
88-
func (s storage) PermDeleteByUserAndRepoIDs(userID int64, repoIDs []int64) error {
89-
if len(repoIDs) == 0 {
90-
return nil
87+
// PermPrune deletes all permission rows for a user
88+
// where the repo_id is NOT IN the provided keepRepoIDs list. If keepRepoIDs
89+
// is empty, all permissions for the user are deleted.
90+
func (s storage) PermPrune(userID int64, keepRepoIDs []int64) error {
91+
if len(keepRepoIDs) == 0 {
92+
_, err := s.engine.Where(builder.Eq{"user_id": userID}).Delete(new(model.Perm))
93+
return err
9194
}
92-
_, err := s.engine.In("repo_id", repoIDs).And("user_id = ?", userID).Delete(new(model.Perm))
95+
96+
_, err := s.engine.Where(builder.Eq{"user_id": userID}).
97+
And(builder.NotIn("repo_id", keepRepoIDs)).
98+
Delete(new(model.Perm))
9399
return err
94100
}

server/store/mocks/mock_Store.go

Lines changed: 57 additions & 57 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/store/store.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ type Store interface {
104104
// Permissions
105105
PermFind(user *model.User, repo *model.Repo) (*model.Perm, error)
106106
PermUpsert(perm *model.Perm) error
107-
PermDeleteByUserAndRepoIDs(userID int64, repoIDs []int64) error
107+
PermPrune(userID int64, keepRepoIDs []int64) error
108108

109109
// Configs
110110
ConfigsForPipeline(pipelineID int64) ([]*model.Config, error)

0 commit comments

Comments
 (0)