From 7b715eb1883c9caf7d4b5143b8f7720dd663acd8 Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Thu, 22 Dec 2022 16:31:58 +0100 Subject: feat: Add folder parent --- code/api/Database/AppDatabase.cs | 1 + code/api/Database/Models/Folder.cs | 2 + code/api/Endpoints/Storage/TreeEndpoint.cs | 9 + .../20221222153132_FolderParent.Designer.cs | 426 +++++++++++++++++++++ code/api/Migrations/20221222153132_FolderParent.cs | 211 ++++++++++ code/api/Migrations/AppDatabaseModelSnapshot.cs | 26 +- 6 files changed, 666 insertions(+), 9 deletions(-) create mode 100644 code/api/Endpoints/Storage/TreeEndpoint.cs create mode 100644 code/api/Migrations/20221222153132_FolderParent.Designer.cs create mode 100644 code/api/Migrations/20221222153132_FolderParent.cs (limited to 'code/api') diff --git a/code/api/Database/AppDatabase.cs b/code/api/Database/AppDatabase.cs index 722a3e0..eac20b3 100644 --- a/code/api/Database/AppDatabase.cs +++ b/code/api/Database/AppDatabase.cs @@ -21,6 +21,7 @@ public class AppDatabase : DbContext modelBuilder.Entity(e => { e.HasMany(c => c.Files); e.HasMany(c => c.Permissions); + e.HasOne(c => c.Parent); e.ToTable("folders"); }); modelBuilder.Entity(e => { diff --git a/code/api/Database/Models/Folder.cs b/code/api/Database/Models/Folder.cs index ecfed1e..7a05f45 100644 --- a/code/api/Database/Models/Folder.cs +++ b/code/api/Database/Models/Folder.cs @@ -3,6 +3,8 @@ namespace I2R.Storage.Api.Database.Models; public class Folder : Base { public string Name { get; set; } + public Folder Parent { get; set; } + public Guid? ParentId { get; set; } public List Files { get; set; } public List Permissions { get; set; } public bool IsEncrypted { get; set; } diff --git a/code/api/Endpoints/Storage/TreeEndpoint.cs b/code/api/Endpoints/Storage/TreeEndpoint.cs new file mode 100644 index 0000000..857a570 --- /dev/null +++ b/code/api/Endpoints/Storage/TreeEndpoint.cs @@ -0,0 +1,9 @@ +namespace I2R.Storage.Api.Endpoints.Storage; + +public class TreeEndpoint : EndpointBase +{ + [HttpGet("~/storage/tree")] + public async Task Handle(Guid parent = default) { + return Ok(); + } +} \ No newline at end of file diff --git a/code/api/Migrations/20221222153132_FolderParent.Designer.cs b/code/api/Migrations/20221222153132_FolderParent.Designer.cs new file mode 100644 index 0000000..ba2c456 --- /dev/null +++ b/code/api/Migrations/20221222153132_FolderParent.Designer.cs @@ -0,0 +1,426 @@ +// +using System; +using I2R.Storage.Api.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace I2R.Storage.Api.Migrations +{ + [DbContext(typeof(AppDatabase))] + [Migration("20221222153132_FolderParent")] + partial class FolderParent + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.1") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("I2R.Storage.Api.Database.Models.File", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("FolderId") + .HasColumnType("uuid") + .HasColumnName("folder_id"); + + b.Property("IsBinned") + .HasColumnType("boolean") + .HasColumnName("is_binned"); + + b.Property("IsEncrypted") + .HasColumnType("boolean") + .HasColumnName("is_encrypted"); + + b.Property("LastDeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_deleted_at"); + + b.Property("LastDeletedBy") + .HasColumnType("uuid") + .HasColumnName("last_deleted_by"); + + b.Property("LastModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_modified_at"); + + b.Property("LastModifiedBy") + .HasColumnType("uuid") + .HasColumnName("last_modified_by"); + + b.Property("MimeType") + .HasColumnType("text") + .HasColumnName("mime_type"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("OwningUserId") + .HasColumnType("uuid") + .HasColumnName("owning_user_id"); + + b.Property("SizeInBytes") + .HasColumnType("bigint") + .HasColumnName("size_in_bytes"); + + b.HasKey("Id") + .HasName("pk_files"); + + b.HasIndex("FolderId") + .HasDatabaseName("ix_files_folder_id"); + + b.ToTable("files", (string)null); + }); + + modelBuilder.Entity("I2R.Storage.Api.Database.Models.Folder", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("IsBinned") + .HasColumnType("boolean") + .HasColumnName("is_binned"); + + b.Property("IsEncrypted") + .HasColumnType("boolean") + .HasColumnName("is_encrypted"); + + b.Property("LastDeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_deleted_at"); + + b.Property("LastDeletedBy") + .HasColumnType("uuid") + .HasColumnName("last_deleted_by"); + + b.Property("LastModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_modified_at"); + + b.Property("LastModifiedBy") + .HasColumnType("uuid") + .HasColumnName("last_modified_by"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("OwningUserId") + .HasColumnType("uuid") + .HasColumnName("owning_user_id"); + + b.Property("ParentId") + .HasColumnType("uuid") + .HasColumnName("parent_id"); + + b.HasKey("Id") + .HasName("pk_folders"); + + b.HasIndex("ParentId") + .HasDatabaseName("ix_folders_parent_id"); + + b.ToTable("folders", (string)null); + }); + + modelBuilder.Entity("I2R.Storage.Api.Database.Models.Permission", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("CanRead") + .HasColumnType("boolean") + .HasColumnName("can_read"); + + b.Property("CanWrite") + .HasColumnType("boolean") + .HasColumnName("can_write"); + + b.Property("ContentId") + .HasColumnType("uuid") + .HasColumnName("content_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("FileId") + .HasColumnType("uuid") + .HasColumnName("file_id"); + + b.Property("FolderId") + .HasColumnType("uuid") + .HasColumnName("folder_id"); + + b.Property("GroupId") + .HasColumnType("uuid") + .HasColumnName("group_id"); + + b.Property("IsFile") + .HasColumnType("boolean") + .HasColumnName("is_file"); + + b.Property("LastDeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_deleted_at"); + + b.Property("LastDeletedBy") + .HasColumnType("uuid") + .HasColumnName("last_deleted_by"); + + b.Property("LastModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_modified_at"); + + b.Property("LastModifiedBy") + .HasColumnType("uuid") + .HasColumnName("last_modified_by"); + + b.Property("OwningUserId") + .HasColumnType("uuid") + .HasColumnName("owning_user_id"); + + b.HasKey("Id") + .HasName("pk_permissions"); + + b.HasIndex("FileId") + .HasDatabaseName("ix_permissions_file_id"); + + b.HasIndex("FolderId") + .HasDatabaseName("ix_permissions_folder_id"); + + b.HasIndex("GroupId") + .HasDatabaseName("ix_permissions_group_id"); + + b.ToTable("permissions", (string)null); + }); + + modelBuilder.Entity("I2R.Storage.Api.Database.Models.PermissionGroup", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("LastDeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_deleted_at"); + + b.Property("LastDeletedBy") + .HasColumnType("uuid") + .HasColumnName("last_deleted_by"); + + b.Property("LastModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_modified_at"); + + b.Property("LastModifiedBy") + .HasColumnType("uuid") + .HasColumnName("last_modified_by"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("OwningUserId") + .HasColumnType("uuid") + .HasColumnName("owning_user_id"); + + b.HasKey("Id") + .HasName("pk_permission_groups"); + + b.ToTable("permission_groups", (string)null); + }); + + modelBuilder.Entity("I2R.Storage.Api.Database.Models.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("FirstName") + .HasColumnType("text") + .HasColumnName("first_name"); + + b.Property("LastDeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_deleted_at"); + + b.Property("LastDeletedBy") + .HasColumnType("uuid") + .HasColumnName("last_deleted_by"); + + b.Property("LastLoggedOn") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_logged_on"); + + b.Property("LastModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("last_modified_at"); + + b.Property("LastModifiedBy") + .HasColumnType("uuid") + .HasColumnName("last_modified_by"); + + b.Property("LastName") + .HasColumnType("text") + .HasColumnName("last_name"); + + b.Property("OwningUserId") + .HasColumnType("uuid") + .HasColumnName("owning_user_id"); + + b.Property("Password") + .HasColumnType("text") + .HasColumnName("password"); + + b.Property("PermissionGroupId") + .HasColumnType("uuid") + .HasColumnName("permission_group_id"); + + b.Property("Role") + .HasColumnType("integer") + .HasColumnName("role"); + + b.Property("Username") + .HasColumnType("text") + .HasColumnName("username"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.HasIndex("PermissionGroupId") + .HasDatabaseName("ix_users_permission_group_id"); + + b.ToTable("users", (string)null); + }); + + modelBuilder.Entity("I2R.Storage.Api.Database.Models.File", b => + { + b.HasOne("I2R.Storage.Api.Database.Models.Folder", "Folder") + .WithMany("Files") + .HasForeignKey("FolderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_files_folders_folder_id"); + + b.Navigation("Folder"); + }); + + modelBuilder.Entity("I2R.Storage.Api.Database.Models.Folder", b => + { + b.HasOne("I2R.Storage.Api.Database.Models.Folder", "Parent") + .WithMany() + .HasForeignKey("ParentId") + .HasConstraintName("fk_folders_folders_parent_id"); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("I2R.Storage.Api.Database.Models.Permission", b => + { + b.HasOne("I2R.Storage.Api.Database.Models.File", null) + .WithMany("Permissions") + .HasForeignKey("FileId") + .HasConstraintName("fk_permissions_files_file_id"); + + b.HasOne("I2R.Storage.Api.Database.Models.Folder", null) + .WithMany("Permissions") + .HasForeignKey("FolderId") + .HasConstraintName("fk_permissions_folders_folder_id"); + + b.HasOne("I2R.Storage.Api.Database.Models.PermissionGroup", "Group") + .WithMany() + .HasForeignKey("GroupId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_permissions_permission_groups_group_id"); + + b.Navigation("Group"); + }); + + modelBuilder.Entity("I2R.Storage.Api.Database.Models.User", b => + { + b.HasOne("I2R.Storage.Api.Database.Models.PermissionGroup", null) + .WithMany("Users") + .HasForeignKey("PermissionGroupId") + .HasConstraintName("fk_users_permission_groups_permission_group_id"); + }); + + modelBuilder.Entity("I2R.Storage.Api.Database.Models.File", b => + { + b.Navigation("Permissions"); + }); + + modelBuilder.Entity("I2R.Storage.Api.Database.Models.Folder", b => + { + b.Navigation("Files"); + + b.Navigation("Permissions"); + }); + + modelBuilder.Entity("I2R.Storage.Api.Database.Models.PermissionGroup", b => + { + b.Navigation("Users"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/code/api/Migrations/20221222153132_FolderParent.cs b/code/api/Migrations/20221222153132_FolderParent.cs new file mode 100644 index 0000000..1525d4c --- /dev/null +++ b/code/api/Migrations/20221222153132_FolderParent.cs @@ -0,0 +1,211 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace I2R.Storage.Api.Migrations +{ + /// + public partial class FolderParent : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "username", + table: "users", + type: "text", + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AlterColumn( + name: "password", + table: "users", + type: "text", + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AlterColumn( + name: "last_name", + table: "users", + type: "text", + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AlterColumn( + name: "first_name", + table: "users", + type: "text", + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AlterColumn( + name: "name", + table: "permission_groups", + type: "text", + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AlterColumn( + name: "description", + table: "permission_groups", + type: "text", + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AlterColumn( + name: "name", + table: "folders", + type: "text", + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AddColumn( + name: "parent_id", + table: "folders", + type: "uuid", + nullable: true); + + migrationBuilder.AlterColumn( + name: "name", + table: "files", + type: "text", + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.AlterColumn( + name: "mime_type", + table: "files", + type: "text", + nullable: true, + oldClrType: typeof(string), + oldType: "text"); + + migrationBuilder.CreateIndex( + name: "ix_folders_parent_id", + table: "folders", + column: "parent_id"); + + migrationBuilder.AddForeignKey( + name: "fk_folders_folders_parent_id", + table: "folders", + column: "parent_id", + principalTable: "folders", + principalColumn: "id"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "fk_folders_folders_parent_id", + table: "folders"); + + migrationBuilder.DropIndex( + name: "ix_folders_parent_id", + table: "folders"); + + migrationBuilder.DropColumn( + name: "parent_id", + table: "folders"); + + migrationBuilder.AlterColumn( + name: "username", + table: "users", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "text", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "password", + table: "users", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "text", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "last_name", + table: "users", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "text", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "first_name", + table: "users", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "text", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "name", + table: "permission_groups", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "text", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "description", + table: "permission_groups", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "text", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "name", + table: "folders", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "text", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "name", + table: "files", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "text", + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "mime_type", + table: "files", + type: "text", + nullable: false, + defaultValue: "", + oldClrType: typeof(string), + oldType: "text", + oldNullable: true); + } + } +} diff --git a/code/api/Migrations/AppDatabaseModelSnapshot.cs b/code/api/Migrations/AppDatabaseModelSnapshot.cs index 9f0ab71..4d471ce 100644 --- a/code/api/Migrations/AppDatabaseModelSnapshot.cs +++ b/code/api/Migrations/AppDatabaseModelSnapshot.cs @@ -66,12 +66,10 @@ namespace I2R.Storage.Api.Migrations .HasColumnName("last_modified_by"); b.Property("MimeType") - .IsRequired() .HasColumnType("text") .HasColumnName("mime_type"); b.Property("Name") - .IsRequired() .HasColumnType("text") .HasColumnName("name"); @@ -132,7 +130,6 @@ namespace I2R.Storage.Api.Migrations .HasColumnName("last_modified_by"); b.Property("Name") - .IsRequired() .HasColumnType("text") .HasColumnName("name"); @@ -140,9 +137,16 @@ namespace I2R.Storage.Api.Migrations .HasColumnType("uuid") .HasColumnName("owning_user_id"); + b.Property("ParentId") + .HasColumnType("uuid") + .HasColumnName("parent_id"); + b.HasKey("Id") .HasName("pk_folders"); + b.HasIndex("ParentId") + .HasDatabaseName("ix_folders_parent_id"); + b.ToTable("folders", (string)null); }); @@ -240,7 +244,6 @@ namespace I2R.Storage.Api.Migrations .HasColumnName("created_by"); b.Property("Description") - .IsRequired() .HasColumnType("text") .HasColumnName("description"); @@ -261,7 +264,6 @@ namespace I2R.Storage.Api.Migrations .HasColumnName("last_modified_by"); b.Property("Name") - .IsRequired() .HasColumnType("text") .HasColumnName("name"); @@ -291,7 +293,6 @@ namespace I2R.Storage.Api.Migrations .HasColumnName("created_by"); b.Property("FirstName") - .IsRequired() .HasColumnType("text") .HasColumnName("first_name"); @@ -316,7 +317,6 @@ namespace I2R.Storage.Api.Migrations .HasColumnName("last_modified_by"); b.Property("LastName") - .IsRequired() .HasColumnType("text") .HasColumnName("last_name"); @@ -325,7 +325,6 @@ namespace I2R.Storage.Api.Migrations .HasColumnName("owning_user_id"); b.Property("Password") - .IsRequired() .HasColumnType("text") .HasColumnName("password"); @@ -338,7 +337,6 @@ namespace I2R.Storage.Api.Migrations .HasColumnName("role"); b.Property("Username") - .IsRequired() .HasColumnType("text") .HasColumnName("username"); @@ -363,6 +361,16 @@ namespace I2R.Storage.Api.Migrations b.Navigation("Folder"); }); + modelBuilder.Entity("I2R.Storage.Api.Database.Models.Folder", b => + { + b.HasOne("I2R.Storage.Api.Database.Models.Folder", "Parent") + .WithMany() + .HasForeignKey("ParentId") + .HasConstraintName("fk_folders_folders_parent_id"); + + b.Navigation("Parent"); + }); + modelBuilder.Entity("I2R.Storage.Api.Database.Models.Permission", b => { b.HasOne("I2R.Storage.Api.Database.Models.File", null) -- cgit v1.3