diff options
| author | Melodi <62381002+Melodi17@users.noreply.github.com> | 2026-09-13 13:22:20 +1000 |
|---|---|---|
| committer | Melodi <62381002+Melodi17@users.noreply.github.com> | 2026-09-13 13:22:20 +1000 |
| commit | df0737e55afeb5c01eb39909605970d1d3a73ffc (patch) | |
| tree | 09823eaa310c60eefd2420dc305acae45c81900f /src/marlin.web/Data | |
| parent | ee69ce25b2fba871920260028bb10c2d6b62b26f (diff) | |
refactor: cleanup; feat: connection to agent
Diffstat (limited to 'src/marlin.web/Data')
| -rw-r--r-- | src/marlin.web/Data/ApplicationDbContext.cs | 23 | ||||
| -rw-r--r-- | src/marlin.web/Data/JsonValueComparer.cs | 23 |
2 files changed, 39 insertions, 7 deletions
diff --git a/src/marlin.web/Data/ApplicationDbContext.cs b/src/marlin.web/Data/ApplicationDbContext.cs index 2e05835..cb6b05b 100644 --- a/src/marlin.web/Data/ApplicationDbContext.cs +++ b/src/marlin.web/Data/ApplicationDbContext.cs @@ -3,6 +3,7 @@ namespace marlin.web.Data; using System.Linq.Expressions; using System.Text.Json; using core; +using core.functional; using core.models; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; @@ -26,6 +27,7 @@ public class ApplicationDbContext : DbContext public DbSet<VersionControlSecret> Secrets => this.Set<VersionControlSecret>(); public DbSet<Job> Jobs => this.Set<Job>(); public DbSet<Agent> Agents => this.Set<Agent>(); + public DbSet<WorkflowSnapshot> WorkflowSnapshots => this.Set<WorkflowSnapshot>(); public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) { } @@ -35,9 +37,7 @@ public class ApplicationDbContext : DbContext modelBuilder .Entity<Agent>() .Property(p => p.Capabilities) - .HasConversion( - v => JsonSerializer.Serialize(v, (JsonSerializerOptions?)null), - v => JsonSerializer.Deserialize<CapabilitySet>(v, (JsonSerializerOptions?)null)!); + .HasJsonConversion(); modelBuilder .Entity<VersionControlledCommit>() @@ -46,10 +46,19 @@ public class ApplicationDbContext : DbContext modelBuilder .Entity<VersionControlSecret>() .Property(p => p.Content) - .HasConversion( - v => JsonSerializer.Serialize(v, (JsonSerializerOptions?)null), - v => JsonSerializer.Deserialize<Dictionary<string, string>>(v, (JsonSerializerOptions?)null)!); - + .HasJsonConversion(); + + modelBuilder + .Entity<VersionControlledCommit>() + .HasOne(x => x.WorkflowSnapshot) + .WithOne(x => x.Commit) + .HasForeignKey<WorkflowSnapshot>(x => x.CommitId); + + modelBuilder + .Entity<WorkflowSnapshot>() + .Property(p => p.Workflow) + .HasJsonConversion(); + base.OnModelCreating(modelBuilder); } }
\ No newline at end of file diff --git a/src/marlin.web/Data/JsonValueComparer.cs b/src/marlin.web/Data/JsonValueComparer.cs new file mode 100644 index 0000000..f07c133 --- /dev/null +++ b/src/marlin.web/Data/JsonValueComparer.cs @@ -0,0 +1,23 @@ +namespace marlin.web.Data; + +using System.Text.Json; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +public static class JsonValueComparer +{ + public static ValueComparer<T> Create<T>() => new( + (a, b) => JsonSerializer.Serialize(a, (JsonSerializerOptions?)null) == JsonSerializer.Serialize(b, (JsonSerializerOptions?)null), + v => JsonSerializer.Serialize(v, (JsonSerializerOptions?)null).GetHashCode(), + v => JsonSerializer.Deserialize<T>(JsonSerializer.Serialize(v, (JsonSerializerOptions?)null), (JsonSerializerOptions?)null)!); +} + +public static class PropertyBuilderExtensions +{ + public static PropertyBuilder<T> HasJsonConversion<T>(this PropertyBuilder<T> builder) => + builder.HasConversion( + v => JsonSerializer.Serialize(v, (JsonSerializerOptions?)null), + v => JsonSerializer.Deserialize<T>(v, (JsonSerializerOptions?)null)!, + JsonValueComparer.Create<T>()); +} |
