diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/AggregateRoot.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/AggregateRoot.cs index 25fcee2dc..c157a49ed 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/AggregateRoot.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/AggregateRoot.cs @@ -5,7 +5,8 @@ namespace FilterLists.Directory.Infrastructure.Persistence.Queries.Entities; public abstract record AggregateRoot { - public bool? IsApproved { get; private init; } + // TODO: change 'set' to 'private init' when no longer seeding from json + public bool IsApproved { get; set; } } internal abstract class AggregateRootTypeConfiguration : IEntityTypeConfiguration @@ -13,9 +14,6 @@ internal abstract class AggregateRootTypeConfiguration : IEntity { public virtual void Configure(EntityTypeBuilder builder) { - builder.Property(e => e.IsApproved) - .IsRequired() - .HasDefaultValue(true); // legacy json data approved via GitHub PR - builder.HasQueryFilter(e => e.IsApproved == true); + builder.HasQueryFilter(e => e.IsApproved); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Dependent.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Dependent.cs index 201c9eb12..aa8848461 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Dependent.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Dependent.cs @@ -30,7 +30,7 @@ public virtual void Configure(EntityTypeBuilder builder) .WithMany(fl => fl.DependencyFilterLists) .HasForeignKey(d => d.DependentFilterListId) .HasConstraintName("fk_dependents_filter_lists_dependent_filter_list_id"); - builder.HasQueryFilter(d => d.DependencyFilterList.IsApproved == true && d.DependentFilterList.IsApproved == true); + builder.HasQueryFilter(d => d.DependencyFilterList.IsApproved && d.DependentFilterList.IsApproved); builder.HasDataJsonFile(); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterList.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterList.cs index e1807faac..0a11e84f9 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterList.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterList.cs @@ -43,7 +43,7 @@ public override void Configure(EntityTypeBuilder builder) builder.HasOne(f => f.License) .WithMany(l => l.FilterLists) .OnDelete(DeleteBehavior.Restrict); - builder.HasDataJsonFile(); + builder.HasDataJsonFileAggregate(); base.Configure(builder); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListLanguage.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListLanguage.cs index 2fa77f99f..ab753edb4 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListLanguage.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListLanguage.cs @@ -26,7 +26,7 @@ public virtual void Configure(EntityTypeBuilder builder) .WithMany(l => l.FilterListLanguages) .HasForeignKey(fll => fll.Iso6391) .HasConstraintName("fk_filter_list_languages_languages_iso6391"); - builder.HasQueryFilter(fll => fll.FilterList.IsApproved == true && fll.Language.IsApproved == true); + builder.HasQueryFilter(fll => fll.FilterList.IsApproved && fll.Language.IsApproved); builder.HasDataJsonFile(); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListMaintainer.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListMaintainer.cs index 749258397..b368d5981 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListMaintainer.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListMaintainer.cs @@ -22,7 +22,7 @@ public virtual void Configure(EntityTypeBuilder builder) builder.ToTable($"{nr.RewriteName(nameof(FilterListMaintainer))}s"); builder.HasKey(flm => new { flm.FilterListId, flm.MaintainerId }); - builder.HasQueryFilter(flm => flm.FilterList.IsApproved == true && flm.Maintainer.IsApproved == true); + builder.HasQueryFilter(flm => flm.FilterList.IsApproved && flm.Maintainer.IsApproved); builder.HasDataJsonFile(); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListSyntax.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListSyntax.cs index 763544ca5..80c1b0b4b 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListSyntax.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListSyntax.cs @@ -22,7 +22,7 @@ public virtual void Configure(EntityTypeBuilder builder) builder.ToTable($"{nr.RewriteName(nameof(FilterListSyntax))}es"); builder.HasKey(fls => new { fls.FilterListId, fls.SyntaxId }); - builder.HasQueryFilter(fls => fls.FilterList.IsApproved == true && fls.Syntax.IsApproved == true); + builder.HasQueryFilter(fls => fls.FilterList.IsApproved && fls.Syntax.IsApproved); builder.HasDataJsonFile(); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListTag.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListTag.cs index 24a64e85f..e340f5d0d 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListTag.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/FilterListTag.cs @@ -22,7 +22,7 @@ public virtual void Configure(EntityTypeBuilder builder) builder.ToTable($"{nr.RewriteName(nameof(FilterListTag))}s"); builder.HasKey(flt => new { flt.FilterListId, flt.TagId }); - builder.HasQueryFilter(flt => flt.FilterList.IsApproved == true && flt.Tag.IsApproved == true); + builder.HasQueryFilter(flt => flt.FilterList.IsApproved && flt.Tag.IsApproved); builder.HasDataJsonFile(); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Fork.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Fork.cs index 43fd336fb..da51e66c0 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Fork.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Fork.cs @@ -30,7 +30,7 @@ public virtual void Configure(EntityTypeBuilder builder) .WithMany(fl => fl.UpstreamFilterLists) .HasForeignKey(f => f.ForkFilterListId) .HasConstraintName("fk_forks_filter_lists_fork_filter_list_id"); - builder.HasQueryFilter(f => f.UpstreamFilterList.IsApproved == true && f.ForkFilterList.IsApproved == true); + builder.HasQueryFilter(f => f.UpstreamFilterList.IsApproved && f.ForkFilterList.IsApproved); builder.HasDataJsonFile(); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Language.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Language.cs index 3bdf2f60f..0df0538ce 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Language.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Language.cs @@ -20,7 +20,7 @@ public override void Configure(EntityTypeBuilder builder) .HasMaxLength(2); builder.HasIndex(l => l.Name) .IsUnique(); - builder.HasDataJsonFile(); + builder.HasDataJsonFileAggregate(); base.Configure(builder); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/License.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/License.cs index 18fef687d..0315ca0df 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/License.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/License.cs @@ -26,7 +26,7 @@ public override void Configure(EntityTypeBuilder builder) .HasDefaultValue(false); builder.Property(l => l.PermitsCommercialUse) .HasDefaultValue(false); - builder.HasDataJsonFile(); + builder.HasDataJsonFileAggregate(); base.Configure(builder); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Maintainer.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Maintainer.cs index faa626a26..fcfcd1b57 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Maintainer.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Maintainer.cs @@ -19,7 +19,7 @@ public override void Configure(EntityTypeBuilder builder) { builder.HasIndex(m => m.Name) .IsUnique(); - builder.HasDataJsonFile(); + builder.HasDataJsonFileAggregate(); base.Configure(builder); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Merge.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Merge.cs index dbac06b07..a9c88e772 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Merge.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Merge.cs @@ -30,7 +30,7 @@ public virtual void Configure(EntityTypeBuilder builder) .WithMany(fl => fl.IncludedInFilterLists) .HasForeignKey(m => m.IncludesFilterListId) .HasConstraintName("fk_merges_filter_lists_includes_filter_list_id"); - builder.HasQueryFilter(m => m.IncludedInFilterList.IsApproved == true && m.IncludesFilterList.IsApproved == true); + builder.HasQueryFilter(m => m.IncludedInFilterList.IsApproved && m.IncludesFilterList.IsApproved); builder.HasDataJsonFile(); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Software.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Software.cs index ba2bd32d3..a74a1bbd6 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Software.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Software.cs @@ -22,7 +22,7 @@ public override void Configure(EntityTypeBuilder builder) .IsUnique(); builder.Property(s => s.SupportsAbpUrlScheme) .HasDefaultValue(false); - builder.HasDataJsonFile(); + builder.HasDataJsonFileAggregate(); base.Configure(builder); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/SoftwareSyntax.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/SoftwareSyntax.cs index 2312e5c29..723f4af72 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/SoftwareSyntax.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/SoftwareSyntax.cs @@ -22,7 +22,7 @@ public virtual void Configure(EntityTypeBuilder builder) builder.ToTable($"{nr.RewriteName(nameof(SoftwareSyntax))}es"); builder.HasKey(ss => new { ss.SoftwareId, ss.SyntaxId }); - builder.HasQueryFilter(ss => ss.Software.IsApproved == true && ss.Syntax.IsApproved == true); + builder.HasQueryFilter(ss => ss.Software.IsApproved && ss.Syntax.IsApproved); builder.HasDataJsonFile(); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Syntax.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Syntax.cs index bbde52dc0..42ba2306d 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Syntax.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Syntax.cs @@ -19,7 +19,7 @@ public override void Configure(EntityTypeBuilder builder) { builder.HasIndex(s => s.Name) .IsUnique(); - builder.HasDataJsonFile(); + builder.HasDataJsonFileAggregate(); base.Configure(builder); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Tag.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Tag.cs index 683c73195..949c3cdc5 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Tag.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Tag.cs @@ -17,7 +17,7 @@ public override void Configure(EntityTypeBuilder builder) { builder.HasIndex(t => t.Name) .IsUnique(); - builder.HasDataJsonFile(); + builder.HasDataJsonFileAggregate(); base.Configure(builder); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/SeedExtensions.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/SeedExtensions.cs index cdc120944..53e6af24d 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/SeedExtensions.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/SeedExtensions.cs @@ -1,5 +1,6 @@ using System.Text.Json; using FilterLists.Directory.Infrastructure.Persistence.Queries.Context; +using FilterLists.Directory.Infrastructure.Persistence.Queries.Entities; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.Extensions.DependencyInjection; @@ -19,21 +20,53 @@ public static async Task MigrateAsync(this IHost host) internal static class SeedConfigurationExtension { - public static void HasDataJsonFile(this EntityTypeBuilder entityTypeBuilder) + public static void HasDataJsonFileAggregate(this EntityTypeBuilder entityTypeBuilder) + where TEntity : AggregateRoot { + var entities = Deserialize(); + if (entities.Count == 0) + { + return; + } + + foreach (var entity in entities) + { + entity.Approve(); + } + + entityTypeBuilder.HasData(entities); + } + + public static void HasDataJsonFile(this EntityTypeBuilder entityTypeBuilder) where TEntity : class + { + var entities = Deserialize(); + if (entities.Count == 0) + { + return; + } + + entityTypeBuilder.HasData(entities); + } + + private static List Deserialize() + { + // uncomment to short-circuit HasData() when adding a migration + return new List(); + var path = Path.Combine("../data", $"{typeof(TEntity).Name}.json"); if (!File.Exists(path)) { - return; + return new List(); } var entitiesJson = File.ReadAllText(path); var entities = JsonSerializer.Deserialize>(entitiesJson, new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }); + return entities is null ? new List() : entities.ToList(); + } - if (entities != null) - { - entityTypeBuilder.HasData((IEnumerable)entities); - } + private static void Approve(this TAggregateRoot entity) where TAggregateRoot : AggregateRoot + { + entity.IsApproved = true; } }