refactor(dir): ♻ use enum for Change discriminator

This commit is contained in:
Collin M. Barrett 2021-11-16 18:03:27 -06:00
parent 471c46201c
commit 60ab924ec4
6 changed files with 55 additions and 23 deletions

View file

@ -0,0 +1,12 @@
namespace FilterLists.Directory.Domain.Aggregates;
public enum AggregateType
{
FilterList,
Language,
License,
Maintainer,
Software,
Syntax,
Tag
}

View file

@ -1,12 +1,19 @@
using FilterLists.Directory.Domain.Aggregates.FilterLists;
using FilterLists.Directory.Domain.Aggregates;
using FilterLists.Directory.Domain.Aggregates.FilterLists;
using FilterLists.Directory.Domain.Aggregates.Licenses;
using FilterLists.Directory.Infrastructure.Persistence.Commands.EntityTypeConfigurations;
using Microsoft.EntityFrameworkCore;
using Npgsql;
namespace FilterLists.Directory.Infrastructure.Persistence.Commands.Context;
internal class CommandDbContext : DbContext, ICommandContext
{
static CommandDbContext()
{
NpgsqlConnection.GlobalTypeMapper.MapEnum<AggregateType>();
}
public CommandDbContext(DbContextOptions<CommandDbContext> options) : base(options)
{
}
@ -18,5 +25,6 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly,
type => type.Namespace == typeof(FilterListTypeConfiguration).Namespace);
modelBuilder.HasPostgresEnum<AggregateType>();
}
}

View file

@ -1,4 +1,7 @@
using FilterLists.Directory.Domain.Aggregates.Changes;
using System.Globalization;
using EFCore.NamingConventions.Internal;
using FilterLists.Directory.Domain.Aggregates;
using FilterLists.Directory.Domain.Aggregates.Changes;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
@ -8,6 +11,12 @@ internal class ChangeTypeConfiguration : IEntityTypeConfiguration<Change>
{
public virtual void Configure(EntityTypeBuilder<Change> builder)
{
// TODO: register and resolve INameRewriter
var nr = new SnakeCaseNameRewriter(CultureInfo.InvariantCulture);
builder.Property<int>(nameof(Queries.Entities.Change.Id));
// TODO: TDiscriminator should really be AggregateType rather than string but needs name rewriting
builder.HasDiscriminator<string>(nr.RewriteName(nameof(Queries.Entities.Change.AggregateType)))
.HasValue<FilterListChange>(nr.RewriteName(nameof(AggregateType.FilterList)));
}
}

View file

@ -1,10 +1,17 @@
using FilterLists.Directory.Infrastructure.Persistence.Queries.Entities;
using FilterLists.Directory.Domain.Aggregates;
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<AggregateType>();
}
public QueryDbContext(DbContextOptions<QueryDbContext> options) : base(options)
{
}
@ -34,5 +41,6 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.ApplyConfigurationsFromAssembly(GetType().Assembly,
type => type.Namespace == typeof(FilterListTypeConfiguration).Namespace);
modelBuilder.HasPostgresEnum<AggregateType>();
}
}

View file

@ -1,6 +1,7 @@
using System.Globalization;
using System.Text.Json;
using EFCore.NamingConventions.Internal;
using FilterLists.Directory.Domain.Aggregates;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
@ -16,7 +17,7 @@ public record Change
public string? RejectedReason { get; private init; }
public JsonDocument? AggregateBefore { get; private init; }
public JsonDocument? AggregateAfter { get; private init; }
public string? AggregateType { get; private init; }
public AggregateType? AggregateType { get; private init; }
public int? FilterListId { get; private init; }
public FilterList? FilterList { get; }
public string? LanguageIso6391 { get; private init; }
@ -33,17 +34,6 @@ public record Change
public Tag? Tag { get; }
}
internal enum AggregateType
{
FilterList,
Language,
License,
Maintainer,
Software,
Syntax,
Tag
}
internal class UpdateConfiguration : IEntityTypeConfiguration<Change>
{
public virtual void Configure(EntityTypeBuilder<Change> builder)
@ -54,16 +44,17 @@ public virtual void Configure(EntityTypeBuilder<Change> builder)
static string BuildComputedAggregateTypeSql()
{
var nameRewriter = new SnakeCaseNameRewriter(CultureInfo.InvariantCulture);
// TODO: register and resolve INameRewriter
var nr = new SnakeCaseNameRewriter(CultureInfo.InvariantCulture);
return $@"
CASE
WHEN {nameRewriter.RewriteName(nameof(Change.FilterListId))} IS NOT NULL THEN '{AggregateType.FilterList}'
WHEN {nameRewriter.RewriteName(nameof(Change.LanguageIso6391))} IS NOT NULL THEN '{AggregateType.Language}'
WHEN {nameRewriter.RewriteName(nameof(Change.LicenseId))} IS NOT NULL THEN '{AggregateType.License}'
WHEN {nameRewriter.RewriteName(nameof(Change.MaintainerId))} IS NOT NULL THEN '{AggregateType.Maintainer}'
WHEN {nameRewriter.RewriteName(nameof(Change.SoftwareId))} IS NOT NULL THEN '{AggregateType.Software}'
WHEN {nameRewriter.RewriteName(nameof(Change.SyntaxId))} IS NOT NULL THEN '{AggregateType.Syntax}'
WHEN {nameRewriter.RewriteName(nameof(Change.TagId))} IS NOT NULL THEN '{AggregateType.Tag}'
WHEN {nr.RewriteName(nameof(Change.FilterListId))} IS NOT NULL THEN '{nr.RewriteName(nameof(AggregateType.FilterList))}'::{nr.RewriteName(nameof(AggregateType))}
WHEN {nr.RewriteName(nameof(Change.LanguageIso6391))} IS NOT NULL THEN '{nr.RewriteName(nameof(AggregateType.Language))}'::{nr.RewriteName(nameof(AggregateType))}
WHEN {nr.RewriteName(nameof(Change.LicenseId))} IS NOT NULL THEN '{nr.RewriteName(nameof(AggregateType.License))}'::{nr.RewriteName(nameof(AggregateType))}
WHEN {nr.RewriteName(nameof(Change.MaintainerId))} IS NOT NULL THEN '{nr.RewriteName(nameof(AggregateType.Maintainer))}'::{nr.RewriteName(nameof(AggregateType))}
WHEN {nr.RewriteName(nameof(Change.SoftwareId))} IS NOT NULL THEN '{nr.RewriteName(nameof(AggregateType.Software))}'::{nr.RewriteName(nameof(AggregateType))}
WHEN {nr.RewriteName(nameof(Change.SyntaxId))} IS NOT NULL THEN '{nr.RewriteName(nameof(AggregateType.Syntax))}'::{nr.RewriteName(nameof(AggregateType))}
WHEN {nr.RewriteName(nameof(Change.TagId))} IS NOT NULL THEN '{nr.RewriteName(nameof(AggregateType.Tag))}'::{nr.RewriteName(nameof(AggregateType))}
ELSE NULL
END";
}

View file

@ -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,9 @@ public static async Task MigrateAsync(this IHost host)
using var scope = host.Services.CreateScope();
var db = scope.ServiceProvider.GetRequiredService<QueryDbContext>();
await db.Database.MigrateAsync();
await using var conn = (NpgsqlConnection)db.Database.GetDbConnection();
await conn.OpenAsync();
conn.ReloadTypes();
}
}