From 94dab0d15c0fa2c34a6af0c8c3f157a911ded741 Mon Sep 17 00:00:00 2001 From: "Collin M. Barrett" Date: Wed, 3 Nov 2021 06:04:48 -0500 Subject: [PATCH] =?UTF-8?q?feat(dir):=20=E2=9C=A8=20scaffold=20Change=20en?= =?UTF-8?q?tity?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Queries/Context/IQueryContext.cs | 1 + .../Queries/Context/QueryContext.cs | 1 + .../Queries/Context/QueryDbContext.cs | 10 +++++ .../Persistence/Queries/Entities/Change.cs | 45 +++++++++++++++++++ .../Persistence/SeedExtensions.cs | 5 +++ 5 files changed, 62 insertions(+) create mode 100644 services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Change.cs diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Context/IQueryContext.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Context/IQueryContext.cs index 607226e28..b8896ba45 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Context/IQueryContext.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Context/IQueryContext.cs @@ -4,6 +4,7 @@ namespace FilterLists.Directory.Infrastructure.Persistence.Queries.Context; public interface IQueryContext { + IQueryable Changes { get; } IQueryable FilterLists { get; } IQueryable Languages { get; } IQueryable Licenses { get; } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Context/QueryContext.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Context/QueryContext.cs index 16cb247ef..7fbfa92d8 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Context/QueryContext.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Context/QueryContext.cs @@ -22,6 +22,7 @@ void IDisposable.Dispose() _dbContext.Dispose(); } + public IQueryable Changes => _dbContext.Changes.AsNoTracking(); public IQueryable FilterLists => _dbContext.FilterLists.AsNoTracking(); public IQueryable Languages => _dbContext.Languages.AsNoTracking(); public IQueryable Licenses => _dbContext.Licenses.AsNoTracking(); diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Context/QueryDbContext.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Context/QueryDbContext.cs index 04b144d5d..422092dce 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Context/QueryDbContext.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Context/QueryDbContext.cs @@ -1,14 +1,22 @@ using FilterLists.Directory.Infrastructure.Persistence.Queries.Entities; using Microsoft.EntityFrameworkCore; +using Npgsql; namespace FilterLists.Directory.Infrastructure.Persistence.Queries.Context; public class QueryDbContext : DbContext { + static QueryDbContext() + { + NpgsqlConnection.GlobalTypeMapper.MapEnum(); + NpgsqlConnection.GlobalTypeMapper.MapEnum(); + } + public QueryDbContext(DbContextOptions options) : base(options) { } + public DbSet Changes => Set(); public DbSet FilterLists => Set(); public DbSet Languages => Set(); public DbSet Licenses => Set(); @@ -32,5 +40,7 @@ public override Task SaveChangesAsync( protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly); + modelBuilder.HasPostgresEnum(); + modelBuilder.HasPostgresEnum(); } } diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Change.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Change.cs new file mode 100644 index 000000000..9ddd07966 --- /dev/null +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/Queries/Entities/Change.cs @@ -0,0 +1,45 @@ +using System.Text.Json; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace FilterLists.Directory.Infrastructure.Persistence.Queries.Entities; + +public class Change +{ + public int Id { get; init; } + public ChangeType Type { get; init; } + public AggregateRoot AggregateRoot { get; init; } + public int AggregateRootId { get; init; } + public JsonDocument? Aggregate { get; init; } + public DateTime CreatedAt { get; init; } + public DateTime? AppliedAt { get; init; } + public DateTime? RejectedAt { get; init; } + public string? RejectedReason { get; init; } +} + +public enum ChangeType +{ + Insert, + Update, + Delete +} + +public enum AggregateRoot +{ + FilterList, + Language, + License, + Maintainer, + Software, + Syntax, + Tag +} + +internal class UpdateConfiguration : IEntityTypeConfiguration +{ + public virtual void Configure(EntityTypeBuilder builder) + { + builder.Property(c => c.CreatedAt) + .HasDefaultValueSql("now()"); + } +} diff --git a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/SeedExtensions.cs b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/SeedExtensions.cs index 472dba893..b109ad123 100644 --- a/services/Directory/FilterLists.Directory.Infrastructure/Persistence/SeedExtensions.cs +++ b/services/Directory/FilterLists.Directory.Infrastructure/Persistence/SeedExtensions.cs @@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Npgsql; namespace FilterLists.Directory.Infrastructure.Persistence; @@ -15,6 +16,10 @@ public static async Task MigrateAsync(this IHost host) using var scope = host.Services.CreateScope(); var db = scope.ServiceProvider.GetRequiredService(); await db.Database.MigrateAsync(); + + await using var conn = (NpgsqlConnection)db.Database.GetDbConnection(); + await conn.OpenAsync(); + conn.ReloadTypes(); } }