diff --git a/src/Infrastructure.EntityFramework/Repositories/GroupRepository.cs b/src/Infrastructure.EntityFramework/Repositories/GroupRepository.cs index 19cd76d035..8f3d6ba4ff 100644 --- a/src/Infrastructure.EntityFramework/Repositories/GroupRepository.cs +++ b/src/Infrastructure.EntityFramework/Repositories/GroupRepository.cs @@ -129,13 +129,50 @@ public class GroupRepository : Repository, IGr } } - public async Task ReplaceAsync(Core.Entities.Group obj, IEnumerable collections) + public async Task ReplaceAsync(Core.Entities.Group group, IEnumerable requestedCollections) { - await base.ReplaceAsync(obj); + await base.ReplaceAsync(group); using (var scope = ServiceScopeFactory.CreateScope()) { var dbContext = GetDatabaseContext(scope); - await dbContext.UserBumpAccountRevisionDateByOrganizationIdAsync(obj.OrganizationId); + + var availableCollections = await dbContext.Collections + .Where(c => c.OrganizationId == group.OrganizationId) + .Select(c => c.Id) + .ToListAsync(); + + var existingCollectionGroups = await dbContext.CollectionGroups + .Where(cg => cg.GroupId == group.Id) + .ToListAsync(); + + foreach (var requestedCollection in requestedCollections) + { + var existingCollectionGroup = existingCollectionGroups + .FirstOrDefault(cg => cg.CollectionId == requestedCollection.Id); + + if (existingCollectionGroup == null) + { + // It needs to be added + dbContext.CollectionGroups.Add(new CollectionGroup + { + CollectionId = requestedCollection.Id, + GroupId = group.Id, + ReadOnly = requestedCollection.ReadOnly, + HidePasswords = requestedCollection.HidePasswords, + }); + continue; + } + + existingCollectionGroup.ReadOnly = requestedCollection.ReadOnly; + existingCollectionGroup.HidePasswords = requestedCollection.HidePasswords; + } + + var requestedCollectionIds = requestedCollections.Select(c => c.Id); + + dbContext.CollectionGroups.RemoveRange( + existingCollectionGroups.Where(cg => !requestedCollectionIds.Contains(cg.CollectionId))); + + await dbContext.UserBumpAccountRevisionDateByOrganizationIdAsync(group.OrganizationId); await dbContext.SaveChangesAsync(); } }