mirror of
https://github.com/collinbarrett/FilterLists.git
synced 2026-03-11 09:04:27 +00:00
refactor(dir): ♻ use enum for Change discriminator
This commit is contained in:
parent
471c46201c
commit
60ab924ec4
6 changed files with 55 additions and 23 deletions
|
|
@ -0,0 +1,12 @@
|
|||
namespace FilterLists.Directory.Domain.Aggregates;
|
||||
|
||||
public enum AggregateType
|
||||
{
|
||||
FilterList,
|
||||
Language,
|
||||
License,
|
||||
Maintainer,
|
||||
Software,
|
||||
Syntax,
|
||||
Tag
|
||||
}
|
||||
|
|
@ -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>();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue