diff --git a/shared/InkForge.Data/Infrastructure/Entities.cs b/shared/InkForge.Data/Infrastructure/Entities.cs index 21e76f2..5618458 100644 --- a/shared/InkForge.Data/Infrastructure/Entities.cs +++ b/shared/InkForge.Data/Infrastructure/Entities.cs @@ -9,14 +9,12 @@ namespace InkForge.Data public abstract class Entity : ValueEntity - where TKey : struct, INumber { public TKey? Id { get; set; } } public abstract class VersionedEntity : ValueEntity - where TKey : struct, INumber { public TKey Id { get; set; } diff --git a/shared/InkForge.Data/Infrastructure/MetadataEntities.cs b/shared/InkForge.Data/Infrastructure/MetadataEntities.cs new file mode 100644 index 0000000..0cdb79b --- /dev/null +++ b/shared/InkForge.Data/Infrastructure/MetadataEntities.cs @@ -0,0 +1,5 @@ +namespace InkForge.Data.Infrastructure; + +public class MetadataEntity : Entity; + +public class MetadataVersionEntity : VersionedEntity; diff --git a/shared/InkForge.Data/NoteDbContext.cs b/shared/InkForge.Data/NoteDbContext.cs index bb3e436..943f555 100644 --- a/shared/InkForge.Data/NoteDbContext.cs +++ b/shared/InkForge.Data/NoteDbContext.cs @@ -10,12 +10,28 @@ public class NoteDbContext( { public DbSet Blobs { get; set; } = default!; + public DbSet Metadata { get; set; } = default!; + + public DbSet MetadataHistory { get; set; } = default!; + public DbSet Notes { get; set; } = default!; public DbSet NoteVersions { get; set; } = default!; protected override void OnModelCreating(ModelBuilder modelBuilder) { + modelBuilder.Entity(options => + { + options.HasKey(m => m.Id); + }); + + modelBuilder.Entity(options => + { + options.Property(m => m.Id).IsRequired(); + options.HasKey(m => m.Version); + options.HasIndex(nameof(MetadataVersionEntity.Id), nameof(MetadataVersionEntity.Version)).IsUnique(); + }); + modelBuilder.Entity(options => { options.OwnsOne(m => m.Value); diff --git a/shared/migrations/InkForge.Sqlite/Migrations/20240207000000_Initial.Designer.cs b/shared/migrations/InkForge.Sqlite/Migrations/20240207000000__01_Initial.Designer.cs similarity index 98% rename from shared/migrations/InkForge.Sqlite/Migrations/20240207000000_Initial.Designer.cs rename to shared/migrations/InkForge.Sqlite/Migrations/20240207000000__01_Initial.Designer.cs index ccba16e..bcfd152 100644 --- a/shared/migrations/InkForge.Sqlite/Migrations/20240207000000_Initial.Designer.cs +++ b/shared/migrations/InkForge.Sqlite/Migrations/20240207000000__01_Initial.Designer.cs @@ -11,8 +11,8 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace InkForge.Sqlite.Migrations { [DbContext(typeof(NoteDbContext))] - [Migration("20240207000000_Initial")] - partial class Initial + [Migration("20240207000000__01_Initial")] + partial class _01_Initial { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) diff --git a/shared/migrations/InkForge.Sqlite/Migrations/20240207000000_Initial.cs b/shared/migrations/InkForge.Sqlite/Migrations/20240207000000__01_Initial.cs similarity index 98% rename from shared/migrations/InkForge.Sqlite/Migrations/20240207000000_Initial.cs rename to shared/migrations/InkForge.Sqlite/Migrations/20240207000000__01_Initial.cs index 34601ad..0ac6965 100644 --- a/shared/migrations/InkForge.Sqlite/Migrations/20240207000000_Initial.cs +++ b/shared/migrations/InkForge.Sqlite/Migrations/20240207000000__01_Initial.cs @@ -6,7 +6,7 @@ using Microsoft.EntityFrameworkCore.Migrations; namespace InkForge.Sqlite.Migrations { /// - public partial class Initial : Migration + public partial class _01_Initial : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) diff --git a/shared/migrations/InkForge.Sqlite/Migrations/20240214000000__02_Metadata.Designer.cs b/shared/migrations/InkForge.Sqlite/Migrations/20240214000000__02_Metadata.Designer.cs new file mode 100644 index 0000000..89a839f --- /dev/null +++ b/shared/migrations/InkForge.Sqlite/Migrations/20240214000000__02_Metadata.Designer.cs @@ -0,0 +1,207 @@ +// +using System; +using InkForge.Data; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace InkForge.Sqlite.Migrations +{ + [DbContext(typeof(NoteDbContext))] + [Migration("20240214000000__02_Metadata")] + partial class _02_Metadata + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "8.0.2"); + + modelBuilder.Entity("InkForge.Data.Blob", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("Content") + .IsRequired() + .HasColumnType("BLOB"); + + b.HasKey("Id"); + + b.ToTable("Blobs"); + }); + + modelBuilder.Entity("InkForge.Data.Infrastructure.MetadataEntity", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Metadata"); + }); + + modelBuilder.Entity("InkForge.Data.Infrastructure.MetadataVersionEntity", b => + { + b.Property("Version") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Version"); + + b.HasIndex("Id", "Version") + .IsUnique(); + + b.ToTable("MetadataHistory"); + }); + + modelBuilder.Entity("InkForge.Data.Infrastructure.NoteEntity", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.ToTable("Notes"); + }); + + modelBuilder.Entity("InkForge.Data.Infrastructure.NoteVersionEntity", b => + { + b.Property("Version") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Id") + .HasColumnType("INTEGER"); + + b.HasKey("Version"); + + b.HasIndex("Id", "Version") + .IsUnique(); + + b.ToTable("NoteVersions"); + }); + + modelBuilder.Entity("InkForge.Data.Infrastructure.NoteEntity", b => + { + b.OwnsOne("InkForge.Data.Domain.Note", "Value", b1 => + { + b1.Property("ParentId") + .HasColumnType("INTEGER"); + + b1.Property("ContentId") + .IsRequired() + .HasColumnType("TEXT"); + + b1.Property("Created") + .HasColumnType("TEXT"); + + b1.Property("Deleted") + .HasColumnType("TEXT"); + + b1.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b1.Property("Updated") + .HasColumnType("TEXT"); + + b1.HasKey("ParentId"); + + b1.HasIndex("ContentId"); + + b1.ToTable("Notes"); + + b1.HasOne("InkForge.Data.Blob", "Content") + .WithMany() + .HasForeignKey("ContentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b1.WithOwner("Parent") + .HasForeignKey("ParentId"); + + b1.Navigation("Content"); + + b1.Navigation("Parent"); + }); + + b.Navigation("Value") + .IsRequired(); + }); + + modelBuilder.Entity("InkForge.Data.Infrastructure.NoteVersionEntity", b => + { + b.OwnsOne("InkForge.Data.Domain.Note", "Value", b1 => + { + b1.Property("NoteVersionEntityVersion") + .HasColumnType("INTEGER"); + + b1.Property("ContentId") + .IsRequired() + .HasColumnType("TEXT"); + + b1.Property("Created") + .HasColumnType("TEXT"); + + b1.Property("Deleted") + .HasColumnType("TEXT"); + + b1.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b1.Property("ParentId") + .HasColumnType("INTEGER"); + + b1.Property("Updated") + .HasColumnType("TEXT"); + + b1.HasKey("NoteVersionEntityVersion"); + + b1.HasIndex("ContentId"); + + b1.HasIndex("ParentId"); + + b1.ToTable("NoteVersions"); + + b1.HasOne("InkForge.Data.Blob", "Content") + .WithMany() + .HasForeignKey("ContentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b1.WithOwner() + .HasForeignKey("NoteVersionEntityVersion"); + + b1.HasOne("InkForge.Data.Infrastructure.NoteEntity", "Parent") + .WithMany() + .HasForeignKey("ParentId"); + + b1.Navigation("Content"); + + b1.Navigation("Parent"); + }); + + b.Navigation("Value") + .IsRequired(); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/shared/migrations/InkForge.Sqlite/Migrations/20240214000000__02_Metadata.cs b/shared/migrations/InkForge.Sqlite/Migrations/20240214000000__02_Metadata.cs new file mode 100644 index 0000000..698c390 --- /dev/null +++ b/shared/migrations/InkForge.Sqlite/Migrations/20240214000000__02_Metadata.cs @@ -0,0 +1,56 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace InkForge.Sqlite.Migrations +{ + /// + public partial class _02_Metadata : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Metadata", + columns: table => new + { + Id = table.Column(type: "TEXT", nullable: false), + Value = table.Column(type: "TEXT", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Metadata", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "MetadataHistory", + columns: table => new + { + Version = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + Value = table.Column(type: "TEXT", nullable: false), + Id = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_MetadataHistory", x => x.Version); + }); + + migrationBuilder.CreateIndex( + name: "IX_MetadataHistory_Id_Version", + table: "MetadataHistory", + columns: new[] { "Id", "Version" }, + unique: true); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Metadata"); + + migrationBuilder.DropTable( + name: "MetadataHistory"); + } + } +} diff --git a/shared/migrations/InkForge.Sqlite/Migrations/NoteDbContextModelSnapshot.cs b/shared/migrations/InkForge.Sqlite/Migrations/NoteDbContextModelSnapshot.cs index c1f8a65..dea2226 100644 --- a/shared/migrations/InkForge.Sqlite/Migrations/NoteDbContextModelSnapshot.cs +++ b/shared/migrations/InkForge.Sqlite/Migrations/NoteDbContextModelSnapshot.cs @@ -15,7 +15,7 @@ namespace InkForge.Sqlite.Migrations protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 - modelBuilder.HasAnnotation("ProductVersion", "8.0.1"); + modelBuilder.HasAnnotation("ProductVersion", "8.0.2"); modelBuilder.Entity("InkForge.Data.Blob", b => { @@ -31,9 +31,44 @@ namespace InkForge.Sqlite.Migrations b.ToTable("Blobs"); }); + modelBuilder.Entity("InkForge.Data.Infrastructure.MetadataEntity", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Metadata"); + }); + + modelBuilder.Entity("InkForge.Data.Infrastructure.MetadataVersionEntity", b => + { + b.Property("Version") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("Value") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Version"); + + b.HasIndex("Id", "Version") + .IsUnique(); + + b.ToTable("MetadataHistory"); + }); + modelBuilder.Entity("InkForge.Data.Infrastructure.NoteEntity", b => { - b.Property("Id") + b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("INTEGER");