From d097502a183b934915caa56c4ebd26b5c18a2d50 Mon Sep 17 00:00:00 2001 From: REDCODE Date: Mon, 11 Nov 2024 22:25:39 +0100 Subject: [PATCH] chore(DB): Generated migration for Folder, Settings and asset hash integration. chore(DB): added relationships between folder and asset --- Lactose/Context/LactoseDbContext.cs | 3 + ...241111212311_FolderAndSettings.Designer.cs | 445 ++++++++++++++++++ .../20241111212311_FolderAndSettings.cs | 95 ++++ .../LactoseDbContextModelSnapshot.cs | 52 ++ Lactose/Models/Folder.cs | 14 +- Lactose/Models/Settings.cs | 5 + 6 files changed, 610 insertions(+), 4 deletions(-) create mode 100644 Lactose/Migrations/20241111212311_FolderAndSettings.Designer.cs create mode 100644 Lactose/Migrations/20241111212311_FolderAndSettings.cs diff --git a/Lactose/Context/LactoseDbContext.cs b/Lactose/Context/LactoseDbContext.cs index 5b38248..90bfd4e 100644 --- a/Lactose/Context/LactoseDbContext.cs +++ b/Lactose/Context/LactoseDbContext.cs @@ -25,6 +25,7 @@ public class LactoseDbContext : DbContext { modelBuilder.Entity().HasMany(e => e.Albums).WithMany(e => e.Assets); modelBuilder.Entity().HasMany(e => e.Tags).WithMany(e => e.Assets); modelBuilder.Entity().HasMany(e => e.Faces).WithOne(e => e.Asset); + modelBuilder.Entity().HasOne(e => e.Folder).WithMany(e => e.Assets); //Face Relationships modelBuilder.Entity().HasOne(e => e.Asset).WithMany(e => e.Faces); modelBuilder.Entity().HasOne(e => e.Person).WithMany(e => e.Faces); @@ -37,5 +38,7 @@ public class LactoseDbContext : DbContext { //User Relationships modelBuilder.Entity().HasMany(e => e.OwnedAssets).WithOne(e => e.Owner); modelBuilder.Entity().HasMany(e => e.OwnedAlbums).WithOne(e => e.UserOwner); + //Folder Relationships + modelBuilder.Entity().HasMany(e => e.Assets).WithOne(e => e.Folder); } } diff --git a/Lactose/Migrations/20241111212311_FolderAndSettings.Designer.cs b/Lactose/Migrations/20241111212311_FolderAndSettings.Designer.cs new file mode 100644 index 0000000..88f8b40 --- /dev/null +++ b/Lactose/Migrations/20241111212311_FolderAndSettings.Designer.cs @@ -0,0 +1,445 @@ +// +using System; +using Lactose.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Lactose.Migrations +{ + [DbContext(typeof(LactoseDbContext))] + [Migration("20241111212311_FolderAndSettings")] + partial class FolderAndSettings + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "8.0.8") + .HasAnnotation("Relational:MaxIdentifierLength", 64); + + MySqlModelBuilderExtensions.AutoIncrementColumns(modelBuilder); + + modelBuilder.Entity("AlbumAsset", b => + { + b.Property("AlbumsId") + .HasColumnType("char(36)"); + + b.Property("AssetsId") + .HasColumnType("char(36)"); + + b.HasKey("AlbumsId", "AssetsId"); + + b.HasIndex("AssetsId"); + + b.ToTable("AlbumAsset"); + }); + + modelBuilder.Entity("AssetTag", b => + { + b.Property("AssetsId") + .HasColumnType("char(36)"); + + b.Property("TagsId") + .HasColumnType("char(36)"); + + b.HasKey("AssetsId", "TagsId"); + + b.HasIndex("TagsId"); + + b.ToTable("AssetTag"); + }); + + modelBuilder.Entity("Lactose.Models.Album", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .IsRequired() + .HasColumnType("datetime(6)"); + + b.Property("PersonOwnerId") + .HasColumnType("char(36)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("VARCHAR(255)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("UserOwnerId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("PersonOwnerId"); + + b.HasIndex("UserOwnerId"); + + b.ToTable("Albums"); + }); + + modelBuilder.Entity("Lactose.Models.Asset", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DeletedAt") + .HasColumnType("datetime(6)"); + + b.Property("Duration") + .HasColumnType("float"); + + b.Property("FileSize") + .HasColumnType("bigint"); + + b.Property("FolderId") + .HasColumnType("char(36)"); + + b.Property("FrameRate") + .HasColumnType("float"); + + b.Property("Hash") + .IsRequired() + .HasColumnType("BINARY(128)"); + + b.Property("IsPubliclyShared") + .HasColumnType("tinyint(1)"); + + b.Property("MimeType") + .IsRequired() + .HasColumnType("VARCHAR(255)"); + + b.Property("OriginalFilename") + .IsRequired() + .HasColumnType("VARCHAR(255)"); + + b.Property("OriginalPath") + .IsRequired() + .HasColumnType("VARCHAR(2048)"); + + b.Property("OwnerId") + .HasColumnType("char(36)"); + + b.Property("PreviewPath") + .IsRequired() + .HasColumnType("VARCHAR(2048)"); + + b.Property("ResolutionHeight") + .HasColumnType("int"); + + b.Property("ResolutionWidth") + .HasColumnType("int"); + + b.Property("ThumbnailPath") + .IsRequired() + .HasColumnType("VARCHAR(2048)"); + + b.Property("Type") + .HasColumnType("int"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.HasIndex("FolderId"); + + b.HasIndex("OwnerId"); + + b.ToTable("Assets"); + }); + + modelBuilder.Entity("Lactose.Models.Face", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AssetId") + .HasColumnType("char(36)"); + + b.Property("BoundingBoxX1") + .HasColumnType("int"); + + b.Property("BoundingBoxX2") + .HasColumnType("int"); + + b.Property("BoundingBoxY1") + .HasColumnType("int"); + + b.Property("BoundingBoxY2") + .HasColumnType("int"); + + b.Property("ImageHeight") + .HasColumnType("int"); + + b.Property("ImageWidth") + .HasColumnType("int"); + + b.Property("PersonId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("AssetId"); + + b.HasIndex("PersonId"); + + b.ToTable("Faces"); + }); + + modelBuilder.Entity("Lactose.Models.Folder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("BasePath") + .IsRequired() + .HasColumnType("VARCHAR(2048)"); + + b.HasKey("Id"); + + b.ToTable("Folders"); + }); + + modelBuilder.Entity("Lactose.Models.Person", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DeletedAt") + .HasColumnType("datetime(6)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("VARCHAR(255)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.HasKey("Id"); + + b.ToTable("People"); + }); + + modelBuilder.Entity("Lactose.Models.Settings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("UserRegistrationOpen") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Settings"); + }); + + modelBuilder.Entity("Lactose.Models.Tag", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("VARCHAR(255)"); + + b.Property("ParentId") + .HasColumnType("char(36)"); + + b.HasKey("Id"); + + b.HasIndex("ParentId"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("Lactose.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("AccessLevel") + .HasColumnType("int"); + + b.Property("AssetId") + .HasColumnType("char(36)"); + + b.Property("BannedAt") + .HasColumnType("datetime(6)"); + + b.Property("CreatedAt") + .HasColumnType("datetime(6)"); + + b.Property("DeletedAt") + .HasColumnType("datetime(6)"); + + b.Property("Email") + .IsRequired() + .HasColumnType("VARCHAR(128)"); + + b.Property("LastLogin") + .HasColumnType("datetime(6)"); + + b.Property("Password") + .IsRequired() + .HasColumnType("VARCHAR(255)"); + + b.Property("UpdatedAt") + .HasColumnType("datetime(6)"); + + b.Property("Username") + .IsRequired() + .HasColumnType("VARCHAR(64)"); + + b.HasKey("Id"); + + b.HasIndex("AssetId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("AlbumAsset", b => + { + b.HasOne("Lactose.Models.Album", null) + .WithMany() + .HasForeignKey("AlbumsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Lactose.Models.Asset", null) + .WithMany() + .HasForeignKey("AssetsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("AssetTag", b => + { + b.HasOne("Lactose.Models.Asset", null) + .WithMany() + .HasForeignKey("AssetsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Lactose.Models.Tag", null) + .WithMany() + .HasForeignKey("TagsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Lactose.Models.Album", b => + { + b.HasOne("Lactose.Models.Person", "PersonOwner") + .WithMany("Albums") + .HasForeignKey("PersonOwnerId"); + + b.HasOne("Lactose.Models.User", "UserOwner") + .WithMany("OwnedAlbums") + .HasForeignKey("UserOwnerId"); + + b.Navigation("PersonOwner"); + + b.Navigation("UserOwner"); + }); + + modelBuilder.Entity("Lactose.Models.Asset", b => + { + b.HasOne("Lactose.Models.Folder", "Folder") + .WithMany("Assets") + .HasForeignKey("FolderId"); + + b.HasOne("Lactose.Models.User", "Owner") + .WithMany("OwnedAssets") + .HasForeignKey("OwnerId"); + + b.Navigation("Folder"); + + b.Navigation("Owner"); + }); + + modelBuilder.Entity("Lactose.Models.Face", b => + { + b.HasOne("Lactose.Models.Asset", "Asset") + .WithMany("Faces") + .HasForeignKey("AssetId"); + + b.HasOne("Lactose.Models.Person", "Person") + .WithMany("Faces") + .HasForeignKey("PersonId"); + + b.Navigation("Asset"); + + b.Navigation("Person"); + }); + + modelBuilder.Entity("Lactose.Models.Tag", b => + { + b.HasOne("Lactose.Models.Tag", "Parent") + .WithMany() + .HasForeignKey("ParentId"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("Lactose.Models.User", b => + { + b.HasOne("Lactose.Models.Asset", null) + .WithMany("SharedWith") + .HasForeignKey("AssetId"); + }); + + modelBuilder.Entity("Lactose.Models.Asset", b => + { + b.Navigation("Faces"); + + b.Navigation("SharedWith"); + }); + + modelBuilder.Entity("Lactose.Models.Folder", b => + { + b.Navigation("Assets"); + }); + + modelBuilder.Entity("Lactose.Models.Person", b => + { + b.Navigation("Albums"); + + b.Navigation("Faces"); + }); + + modelBuilder.Entity("Lactose.Models.User", b => + { + b.Navigation("OwnedAlbums"); + + b.Navigation("OwnedAssets"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Lactose/Migrations/20241111212311_FolderAndSettings.cs b/Lactose/Migrations/20241111212311_FolderAndSettings.cs new file mode 100644 index 0000000..67a7e94 --- /dev/null +++ b/Lactose/Migrations/20241111212311_FolderAndSettings.cs @@ -0,0 +1,95 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Lactose.Migrations +{ + /// + public partial class FolderAndSettings : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "FolderId", + table: "Assets", + type: "char(36)", + nullable: true, + collation: "ascii_general_ci"); + + migrationBuilder.AddColumn( + name: "Hash", + table: "Assets", + type: "BINARY(128)", + nullable: false, + defaultValue: new byte[0]); + + migrationBuilder.CreateTable( + name: "Folders", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + BasePath = table.Column(type: "VARCHAR(2048)", nullable: false) + .Annotation("MySql:CharSet", "utf8mb4"), + Active = table.Column(type: "tinyint(1)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Folders", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateTable( + name: "Settings", + columns: table => new + { + Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"), + UserRegistrationOpen = table.Column(type: "tinyint(1)", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Settings", x => x.Id); + }) + .Annotation("MySql:CharSet", "utf8mb4"); + + migrationBuilder.CreateIndex( + name: "IX_Assets_FolderId", + table: "Assets", + column: "FolderId"); + + migrationBuilder.AddForeignKey( + name: "FK_Assets_Folders_FolderId", + table: "Assets", + column: "FolderId", + principalTable: "Folders", + principalColumn: "Id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Assets_Folders_FolderId", + table: "Assets"); + + migrationBuilder.DropTable( + name: "Folders"); + + migrationBuilder.DropTable( + name: "Settings"); + + migrationBuilder.DropIndex( + name: "IX_Assets_FolderId", + table: "Assets"); + + migrationBuilder.DropColumn( + name: "FolderId", + table: "Assets"); + + migrationBuilder.DropColumn( + name: "Hash", + table: "Assets"); + } + } +} diff --git a/Lactose/Migrations/LactoseDbContextModelSnapshot.cs b/Lactose/Migrations/LactoseDbContextModelSnapshot.cs index 92032e3..b5ca8c6 100644 --- a/Lactose/Migrations/LactoseDbContextModelSnapshot.cs +++ b/Lactose/Migrations/LactoseDbContextModelSnapshot.cs @@ -102,9 +102,16 @@ namespace Lactose.Migrations b.Property("FileSize") .HasColumnType("bigint"); + b.Property("FolderId") + .HasColumnType("char(36)"); + b.Property("FrameRate") .HasColumnType("float"); + b.Property("Hash") + .IsRequired() + .HasColumnType("BINARY(128)"); + b.Property("IsPubliclyShared") .HasColumnType("tinyint(1)"); @@ -145,6 +152,8 @@ namespace Lactose.Migrations b.HasKey("Id"); + b.HasIndex("FolderId"); + b.HasIndex("OwnerId"); b.ToTable("Assets"); @@ -189,6 +198,24 @@ namespace Lactose.Migrations b.ToTable("Faces"); }); + modelBuilder.Entity("Lactose.Models.Folder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("Active") + .HasColumnType("tinyint(1)"); + + b.Property("BasePath") + .IsRequired() + .HasColumnType("VARCHAR(2048)"); + + b.HasKey("Id"); + + b.ToTable("Folders"); + }); + modelBuilder.Entity("Lactose.Models.Person", b => { b.Property("Id") @@ -213,6 +240,20 @@ namespace Lactose.Migrations b.ToTable("People"); }); + modelBuilder.Entity("Lactose.Models.Settings", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("char(36)"); + + b.Property("UserRegistrationOpen") + .HasColumnType("tinyint(1)"); + + b.HasKey("Id"); + + b.ToTable("Settings"); + }); + modelBuilder.Entity("Lactose.Models.Tag", b => { b.Property("Id") @@ -326,10 +367,16 @@ namespace Lactose.Migrations modelBuilder.Entity("Lactose.Models.Asset", b => { + b.HasOne("Lactose.Models.Folder", "Folder") + .WithMany("Assets") + .HasForeignKey("FolderId"); + b.HasOne("Lactose.Models.User", "Owner") .WithMany("OwnedAssets") .HasForeignKey("OwnerId"); + b.Navigation("Folder"); + b.Navigation("Owner"); }); @@ -371,6 +418,11 @@ namespace Lactose.Migrations b.Navigation("SharedWith"); }); + modelBuilder.Entity("Lactose.Models.Folder", b => + { + b.Navigation("Assets"); + }); + modelBuilder.Entity("Lactose.Models.Person", b => { b.Navigation("Albums"); diff --git a/Lactose/Models/Folder.cs b/Lactose/Models/Folder.cs index 1af5bd2..695ed86 100644 --- a/Lactose/Models/Folder.cs +++ b/Lactose/Models/Folder.cs @@ -10,18 +10,24 @@ public class Folder { /// /// Gets or sets the unique identifier for the folder. /// - [Required][Key] - Guid Id { get; set; } + [Key] + public Guid Id { get; set; } /// /// Gets or sets the base path of the folder. /// [Required][Column(TypeName = "VARCHAR(2048)")] - string BasePath { get; set; } = string.Empty; + public string BasePath { get; set; } = string.Empty; /// /// Gets or sets a value indicating whether the folder is active. /// [Required] - bool Active { get; set; } + public bool Active { get; set; } + + #region Navigation Properties + + public List Assets { get; set; } + + #endregion } diff --git a/Lactose/Models/Settings.cs b/Lactose/Models/Settings.cs index 1bf5366..57d456b 100644 --- a/Lactose/Models/Settings.cs +++ b/Lactose/Models/Settings.cs @@ -1,5 +1,10 @@ +using System.ComponentModel.DataAnnotations; + namespace Lactose.Models; public class Settings { + [Key] + public Guid Id { get; set; } + public bool UserRegistrationOpen { get; set; } }