diff --git a/src/FilterLists.Services/Snapshot/SnapshotBatch.cs b/src/FilterLists.Services/Snapshot/SnapshotBatch.cs index 1385e54df..d88f9cf54 100644 --- a/src/FilterLists.Services/Snapshot/SnapshotBatch.cs +++ b/src/FilterLists.Services/Snapshot/SnapshotBatch.cs @@ -13,7 +13,6 @@ public class SnapshotBatch private readonly FilterListsDbContext dbContext; private readonly IEnumerable lines; private readonly Data.Entities.Snapshot snapEntity; - private IQueryable existingRules; public SnapshotBatch(FilterListsDbContext dbContext, IEnumerable lines, Data.Entities.Snapshot snapEntity) @@ -23,34 +22,45 @@ public SnapshotBatch(FilterListsDbContext dbContext, IEnumerable lines, this.snapEntity = snapEntity; } + private IQueryable ExistingRules => + dbContext.Rules.Join(lines, rule => rule.Raw, line => line, (rule, line) => rule); + public async Task SaveAsync() { - GetExistingRules(); - AddAddedSnapshotRulesForExistingRules(); - AddAddedSnapshotRulesForNewRules(); + AddAddedSnapRulesForExistingRules(); + AddAddedSnapRulesForNewRules(); await dbContext.SaveChangesAsync(); } - private void GetExistingRules() => - existingRules = dbContext.Rules.Join(lines, rule => rule.Raw, line => line, (rule, line) => rule); - - private void AddAddedSnapshotRulesForExistingRules() + private void AddAddedSnapRulesForExistingRules() { - var existingSnapshotRules = dbContext.SnapshotRules - .Where(sr => - existingRules.Contains(sr.Rule) && - sr.AddedBySnapshot.FilterListId == snapEntity.FilterListId && - sr.RemovedBySnapshot == null); - var newSnapshotRules = existingRules.Where(r => !existingSnapshotRules.Select(sr => sr.Rule).Contains(r)) - .Select(r => new SnapshotRule {Rule = r}); - snapEntity.AddedSnapshotRules.AddRange(newSnapshotRules); + var existingAddedSnapRules = GetExistingAddedSnapRules(); + var newAddedSnapRules = CreateNewAddedSnapRules(existingAddedSnapRules); + snapEntity.AddedSnapshotRules.AddRange(newAddedSnapRules); } - private void AddAddedSnapshotRulesForNewRules() + private IQueryable GetExistingAddedSnapRules() => + dbContext.SnapshotRules + .Where(sr => + ExistingRules.Contains(sr.Rule) && + sr.AddedBySnapshot.FilterListId == snapEntity.FilterListId && + sr.RemovedBySnapshot == null); + + private IEnumerable CreateNewAddedSnapRules(IQueryable existingAddedSnapRules) => + ExistingRules.Where(r => !existingAddedSnapRules.Select(sr => sr.Rule).Contains(r)) + .Select(r => new SnapshotRule {Rule = r}); + + private void AddAddedSnapRulesForNewRules() { - var rules = lines.Except(existingRules.Select(r => r.Raw)).Select(l => new Rule {Raw = l}); - var snapshotRules = rules.Select(r => new SnapshotRule {Rule = r}); - snapEntity.AddedSnapshotRules.AddRange(snapshotRules); + var newRules = CreateNewRules(); + var newAddedSnapRules = CreateSnapRules(newRules); + snapEntity.AddedSnapshotRules.AddRange(newAddedSnapRules); } + + private IEnumerable CreateNewRules() => + lines.Except(ExistingRules.Select(r => r.Raw)).Select(l => new Rule {Raw = l}); + + private static IEnumerable CreateSnapRules(IEnumerable rules) => + rules.Select(r => new SnapshotRule {Rule = r}); } } \ No newline at end of file