From f0cea15a4f85b47bf13b6db392f4ff97449d53c2 Mon Sep 17 00:00:00 2001 From: ivarlovlie Date: Tue, 1 Nov 2022 00:16:38 +0700 Subject: feat: More models and schema changes --- code/api/src/Data/Database/BaseWithOwner.cs | 2 + code/api/src/Data/Database/Customer/Customer.cs | 4 +- code/api/src/Data/Database/MainAppDatabase.cs | 31 + code/api/src/Data/Database/Todo/Todo.cs | 22 +- code/api/src/Data/Database/Todo/TodoCollection.cs | 11 + .../Database/Todo/TodoCollectionAccessControl.cs | 12 + code/api/src/Data/Database/Todo/TodoComment.cs | 7 +- code/api/src/Data/Database/Todo/TodoProject.cs | 8 - .../Data/Database/Todo/TodoProjectAccessControl.cs | 11 - code/api/src/Data/Database/Todo/TodoStatus.cs | 37 - code/api/src/Data/Enums/TodoClosingStatement.cs | 13 + code/api/src/Data/Enums/TodoVisibility.cs | 2 +- ...21031165813_TodoAndOwnerNavigations.Designer.cs | 1863 ++++++++++++++++++++ .../20221031165813_TodoAndOwnerNavigations.cs | 1092 ++++++++++++ .../src/Migrations/AppDbContextModelSnapshot.cs | 891 +++++++++- 15 files changed, 3847 insertions(+), 159 deletions(-) create mode 100644 code/api/src/Data/Database/Todo/TodoCollection.cs create mode 100644 code/api/src/Data/Database/Todo/TodoCollectionAccessControl.cs delete mode 100644 code/api/src/Data/Database/Todo/TodoProject.cs delete mode 100644 code/api/src/Data/Database/Todo/TodoProjectAccessControl.cs delete mode 100644 code/api/src/Data/Database/Todo/TodoStatus.cs create mode 100644 code/api/src/Data/Enums/TodoClosingStatement.cs create mode 100644 code/api/src/Migrations/20221031165813_TodoAndOwnerNavigations.Designer.cs create mode 100644 code/api/src/Migrations/20221031165813_TodoAndOwnerNavigations.cs (limited to 'code') diff --git a/code/api/src/Data/Database/BaseWithOwner.cs b/code/api/src/Data/Database/BaseWithOwner.cs index 84b5bfe..ad9b33a 100644 --- a/code/api/src/Data/Database/BaseWithOwner.cs +++ b/code/api/src/Data/Database/BaseWithOwner.cs @@ -16,6 +16,8 @@ public class BaseWithOwner : Base public Guid? ModifiedBy { get; private set; } public Guid? CreatedBy { get; private set; } public Guid? DeletedBy { get; private set; } + public User OwningUser { get; set; } + public Tenant OwningTenant { get; set; } public void SetDeleted(Guid userId) { DeletedBy = userId; diff --git a/code/api/src/Data/Database/Customer/Customer.cs b/code/api/src/Data/Database/Customer/Customer.cs index f9953da..8e153c6 100644 --- a/code/api/src/Data/Database/Customer/Customer.cs +++ b/code/api/src/Data/Database/Customer/Customer.cs @@ -4,7 +4,7 @@ public class Customer : BaseWithOwner { public Customer() { } public Customer(LoggedInUserModel loggedInUserModel) : base(loggedInUserModel) { } - + public string CustomerNumber { get; set; } public string Name { get; set; } public string Description { get; set; } @@ -20,7 +20,7 @@ public class Customer : BaseWithOwner public string DefaultReference { get; set; } public string Website { get; set; } public string Currency { get; set; } - + public Guid? OwnerId { get; set; } public User Owner { get; set; } public ICollection Groups { get; set; } public ICollection Contacts { get; set; } diff --git a/code/api/src/Data/Database/MainAppDatabase.cs b/code/api/src/Data/Database/MainAppDatabase.cs index b529791..d6409e6 100644 --- a/code/api/src/Data/Database/MainAppDatabase.cs +++ b/code/api/src/Data/Database/MainAppDatabase.cs @@ -20,6 +20,11 @@ public class MainAppDatabase : DbContext, IDataProtectionKeyContext public DbSet CustomersContacts { get; set; } public DbSet CustomerEvents { get; set; } public DbSet CustomerGroups { get; set; } + public DbSet TodoLabels { get; set; } + public DbSet TodoProjectAccessControls { get; set; } + public DbSet TodoProjects { get; set; } + public DbSet TodoComments { get; set; } + public DbSet Todos { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(e => { @@ -79,6 +84,32 @@ public class MainAppDatabase : DbContext, IDataProtectionKeyContext e.HasMany(n => n.Customers); e.ToTable("customer_groups"); }); + modelBuilder.Entity(e => { + e.HasOne(n => n.Collection); + e.HasOne(n => n.AssignedTo); + e.HasOne(n => n.ClosedBy); + e.HasMany(n => n.Labels); + e.HasMany(n => n.Comments); + e.ToTable("todos"); + }); + modelBuilder.Entity(e => { + e.HasOne(n => n.Project); + e.HasMany(n => n.AccessControls); + e.ToTable("todo_collections"); + }); + modelBuilder.Entity(e => { + e.HasOne(n => n.Todo); + e.ToTable("todo_comments"); + }); + modelBuilder.Entity(e => { + e.HasOne(n => n.Todo); + e.ToTable("todo_labels"); + }); + modelBuilder.Entity(e => { + e.HasOne(n => n.User); + e.HasOne(n => n.Collection); + e.ToTable("todo_collection_access_controls"); + }); base.OnModelCreating(modelBuilder); } diff --git a/code/api/src/Data/Database/Todo/Todo.cs b/code/api/src/Data/Database/Todo/Todo.cs index 5fe3c9a..2d7f109 100644 --- a/code/api/src/Data/Database/Todo/Todo.cs +++ b/code/api/src/Data/Database/Todo/Todo.cs @@ -2,12 +2,16 @@ namespace IOL.GreatOffice.Api.Data.Database; public class Todo : BaseWithOwner { - public int PublicId { get; set; } - public TodoStatus Status { get; set; } - public TodoProject Project { get; set; } - public Guid? AssignedUserId { get; set; } - public string Title { get; set; } - public string Description { get; set; } - public ICollection Labels { get; set; } - public ICollection Comments { get; set; } -} + public string PublicId { get; set; } + public Guid? AssignedToId { get; set; } + public Guid? ClosedById { get; set; } + public Guid CollectionId { get; set; } + public DateTime? ClosedAt { get; set; } + public string Title { get; set; } + public string Description { get; set; } + public ICollection Labels { get; set; } + public ICollection Comments { get; set; } + public User AssignedTo { get; set; } + public User ClosedBy { get; set; } + public TodoCollection Collection { get; set; } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/Todo/TodoCollection.cs b/code/api/src/Data/Database/Todo/TodoCollection.cs new file mode 100644 index 0000000..470e5e7 --- /dev/null +++ b/code/api/src/Data/Database/Todo/TodoCollection.cs @@ -0,0 +1,11 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class TodoCollection : BaseWithOwner +{ + public string Name { get; set; } + public string Description { get; set; } + public TodoVisibility Visibility { get; set; } + public Guid? ProjectId { get; set; } + public Project Project { get; set; } + public ICollection AccessControls { get; set; } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/Todo/TodoCollectionAccessControl.cs b/code/api/src/Data/Database/Todo/TodoCollectionAccessControl.cs new file mode 100644 index 0000000..1676c06 --- /dev/null +++ b/code/api/src/Data/Database/Todo/TodoCollectionAccessControl.cs @@ -0,0 +1,12 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class TodoCollectionAccessControl : Base +{ + public TodoCollection Collection { get; set; } + public User User { get; set; } + public Guid? UserId { get; set; } + public bool CanBrowse { get; set; } + public bool CanSubmit { get; set; } + public bool CanComment { get; set; } + public bool CanEdit { get; set; } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/Todo/TodoComment.cs b/code/api/src/Data/Database/Todo/TodoComment.cs index 44dcbed..32ac3a3 100644 --- a/code/api/src/Data/Database/Todo/TodoComment.cs +++ b/code/api/src/Data/Database/Todo/TodoComment.cs @@ -2,6 +2,7 @@ namespace IOL.GreatOffice.Api.Data.Database; public class TodoComment : BaseWithOwner { - public string Value { get; set; } - public Todo Todo { get; set; } -} + public string Value { get; set; } + public Todo Todo { get; set; } + public TodoClosingStatement? ClosingStatement { get; set; } +} \ No newline at end of file diff --git a/code/api/src/Data/Database/Todo/TodoProject.cs b/code/api/src/Data/Database/Todo/TodoProject.cs deleted file mode 100644 index 5e22bbe..0000000 --- a/code/api/src/Data/Database/Todo/TodoProject.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class TodoProject : BaseWithOwner -{ - public string Name { get; set; } - public TodoVisibility Visibility { get; set; } - public Guid? ProjectId { get; set; } -} \ No newline at end of file diff --git a/code/api/src/Data/Database/Todo/TodoProjectAccessControl.cs b/code/api/src/Data/Database/Todo/TodoProjectAccessControl.cs deleted file mode 100644 index 964f831..0000000 --- a/code/api/src/Data/Database/Todo/TodoProjectAccessControl.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class TodoProjectAccessControl -{ - public TodoProject Project { get; set; } - public Guid? UserId { get; set; } - public bool Browse { get; set; } - public bool Submit { get; set; } - public bool Comment { get; set; } - public bool Edit { get; set; } -} diff --git a/code/api/src/Data/Database/Todo/TodoStatus.cs b/code/api/src/Data/Database/Todo/TodoStatus.cs deleted file mode 100644 index 9ace7d0..0000000 --- a/code/api/src/Data/Database/Todo/TodoStatus.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace IOL.GreatOffice.Api.Data.Database; - -public class TodoStatus : BaseWithOwner -{ - public string Name { get; set; } - public string Color { get; set; } - public Todo Todo { get; set; } - - public static List GetDefaultStatusSetForTenant(Guid tenantId) { - return new List() { - new() { - Name = "Reported", - }, - new() { - Name = "Resolved", - }, - new() { - Name = "Fixed", - }, - new() { - Name = "Implemented", - }, - new() { - Name = "Won't fix", - }, - new() { - Name = "By design", - }, - new() { - Name = "Invalid", - }, - new() { - Name = "Duplicate", - } - }; - } -} diff --git a/code/api/src/Data/Enums/TodoClosingStatement.cs b/code/api/src/Data/Enums/TodoClosingStatement.cs new file mode 100644 index 0000000..d838031 --- /dev/null +++ b/code/api/src/Data/Enums/TodoClosingStatement.cs @@ -0,0 +1,13 @@ +namespace IOL.GreatOffice.Api.Data.Enums; + +public enum TodoClosingStatement +{ + REPORTED, + RESOLVED, + FIXED, + IMPLEMENTED, + WONT_FIX, + BY_DESIGN, + INVALID, + DUPLICATE +} \ No newline at end of file diff --git a/code/api/src/Data/Enums/TodoVisibility.cs b/code/api/src/Data/Enums/TodoVisibility.cs index 8581ba9..2c8fa83 100644 --- a/code/api/src/Data/Enums/TodoVisibility.cs +++ b/code/api/src/Data/Enums/TodoVisibility.cs @@ -5,6 +5,6 @@ public enum TodoVisibility { PRIVATE = 0, UNLISTED = 1, - TENANT_WIDE = 2, + INTERNAL = 2, PUBLIC = 3, } \ No newline at end of file diff --git a/code/api/src/Migrations/20221031165813_TodoAndOwnerNavigations.Designer.cs b/code/api/src/Migrations/20221031165813_TodoAndOwnerNavigations.Designer.cs new file mode 100644 index 0000000..1909d36 --- /dev/null +++ b/code/api/src/Migrations/20221031165813_TodoAndOwnerNavigations.Designer.cs @@ -0,0 +1,1863 @@ +// +using System; +using IOL.GreatOffice.Api.Data.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 IOL.GreatOffice.Api.Migrations +{ + [DbContext(typeof(MainAppDatabase))] + [Migration("20221031165813_TodoAndOwnerNavigations")] + partial class TodoAndOwnerNavigations + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.10") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("CustomerCustomerGroup", b => + { + b.Property("CustomersId") + .HasColumnType("uuid") + .HasColumnName("customers_id"); + + b.Property("GroupsId") + .HasColumnType("uuid") + .HasColumnName("groups_id"); + + b.HasKey("CustomersId", "GroupsId") + .HasName("pk_customer_customer_group"); + + b.HasIndex("GroupsId") + .HasDatabaseName("ix_customer_customer_group_groups_id"); + + b.ToTable("customer_customer_group", (string)null); + }); + + modelBuilder.Entity("CustomerProject", b => + { + b.Property("CustomersId") + .HasColumnType("uuid") + .HasColumnName("customers_id"); + + b.Property("ProjectsId") + .HasColumnType("uuid") + .HasColumnName("projects_id"); + + b.HasKey("CustomersId", "ProjectsId") + .HasName("pk_customer_project"); + + b.HasIndex("ProjectsId") + .HasDatabaseName("ix_customer_project_projects_id"); + + b.ToTable("customer_project", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ApiAccessToken", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("AllowCreate") + .HasColumnType("boolean") + .HasColumnName("allow_create"); + + b.Property("AllowDelete") + .HasColumnType("boolean") + .HasColumnName("allow_delete"); + + b.Property("AllowRead") + .HasColumnType("boolean") + .HasColumnName("allow_read"); + + b.Property("AllowUpdate") + .HasColumnType("boolean") + .HasColumnName("allow_update"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("ExpiryDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiry_date"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_api_access_tokens"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_api_access_tokens_user_id"); + + b.ToTable("api_access_tokens", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Customer", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("Address1") + .HasColumnType("text") + .HasColumnName("address1"); + + b.Property("Address2") + .HasColumnType("text") + .HasColumnName("address2"); + + b.Property("Country") + .HasColumnType("text") + .HasColumnName("country"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Currency") + .HasColumnType("text") + .HasColumnName("currency"); + + b.Property("CustomerNumber") + .HasColumnType("text") + .HasColumnName("customer_number"); + + b.Property("DefaultReference") + .HasColumnType("text") + .HasColumnName("default_reference"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("Email") + .HasColumnType("text") + .HasColumnName("email"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ORGNumber") + .HasColumnType("text") + .HasColumnName("org_number"); + + b.Property("OwnerId") + .HasColumnType("uuid") + .HasColumnName("owner_id"); + + b.Property("Phone") + .HasColumnType("text") + .HasColumnName("phone"); + + b.Property("PostalCity") + .HasColumnType("text") + .HasColumnName("postal_city"); + + b.Property("PostalCode") + .HasColumnType("text") + .HasColumnName("postal_code"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("VATNumber") + .HasColumnType("text") + .HasColumnName("vat_number"); + + b.Property("Website") + .HasColumnType("text") + .HasColumnName("website"); + + b.HasKey("Id") + .HasName("pk_customers"); + + b.HasIndex("OwnerId") + .HasDatabaseName("ix_customers_owner_id"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_customers_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_customers_user_id"); + + b.ToTable("customers", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.CustomerContact", 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("CustomerId") + .HasColumnType("uuid") + .HasColumnName("customer_id"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("Email") + .HasColumnType("text") + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnType("text") + .HasColumnName("first_name"); + + b.Property("LastName") + .HasColumnType("text") + .HasColumnName("last_name"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Note") + .HasColumnType("text") + .HasColumnName("note"); + + b.Property("Phone") + .HasColumnType("text") + .HasColumnName("phone"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("WorkTitle") + .HasColumnType("text") + .HasColumnName("work_title"); + + b.HasKey("Id") + .HasName("pk_customer_contacts"); + + b.HasIndex("CustomerId") + .HasDatabaseName("ix_customer_contacts_customer_id"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_customer_contacts_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_customer_contacts_user_id"); + + b.ToTable("customer_contacts", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.CustomerEvent", 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("CustomerId") + .HasColumnType("uuid") + .HasColumnName("customer_id"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Note") + .HasColumnType("text") + .HasColumnName("note"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_customer_events"); + + b.HasIndex("CustomerId") + .HasDatabaseName("ix_customer_events_customer_id"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_customer_events_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_customer_events_user_id"); + + b.ToTable("customer_events", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.CustomerGroup", 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("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_customer_groups"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_customer_groups_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_customer_groups_user_id"); + + b.ToTable("customer_groups", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ForgotPasswordRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_forgot_password_requests"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_forgot_password_requests_user_id"); + + b.ToTable("forgot_password_requests", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Project", 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("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("Start") + .HasColumnType("timestamp with time zone") + .HasColumnName("start"); + + b.Property("Stop") + .HasColumnType("timestamp with time zone") + .HasColumnName("stop"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_projects"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_projects_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_projects_user_id"); + + b.ToTable("projects", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ProjectLabel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("Color") + .HasColumnType("text") + .HasColumnName("color"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("ProjectId") + .HasColumnType("uuid") + .HasColumnName("project_id"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("Value") + .HasColumnType("text") + .HasColumnName("value"); + + b.HasKey("Id") + .HasName("pk_project_labels"); + + b.HasIndex("ProjectId") + .HasDatabaseName("ix_project_labels_project_id"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_project_labels_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_project_labels_user_id"); + + b.ToTable("project_labels", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ProjectMember", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ProjectId") + .HasColumnType("uuid") + .HasColumnName("project_id"); + + b.Property("Role") + .HasColumnType("integer") + .HasColumnName("role"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_project_members"); + + b.HasIndex("ProjectId") + .HasDatabaseName("ix_project_members_project_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_project_members_user_id"); + + b.ToTable("project_members", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Tenant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("ContactEmail") + .HasColumnType("text") + .HasColumnName("contact_email"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("MasterUserId") + .HasColumnType("uuid") + .HasColumnName("master_user_id"); + + b.Property("MasterUserPassword") + .HasColumnType("text") + .HasColumnName("master_user_password"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("OwningTenantId") + .HasColumnType("uuid") + .HasColumnName("owning_tenant_id"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_tenants"); + + b.HasIndex("OwningTenantId") + .HasDatabaseName("ix_tenants_owning_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_tenants_user_id"); + + b.ToTable("tenants", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeCategory", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("Color") + .HasColumnType("text") + .HasColumnName("color"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_time_categories"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_time_categories_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_time_categories_user_id"); + + b.ToTable("time_categories", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeEntry", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("CategoryId") + .HasColumnType("uuid") + .HasColumnName("category_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Start") + .HasColumnType("timestamp with time zone") + .HasColumnName("start"); + + b.Property("Stop") + .HasColumnType("timestamp with time zone") + .HasColumnName("stop"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_time_entries"); + + b.HasIndex("CategoryId") + .HasDatabaseName("ix_time_entries_category_id"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_time_entries_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_time_entries_user_id"); + + b.ToTable("time_entries", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeLabel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("Color") + .HasColumnType("text") + .HasColumnName("color"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("TimeEntryId") + .HasColumnType("uuid") + .HasColumnName("time_entry_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_time_labels"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_time_labels_tenant_id"); + + b.HasIndex("TimeEntryId") + .HasDatabaseName("ix_time_labels_time_entry_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_time_labels_user_id"); + + b.ToTable("time_labels", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Todo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("AssignedToId") + .HasColumnType("uuid") + .HasColumnName("assigned_to_id"); + + b.Property("ClosedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("closed_at"); + + b.Property("ClosedById") + .HasColumnType("uuid") + .HasColumnName("closed_by_id"); + + b.Property("CollectionId") + .HasColumnType("uuid") + .HasColumnName("collection_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("PublicId") + .HasColumnType("text") + .HasColumnName("public_id"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_todos"); + + b.HasIndex("AssignedToId") + .HasDatabaseName("ix_todos_assigned_to_id"); + + b.HasIndex("ClosedById") + .HasDatabaseName("ix_todos_closed_by_id"); + + b.HasIndex("CollectionId") + .HasDatabaseName("ix_todos_collection_id"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_todos_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_todos_user_id"); + + b.ToTable("todos", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoCollection", 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("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ProjectId") + .HasColumnType("uuid") + .HasColumnName("project_id"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("Visibility") + .HasColumnType("integer") + .HasColumnName("visibility"); + + b.HasKey("Id") + .HasName("pk_todo_collections"); + + b.HasIndex("ProjectId") + .HasDatabaseName("ix_todo_collections_project_id"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_todo_collections_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_todo_collections_user_id"); + + b.ToTable("todo_collections", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoCollectionAccessControl", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("CanBrowse") + .HasColumnType("boolean") + .HasColumnName("can_browse"); + + b.Property("CanComment") + .HasColumnType("boolean") + .HasColumnName("can_comment"); + + b.Property("CanEdit") + .HasColumnType("boolean") + .HasColumnName("can_edit"); + + b.Property("CanSubmit") + .HasColumnType("boolean") + .HasColumnName("can_submit"); + + b.Property("CollectionId") + .HasColumnType("uuid") + .HasColumnName("collection_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_todo_collection_access_controls"); + + b.HasIndex("CollectionId") + .HasDatabaseName("ix_todo_collection_access_controls_collection_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_todo_collection_access_controls_user_id"); + + b.ToTable("todo_collection_access_controls", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("ClosingStatement") + .HasColumnType("integer") + .HasColumnName("closing_statement"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("TodoId") + .HasColumnType("uuid") + .HasColumnName("todo_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("Value") + .HasColumnType("text") + .HasColumnName("value"); + + b.HasKey("Id") + .HasName("pk_todo_comments"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_todo_comments_tenant_id"); + + b.HasIndex("TodoId") + .HasDatabaseName("ix_todo_comments_todo_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_todo_comments_user_id"); + + b.ToTable("todo_comments", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoLabel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("Color") + .HasColumnType("text") + .HasColumnName("color"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("TodoId") + .HasColumnType("uuid") + .HasColumnName("todo_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_todo_labels"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_todo_labels_tenant_id"); + + b.HasIndex("TodoId") + .HasDatabaseName("ix_todo_labels_todo_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_todo_labels_user_id"); + + b.ToTable("todo_labels", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.User", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("Email") + .HasColumnType("text") + .HasColumnName("email"); + + b.Property("FirstName") + .HasColumnType("text") + .HasColumnName("first_name"); + + b.Property("LastName") + .HasColumnType("text") + .HasColumnName("last_name"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("Password") + .HasColumnType("text") + .HasColumnName("password"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("Username") + .HasColumnType("text") + .HasColumnName("username"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_users_tenant_id"); + + b.ToTable("users", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.DataProtection.EntityFrameworkCore.DataProtectionKey", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer") + .HasColumnName("id"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); + + b.Property("FriendlyName") + .HasColumnType("text") + .HasColumnName("friendly_name"); + + b.Property("Xml") + .HasColumnType("text") + .HasColumnName("xml"); + + b.HasKey("Id") + .HasName("pk_data_protection_keys"); + + b.ToTable("data_protection_keys", (string)null); + }); + + modelBuilder.Entity("CustomerCustomerGroup", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Customer", null) + .WithMany() + .HasForeignKey("CustomersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_customer_customer_group_customers_customers_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.CustomerGroup", null) + .WithMany() + .HasForeignKey("GroupsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_customer_customer_group_customer_groups_groups_id"); + }); + + modelBuilder.Entity("CustomerProject", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Customer", null) + .WithMany() + .HasForeignKey("CustomersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_customer_project_customers_customers_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Project", null) + .WithMany() + .HasForeignKey("ProjectsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_customer_project_projects_projects_id"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ApiAccessToken", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "User") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_api_access_tokens_users_user_id"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Customer", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .HasConstraintName("fk_customers_users_owner_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_customers_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_customers_users_user_id"); + + b.Navigation("Owner"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.CustomerContact", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Customer", "Customer") + .WithMany("Contacts") + .HasForeignKey("CustomerId") + .HasConstraintName("fk_customer_contacts_customers_customer_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_customer_contacts_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_customer_contacts_users_user_id"); + + b.Navigation("Customer"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.CustomerEvent", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Customer", "Customer") + .WithMany("Events") + .HasForeignKey("CustomerId") + .HasConstraintName("fk_customer_events_customers_customer_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_customer_events_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_customer_events_users_user_id"); + + b.Navigation("Customer"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.CustomerGroup", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_customer_groups_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_customer_groups_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ForgotPasswordRequest", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_forgot_password_requests_users_user_id"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Project", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_projects_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_projects_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ProjectLabel", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Project", "Project") + .WithMany("Labels") + .HasForeignKey("ProjectId") + .HasConstraintName("fk_project_labels_projects_project_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_project_labels_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_project_labels_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ProjectMember", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Project", "Project") + .WithMany("Members") + .HasForeignKey("ProjectId") + .HasConstraintName("fk_project_members_projects_project_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "User") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_project_members_users_user_id"); + + b.Navigation("Project"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Tenant", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("OwningTenantId") + .HasConstraintName("fk_tenants_tenants_owning_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany("Tenants") + .HasForeignKey("UserId") + .HasConstraintName("fk_tenants_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeCategory", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_time_categories_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_time_categories_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeEntry", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.TimeCategory", "Category") + .WithMany() + .HasForeignKey("CategoryId") + .HasConstraintName("fk_time_entries_time_categories_category_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_time_entries_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_time_entries_users_user_id"); + + b.Navigation("Category"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeLabel", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_time_labels_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.TimeEntry", null) + .WithMany("Labels") + .HasForeignKey("TimeEntryId") + .HasConstraintName("fk_time_labels_time_entries_time_entry_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_time_labels_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Todo", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "AssignedTo") + .WithMany() + .HasForeignKey("AssignedToId") + .HasConstraintName("fk_todos_users_assigned_to_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "ClosedBy") + .WithMany() + .HasForeignKey("ClosedById") + .HasConstraintName("fk_todos_users_closed_by_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.TodoCollection", "Collection") + .WithMany() + .HasForeignKey("CollectionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_todos_todo_projects_collection_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_todos_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_todos_users_user_id"); + + b.Navigation("AssignedTo"); + + b.Navigation("ClosedBy"); + + b.Navigation("Collection"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoCollection", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .HasConstraintName("fk_todo_collections_projects_project_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_todo_collections_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_todo_collections_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoCollectionAccessControl", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.TodoCollection", "Collection") + .WithMany("AccessControls") + .HasForeignKey("CollectionId") + .HasConstraintName("fk_todo_collection_access_controls_todo_collections_collection"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "User") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_todo_collection_access_controls_users_user_id"); + + b.Navigation("Collection"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoComment", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_todo_comments_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Todo", "Todo") + .WithMany("Comments") + .HasForeignKey("TodoId") + .HasConstraintName("fk_todo_comments_todos_todo_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_todo_comments_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + + b.Navigation("Todo"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoLabel", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_todo_labels_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Todo", "Todo") + .WithMany("Labels") + .HasForeignKey("TodoId") + .HasConstraintName("fk_todo_labels_todos_todo_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_todo_labels_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + + b.Navigation("Todo"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.User", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", null) + .WithMany("Users") + .HasForeignKey("TenantId") + .HasConstraintName("fk_users_tenants_tenant_id"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Customer", b => + { + b.Navigation("Contacts"); + + b.Navigation("Events"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Project", b => + { + b.Navigation("Labels"); + + b.Navigation("Members"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Tenant", b => + { + b.Navigation("Users"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeEntry", b => + { + b.Navigation("Labels"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Todo", b => + { + b.Navigation("Comments"); + + b.Navigation("Labels"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoCollection", b => + { + b.Navigation("AccessControls"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.User", b => + { + b.Navigation("Tenants"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/code/api/src/Migrations/20221031165813_TodoAndOwnerNavigations.cs b/code/api/src/Migrations/20221031165813_TodoAndOwnerNavigations.cs new file mode 100644 index 0000000..334913e --- /dev/null +++ b/code/api/src/Migrations/20221031165813_TodoAndOwnerNavigations.cs @@ -0,0 +1,1092 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace IOL.GreatOffice.Api.Migrations +{ + public partial class TodoAndOwnerNavigations : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "tenant_user"); + + migrationBuilder.RenameColumn( + name: "modified_by_id", + table: "time_labels", + newName: "modified_by"); + + migrationBuilder.RenameColumn( + name: "deleted_by_id", + table: "time_labels", + newName: "deleted_by"); + + migrationBuilder.RenameColumn( + name: "created_by_id", + table: "time_labels", + newName: "created_by"); + + migrationBuilder.RenameColumn( + name: "modified_by_id", + table: "time_entries", + newName: "modified_by"); + + migrationBuilder.RenameColumn( + name: "deleted_by_id", + table: "time_entries", + newName: "deleted_by"); + + migrationBuilder.RenameColumn( + name: "created_by_id", + table: "time_entries", + newName: "created_by"); + + migrationBuilder.RenameColumn( + name: "modified_by_id", + table: "time_categories", + newName: "modified_by"); + + migrationBuilder.RenameColumn( + name: "deleted_by_id", + table: "time_categories", + newName: "deleted_by"); + + migrationBuilder.RenameColumn( + name: "created_by_id", + table: "time_categories", + newName: "created_by"); + + migrationBuilder.RenameColumn( + name: "modified_by_id", + table: "tenants", + newName: "owning_tenant_id"); + + migrationBuilder.RenameColumn( + name: "deleted_by_id", + table: "tenants", + newName: "modified_by"); + + migrationBuilder.RenameColumn( + name: "created_by_id", + table: "tenants", + newName: "deleted_by"); + + migrationBuilder.RenameColumn( + name: "modified_by_id", + table: "projects", + newName: "modified_by"); + + migrationBuilder.RenameColumn( + name: "deleted_by_id", + table: "projects", + newName: "deleted_by"); + + migrationBuilder.RenameColumn( + name: "created_by_id", + table: "projects", + newName: "created_by"); + + migrationBuilder.RenameColumn( + name: "modified_by_id", + table: "project_labels", + newName: "modified_by"); + + migrationBuilder.RenameColumn( + name: "deleted_by_id", + table: "project_labels", + newName: "deleted_by"); + + migrationBuilder.RenameColumn( + name: "created_by_id", + table: "project_labels", + newName: "created_by"); + + migrationBuilder.RenameColumn( + name: "modified_by_id", + table: "customers", + newName: "owner_id"); + + migrationBuilder.RenameColumn( + name: "deleted_by_id", + table: "customers", + newName: "modified_by"); + + migrationBuilder.RenameColumn( + name: "created_by_id", + table: "customers", + newName: "deleted_by"); + + migrationBuilder.RenameColumn( + name: "modified_by_id", + table: "customer_groups", + newName: "modified_by"); + + migrationBuilder.RenameColumn( + name: "deleted_by_id", + table: "customer_groups", + newName: "deleted_by"); + + migrationBuilder.RenameColumn( + name: "created_by_id", + table: "customer_groups", + newName: "created_by"); + + migrationBuilder.RenameColumn( + name: "modified_by_id", + table: "customer_events", + newName: "modified_by"); + + migrationBuilder.RenameColumn( + name: "deleted_by_id", + table: "customer_events", + newName: "deleted_by"); + + migrationBuilder.RenameColumn( + name: "created_by_id", + table: "customer_events", + newName: "created_by"); + + migrationBuilder.RenameColumn( + name: "modified_by_id", + table: "customer_contacts", + newName: "modified_by"); + + migrationBuilder.RenameColumn( + name: "deleted_by_id", + table: "customer_contacts", + newName: "deleted_by"); + + migrationBuilder.RenameColumn( + name: "created_by_id", + table: "customer_contacts", + newName: "created_by"); + + migrationBuilder.AddColumn( + name: "tenant_id", + table: "users", + type: "uuid", + nullable: true); + + migrationBuilder.AddColumn( + name: "created_by", + table: "tenants", + type: "uuid", + nullable: true); + + migrationBuilder.AddColumn( + name: "created_by", + table: "customers", + type: "uuid", + nullable: true); + + migrationBuilder.CreateTable( + name: "todo_collections", + columns: table => new + { + id = table.Column(type: "uuid", nullable: false), + name = table.Column(type: "text", nullable: true), + description = table.Column(type: "text", nullable: true), + visibility = table.Column(type: "integer", nullable: false), + project_id = table.Column(type: "uuid", nullable: true), + created_at = table.Column(type: "timestamp with time zone", nullable: false), + modified_at = table.Column(type: "timestamp with time zone", nullable: true), + deleted_at = table.Column(type: "timestamp with time zone", nullable: true), + deleted = table.Column(type: "boolean", nullable: false), + user_id = table.Column(type: "uuid", nullable: true), + tenant_id = table.Column(type: "uuid", nullable: true), + modified_by = table.Column(type: "uuid", nullable: true), + created_by = table.Column(type: "uuid", nullable: true), + deleted_by = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_todo_collections", x => x.id); + table.ForeignKey( + name: "fk_todo_collections_projects_project_id", + column: x => x.project_id, + principalTable: "projects", + principalColumn: "id"); + table.ForeignKey( + name: "fk_todo_collections_tenants_tenant_id", + column: x => x.tenant_id, + principalTable: "tenants", + principalColumn: "id"); + table.ForeignKey( + name: "fk_todo_collections_users_user_id", + column: x => x.user_id, + principalTable: "users", + principalColumn: "id"); + }); + + migrationBuilder.CreateTable( + name: "todo_collection_access_controls", + columns: table => new + { + id = table.Column(type: "uuid", nullable: false), + collection_id = table.Column(type: "uuid", nullable: true), + user_id = table.Column(type: "uuid", nullable: true), + can_browse = table.Column(type: "boolean", nullable: false), + can_submit = table.Column(type: "boolean", nullable: false), + can_comment = table.Column(type: "boolean", nullable: false), + can_edit = table.Column(type: "boolean", nullable: false), + created_at = table.Column(type: "timestamp with time zone", nullable: false), + modified_at = table.Column(type: "timestamp with time zone", nullable: true), + deleted_at = table.Column(type: "timestamp with time zone", nullable: true), + deleted = table.Column(type: "boolean", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("pk_todo_collection_access_controls", x => x.id); + table.ForeignKey( + name: "fk_todo_collection_access_controls_todo_collections_collection", + column: x => x.collection_id, + principalTable: "todo_collections", + principalColumn: "id"); + table.ForeignKey( + name: "fk_todo_collection_access_controls_users_user_id", + column: x => x.user_id, + principalTable: "users", + principalColumn: "id"); + }); + + migrationBuilder.CreateTable( + name: "todos", + columns: table => new + { + id = table.Column(type: "uuid", nullable: false), + public_id = table.Column(type: "text", nullable: true), + assigned_to_id = table.Column(type: "uuid", nullable: true), + closed_by_id = table.Column(type: "uuid", nullable: true), + collection_id = table.Column(type: "uuid", nullable: false), + closed_at = table.Column(type: "timestamp with time zone", nullable: true), + title = table.Column(type: "text", nullable: true), + description = table.Column(type: "text", nullable: true), + created_at = table.Column(type: "timestamp with time zone", nullable: false), + modified_at = table.Column(type: "timestamp with time zone", nullable: true), + deleted_at = table.Column(type: "timestamp with time zone", nullable: true), + deleted = table.Column(type: "boolean", nullable: false), + user_id = table.Column(type: "uuid", nullable: true), + tenant_id = table.Column(type: "uuid", nullable: true), + modified_by = table.Column(type: "uuid", nullable: true), + created_by = table.Column(type: "uuid", nullable: true), + deleted_by = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_todos", x => x.id); + table.ForeignKey( + name: "fk_todos_tenants_tenant_id", + column: x => x.tenant_id, + principalTable: "tenants", + principalColumn: "id"); + table.ForeignKey( + name: "fk_todos_todo_projects_collection_id", + column: x => x.collection_id, + principalTable: "todo_collections", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "fk_todos_users_assigned_to_id", + column: x => x.assigned_to_id, + principalTable: "users", + principalColumn: "id"); + table.ForeignKey( + name: "fk_todos_users_closed_by_id", + column: x => x.closed_by_id, + principalTable: "users", + principalColumn: "id"); + table.ForeignKey( + name: "fk_todos_users_user_id", + column: x => x.user_id, + principalTable: "users", + principalColumn: "id"); + }); + + migrationBuilder.CreateTable( + name: "todo_comments", + columns: table => new + { + id = table.Column(type: "uuid", nullable: false), + value = table.Column(type: "text", nullable: true), + todo_id = table.Column(type: "uuid", nullable: true), + closing_statement = table.Column(type: "integer", nullable: true), + created_at = table.Column(type: "timestamp with time zone", nullable: false), + modified_at = table.Column(type: "timestamp with time zone", nullable: true), + deleted_at = table.Column(type: "timestamp with time zone", nullable: true), + deleted = table.Column(type: "boolean", nullable: false), + user_id = table.Column(type: "uuid", nullable: true), + tenant_id = table.Column(type: "uuid", nullable: true), + modified_by = table.Column(type: "uuid", nullable: true), + created_by = table.Column(type: "uuid", nullable: true), + deleted_by = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_todo_comments", x => x.id); + table.ForeignKey( + name: "fk_todo_comments_tenants_tenant_id", + column: x => x.tenant_id, + principalTable: "tenants", + principalColumn: "id"); + table.ForeignKey( + name: "fk_todo_comments_todos_todo_id", + column: x => x.todo_id, + principalTable: "todos", + principalColumn: "id"); + table.ForeignKey( + name: "fk_todo_comments_users_user_id", + column: x => x.user_id, + principalTable: "users", + principalColumn: "id"); + }); + + migrationBuilder.CreateTable( + name: "todo_labels", + columns: table => new + { + id = table.Column(type: "uuid", nullable: false), + name = table.Column(type: "text", nullable: true), + color = table.Column(type: "text", nullable: true), + todo_id = table.Column(type: "uuid", nullable: true), + created_at = table.Column(type: "timestamp with time zone", nullable: false), + modified_at = table.Column(type: "timestamp with time zone", nullable: true), + deleted_at = table.Column(type: "timestamp with time zone", nullable: true), + deleted = table.Column(type: "boolean", nullable: false), + user_id = table.Column(type: "uuid", nullable: true), + tenant_id = table.Column(type: "uuid", nullable: true), + modified_by = table.Column(type: "uuid", nullable: true), + created_by = table.Column(type: "uuid", nullable: true), + deleted_by = table.Column(type: "uuid", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("pk_todo_labels", x => x.id); + table.ForeignKey( + name: "fk_todo_labels_tenants_tenant_id", + column: x => x.tenant_id, + principalTable: "tenants", + principalColumn: "id"); + table.ForeignKey( + name: "fk_todo_labels_todos_todo_id", + column: x => x.todo_id, + principalTable: "todos", + principalColumn: "id"); + table.ForeignKey( + name: "fk_todo_labels_users_user_id", + column: x => x.user_id, + principalTable: "users", + principalColumn: "id"); + }); + + migrationBuilder.CreateIndex( + name: "ix_users_tenant_id", + table: "users", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_time_labels_tenant_id", + table: "time_labels", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_time_labels_user_id", + table: "time_labels", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_time_entries_tenant_id", + table: "time_entries", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_time_entries_user_id", + table: "time_entries", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_time_categories_tenant_id", + table: "time_categories", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_time_categories_user_id", + table: "time_categories", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_tenants_owning_tenant_id", + table: "tenants", + column: "owning_tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_tenants_user_id", + table: "tenants", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_projects_tenant_id", + table: "projects", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_projects_user_id", + table: "projects", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_project_labels_tenant_id", + table: "project_labels", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_project_labels_user_id", + table: "project_labels", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_customers_owner_id", + table: "customers", + column: "owner_id"); + + migrationBuilder.CreateIndex( + name: "ix_customers_tenant_id", + table: "customers", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_customer_groups_tenant_id", + table: "customer_groups", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_customer_groups_user_id", + table: "customer_groups", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_customer_events_tenant_id", + table: "customer_events", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_customer_events_user_id", + table: "customer_events", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_customer_contacts_tenant_id", + table: "customer_contacts", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_customer_contacts_user_id", + table: "customer_contacts", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_todo_collection_access_controls_collection_id", + table: "todo_collection_access_controls", + column: "collection_id"); + + migrationBuilder.CreateIndex( + name: "ix_todo_collection_access_controls_user_id", + table: "todo_collection_access_controls", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_todo_collections_project_id", + table: "todo_collections", + column: "project_id"); + + migrationBuilder.CreateIndex( + name: "ix_todo_collections_tenant_id", + table: "todo_collections", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_todo_collections_user_id", + table: "todo_collections", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_todo_comments_tenant_id", + table: "todo_comments", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_todo_comments_todo_id", + table: "todo_comments", + column: "todo_id"); + + migrationBuilder.CreateIndex( + name: "ix_todo_comments_user_id", + table: "todo_comments", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_todo_labels_tenant_id", + table: "todo_labels", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_todo_labels_todo_id", + table: "todo_labels", + column: "todo_id"); + + migrationBuilder.CreateIndex( + name: "ix_todo_labels_user_id", + table: "todo_labels", + column: "user_id"); + + migrationBuilder.CreateIndex( + name: "ix_todos_assigned_to_id", + table: "todos", + column: "assigned_to_id"); + + migrationBuilder.CreateIndex( + name: "ix_todos_closed_by_id", + table: "todos", + column: "closed_by_id"); + + migrationBuilder.CreateIndex( + name: "ix_todos_collection_id", + table: "todos", + column: "collection_id"); + + migrationBuilder.CreateIndex( + name: "ix_todos_tenant_id", + table: "todos", + column: "tenant_id"); + + migrationBuilder.CreateIndex( + name: "ix_todos_user_id", + table: "todos", + column: "user_id"); + + migrationBuilder.AddForeignKey( + name: "fk_customer_contacts_tenants_tenant_id", + table: "customer_contacts", + column: "tenant_id", + principalTable: "tenants", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_customer_contacts_users_user_id", + table: "customer_contacts", + column: "user_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_customer_events_tenants_tenant_id", + table: "customer_events", + column: "tenant_id", + principalTable: "tenants", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_customer_events_users_user_id", + table: "customer_events", + column: "user_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_customer_groups_tenants_tenant_id", + table: "customer_groups", + column: "tenant_id", + principalTable: "tenants", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_customer_groups_users_user_id", + table: "customer_groups", + column: "user_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_customers_tenants_tenant_id", + table: "customers", + column: "tenant_id", + principalTable: "tenants", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_customers_users_owner_id", + table: "customers", + column: "owner_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_project_labels_tenants_tenant_id", + table: "project_labels", + column: "tenant_id", + principalTable: "tenants", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_project_labels_users_user_id", + table: "project_labels", + column: "user_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_projects_tenants_tenant_id", + table: "projects", + column: "tenant_id", + principalTable: "tenants", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_projects_users_user_id", + table: "projects", + column: "user_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_tenants_tenants_owning_tenant_id", + table: "tenants", + column: "owning_tenant_id", + principalTable: "tenants", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_tenants_users_user_id", + table: "tenants", + column: "user_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_categories_tenants_tenant_id", + table: "time_categories", + column: "tenant_id", + principalTable: "tenants", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_categories_users_user_id", + table: "time_categories", + column: "user_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_entries_tenants_tenant_id", + table: "time_entries", + column: "tenant_id", + principalTable: "tenants", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_entries_users_user_id", + table: "time_entries", + column: "user_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_labels_tenants_tenant_id", + table: "time_labels", + column: "tenant_id", + principalTable: "tenants", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_labels_users_user_id", + table: "time_labels", + column: "user_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_users_tenants_tenant_id", + table: "users", + column: "tenant_id", + principalTable: "tenants", + principalColumn: "id"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "fk_customer_contacts_tenants_tenant_id", + table: "customer_contacts"); + + migrationBuilder.DropForeignKey( + name: "fk_customer_contacts_users_user_id", + table: "customer_contacts"); + + migrationBuilder.DropForeignKey( + name: "fk_customer_events_tenants_tenant_id", + table: "customer_events"); + + migrationBuilder.DropForeignKey( + name: "fk_customer_events_users_user_id", + table: "customer_events"); + + migrationBuilder.DropForeignKey( + name: "fk_customer_groups_tenants_tenant_id", + table: "customer_groups"); + + migrationBuilder.DropForeignKey( + name: "fk_customer_groups_users_user_id", + table: "customer_groups"); + + migrationBuilder.DropForeignKey( + name: "fk_customers_tenants_tenant_id", + table: "customers"); + + migrationBuilder.DropForeignKey( + name: "fk_customers_users_owner_id", + table: "customers"); + + migrationBuilder.DropForeignKey( + name: "fk_project_labels_tenants_tenant_id", + table: "project_labels"); + + migrationBuilder.DropForeignKey( + name: "fk_project_labels_users_user_id", + table: "project_labels"); + + migrationBuilder.DropForeignKey( + name: "fk_projects_tenants_tenant_id", + table: "projects"); + + migrationBuilder.DropForeignKey( + name: "fk_projects_users_user_id", + table: "projects"); + + migrationBuilder.DropForeignKey( + name: "fk_tenants_tenants_owning_tenant_id", + table: "tenants"); + + migrationBuilder.DropForeignKey( + name: "fk_tenants_users_user_id", + table: "tenants"); + + migrationBuilder.DropForeignKey( + name: "fk_time_categories_tenants_tenant_id", + table: "time_categories"); + + migrationBuilder.DropForeignKey( + name: "fk_time_categories_users_user_id", + table: "time_categories"); + + migrationBuilder.DropForeignKey( + name: "fk_time_entries_tenants_tenant_id", + table: "time_entries"); + + migrationBuilder.DropForeignKey( + name: "fk_time_entries_users_user_id", + table: "time_entries"); + + migrationBuilder.DropForeignKey( + name: "fk_time_labels_tenants_tenant_id", + table: "time_labels"); + + migrationBuilder.DropForeignKey( + name: "fk_time_labels_users_user_id", + table: "time_labels"); + + migrationBuilder.DropForeignKey( + name: "fk_users_tenants_tenant_id", + table: "users"); + + migrationBuilder.DropTable( + name: "todo_collection_access_controls"); + + migrationBuilder.DropTable( + name: "todo_comments"); + + migrationBuilder.DropTable( + name: "todo_labels"); + + migrationBuilder.DropTable( + name: "todos"); + + migrationBuilder.DropTable( + name: "todo_collections"); + + migrationBuilder.DropIndex( + name: "ix_users_tenant_id", + table: "users"); + + migrationBuilder.DropIndex( + name: "ix_time_labels_tenant_id", + table: "time_labels"); + + migrationBuilder.DropIndex( + name: "ix_time_labels_user_id", + table: "time_labels"); + + migrationBuilder.DropIndex( + name: "ix_time_entries_tenant_id", + table: "time_entries"); + + migrationBuilder.DropIndex( + name: "ix_time_entries_user_id", + table: "time_entries"); + + migrationBuilder.DropIndex( + name: "ix_time_categories_tenant_id", + table: "time_categories"); + + migrationBuilder.DropIndex( + name: "ix_time_categories_user_id", + table: "time_categories"); + + migrationBuilder.DropIndex( + name: "ix_tenants_owning_tenant_id", + table: "tenants"); + + migrationBuilder.DropIndex( + name: "ix_tenants_user_id", + table: "tenants"); + + migrationBuilder.DropIndex( + name: "ix_projects_tenant_id", + table: "projects"); + + migrationBuilder.DropIndex( + name: "ix_projects_user_id", + table: "projects"); + + migrationBuilder.DropIndex( + name: "ix_project_labels_tenant_id", + table: "project_labels"); + + migrationBuilder.DropIndex( + name: "ix_project_labels_user_id", + table: "project_labels"); + + migrationBuilder.DropIndex( + name: "ix_customers_owner_id", + table: "customers"); + + migrationBuilder.DropIndex( + name: "ix_customers_tenant_id", + table: "customers"); + + migrationBuilder.DropIndex( + name: "ix_customer_groups_tenant_id", + table: "customer_groups"); + + migrationBuilder.DropIndex( + name: "ix_customer_groups_user_id", + table: "customer_groups"); + + migrationBuilder.DropIndex( + name: "ix_customer_events_tenant_id", + table: "customer_events"); + + migrationBuilder.DropIndex( + name: "ix_customer_events_user_id", + table: "customer_events"); + + migrationBuilder.DropIndex( + name: "ix_customer_contacts_tenant_id", + table: "customer_contacts"); + + migrationBuilder.DropIndex( + name: "ix_customer_contacts_user_id", + table: "customer_contacts"); + + migrationBuilder.DropColumn( + name: "tenant_id", + table: "users"); + + migrationBuilder.DropColumn( + name: "created_by", + table: "tenants"); + + migrationBuilder.DropColumn( + name: "created_by", + table: "customers"); + + migrationBuilder.RenameColumn( + name: "modified_by", + table: "time_labels", + newName: "modified_by_id"); + + migrationBuilder.RenameColumn( + name: "deleted_by", + table: "time_labels", + newName: "deleted_by_id"); + + migrationBuilder.RenameColumn( + name: "created_by", + table: "time_labels", + newName: "created_by_id"); + + migrationBuilder.RenameColumn( + name: "modified_by", + table: "time_entries", + newName: "modified_by_id"); + + migrationBuilder.RenameColumn( + name: "deleted_by", + table: "time_entries", + newName: "deleted_by_id"); + + migrationBuilder.RenameColumn( + name: "created_by", + table: "time_entries", + newName: "created_by_id"); + + migrationBuilder.RenameColumn( + name: "modified_by", + table: "time_categories", + newName: "modified_by_id"); + + migrationBuilder.RenameColumn( + name: "deleted_by", + table: "time_categories", + newName: "deleted_by_id"); + + migrationBuilder.RenameColumn( + name: "created_by", + table: "time_categories", + newName: "created_by_id"); + + migrationBuilder.RenameColumn( + name: "owning_tenant_id", + table: "tenants", + newName: "modified_by_id"); + + migrationBuilder.RenameColumn( + name: "modified_by", + table: "tenants", + newName: "deleted_by_id"); + + migrationBuilder.RenameColumn( + name: "deleted_by", + table: "tenants", + newName: "created_by_id"); + + migrationBuilder.RenameColumn( + name: "modified_by", + table: "projects", + newName: "modified_by_id"); + + migrationBuilder.RenameColumn( + name: "deleted_by", + table: "projects", + newName: "deleted_by_id"); + + migrationBuilder.RenameColumn( + name: "created_by", + table: "projects", + newName: "created_by_id"); + + migrationBuilder.RenameColumn( + name: "modified_by", + table: "project_labels", + newName: "modified_by_id"); + + migrationBuilder.RenameColumn( + name: "deleted_by", + table: "project_labels", + newName: "deleted_by_id"); + + migrationBuilder.RenameColumn( + name: "created_by", + table: "project_labels", + newName: "created_by_id"); + + migrationBuilder.RenameColumn( + name: "owner_id", + table: "customers", + newName: "modified_by_id"); + + migrationBuilder.RenameColumn( + name: "modified_by", + table: "customers", + newName: "deleted_by_id"); + + migrationBuilder.RenameColumn( + name: "deleted_by", + table: "customers", + newName: "created_by_id"); + + migrationBuilder.RenameColumn( + name: "modified_by", + table: "customer_groups", + newName: "modified_by_id"); + + migrationBuilder.RenameColumn( + name: "deleted_by", + table: "customer_groups", + newName: "deleted_by_id"); + + migrationBuilder.RenameColumn( + name: "created_by", + table: "customer_groups", + newName: "created_by_id"); + + migrationBuilder.RenameColumn( + name: "modified_by", + table: "customer_events", + newName: "modified_by_id"); + + migrationBuilder.RenameColumn( + name: "deleted_by", + table: "customer_events", + newName: "deleted_by_id"); + + migrationBuilder.RenameColumn( + name: "created_by", + table: "customer_events", + newName: "created_by_id"); + + migrationBuilder.RenameColumn( + name: "modified_by", + table: "customer_contacts", + newName: "modified_by_id"); + + migrationBuilder.RenameColumn( + name: "deleted_by", + table: "customer_contacts", + newName: "deleted_by_id"); + + migrationBuilder.RenameColumn( + name: "created_by", + table: "customer_contacts", + newName: "created_by_id"); + + migrationBuilder.CreateTable( + name: "tenant_user", + columns: table => new + { + tenants_id = table.Column(type: "uuid", nullable: false), + users_id = table.Column(type: "uuid", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("pk_tenant_user", x => new { x.tenants_id, x.users_id }); + table.ForeignKey( + name: "fk_tenant_user_tenants_tenants_id", + column: x => x.tenants_id, + principalTable: "tenants", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "fk_tenant_user_users_users_id", + column: x => x.users_id, + principalTable: "users", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "ix_tenant_user_users_id", + table: "tenant_user", + column: "users_id"); + } + } +} diff --git a/code/api/src/Migrations/AppDbContextModelSnapshot.cs b/code/api/src/Migrations/AppDbContextModelSnapshot.cs index 7a534ad..f2031c1 100644 --- a/code/api/src/Migrations/AppDbContextModelSnapshot.cs +++ b/code/api/src/Migrations/AppDbContextModelSnapshot.cs @@ -139,9 +139,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); - b.Property("CreatedById") + b.Property("CreatedBy") .HasColumnType("uuid") - .HasColumnName("created_by_id"); + .HasColumnName("created_by"); b.Property("Currency") .HasColumnType("text") @@ -163,9 +163,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("deleted_at"); - b.Property("DeletedById") + b.Property("DeletedBy") .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); + .HasColumnName("deleted_by"); b.Property("Description") .HasColumnType("text") @@ -179,9 +179,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("modified_at"); - b.Property("ModifiedById") + b.Property("ModifiedBy") .HasColumnType("uuid") - .HasColumnName("modified_by_id"); + .HasColumnName("modified_by"); b.Property("Name") .HasColumnType("text") @@ -191,6 +191,10 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("text") .HasColumnName("org_number"); + b.Property("OwnerId") + .HasColumnType("uuid") + .HasColumnName("owner_id"); + b.Property("Phone") .HasColumnType("text") .HasColumnName("phone"); @@ -222,6 +226,12 @@ namespace IOL.GreatOffice.Api.Migrations b.HasKey("Id") .HasName("pk_customers"); + b.HasIndex("OwnerId") + .HasDatabaseName("ix_customers_owner_id"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_customers_tenant_id"); + b.HasIndex("UserId") .HasDatabaseName("ix_customers_user_id"); @@ -239,9 +249,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); - b.Property("CreatedById") + b.Property("CreatedBy") .HasColumnType("uuid") - .HasColumnName("created_by_id"); + .HasColumnName("created_by"); b.Property("CustomerId") .HasColumnType("uuid") @@ -255,9 +265,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("deleted_at"); - b.Property("DeletedById") + b.Property("DeletedBy") .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); + .HasColumnName("deleted_by"); b.Property("Email") .HasColumnType("text") @@ -275,9 +285,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("modified_at"); - b.Property("ModifiedById") + b.Property("ModifiedBy") .HasColumnType("uuid") - .HasColumnName("modified_by_id"); + .HasColumnName("modified_by"); b.Property("Note") .HasColumnType("text") @@ -305,6 +315,12 @@ namespace IOL.GreatOffice.Api.Migrations b.HasIndex("CustomerId") .HasDatabaseName("ix_customer_contacts_customer_id"); + b.HasIndex("TenantId") + .HasDatabaseName("ix_customer_contacts_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_customer_contacts_user_id"); + b.ToTable("customer_contacts", (string)null); }); @@ -319,9 +335,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); - b.Property("CreatedById") + b.Property("CreatedBy") .HasColumnType("uuid") - .HasColumnName("created_by_id"); + .HasColumnName("created_by"); b.Property("CustomerId") .HasColumnType("uuid") @@ -335,17 +351,17 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("deleted_at"); - b.Property("DeletedById") + b.Property("DeletedBy") .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); + .HasColumnName("deleted_by"); b.Property("ModifiedAt") .HasColumnType("timestamp with time zone") .HasColumnName("modified_at"); - b.Property("ModifiedById") + b.Property("ModifiedBy") .HasColumnType("uuid") - .HasColumnName("modified_by_id"); + .HasColumnName("modified_by"); b.Property("Note") .HasColumnType("text") @@ -369,6 +385,12 @@ namespace IOL.GreatOffice.Api.Migrations b.HasIndex("CustomerId") .HasDatabaseName("ix_customer_events_customer_id"); + b.HasIndex("TenantId") + .HasDatabaseName("ix_customer_events_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_customer_events_user_id"); + b.ToTable("customer_events", (string)null); }); @@ -383,9 +405,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); - b.Property("CreatedById") + b.Property("CreatedBy") .HasColumnType("uuid") - .HasColumnName("created_by_id"); + .HasColumnName("created_by"); b.Property("Deleted") .HasColumnType("boolean") @@ -395,17 +417,17 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("deleted_at"); - b.Property("DeletedById") + b.Property("DeletedBy") .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); + .HasColumnName("deleted_by"); b.Property("ModifiedAt") .HasColumnType("timestamp with time zone") .HasColumnName("modified_at"); - b.Property("ModifiedById") + b.Property("ModifiedBy") .HasColumnType("uuid") - .HasColumnName("modified_by_id"); + .HasColumnName("modified_by"); b.Property("Name") .HasColumnType("text") @@ -422,6 +444,12 @@ namespace IOL.GreatOffice.Api.Migrations b.HasKey("Id") .HasName("pk_customer_groups"); + b.HasIndex("TenantId") + .HasDatabaseName("ix_customer_groups_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_customer_groups_user_id"); + b.ToTable("customer_groups", (string)null); }); @@ -460,9 +488,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); - b.Property("CreatedById") + b.Property("CreatedBy") .HasColumnType("uuid") - .HasColumnName("created_by_id"); + .HasColumnName("created_by"); b.Property("Deleted") .HasColumnType("boolean") @@ -472,9 +500,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("deleted_at"); - b.Property("DeletedById") + b.Property("DeletedBy") .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); + .HasColumnName("deleted_by"); b.Property("Description") .HasColumnType("text") @@ -484,9 +512,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("modified_at"); - b.Property("ModifiedById") + b.Property("ModifiedBy") .HasColumnType("uuid") - .HasColumnName("modified_by_id"); + .HasColumnName("modified_by"); b.Property("Name") .HasColumnType("text") @@ -511,6 +539,12 @@ namespace IOL.GreatOffice.Api.Migrations b.HasKey("Id") .HasName("pk_projects"); + b.HasIndex("TenantId") + .HasDatabaseName("ix_projects_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_projects_user_id"); + b.ToTable("projects", (string)null); }); @@ -529,9 +563,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); - b.Property("CreatedById") + b.Property("CreatedBy") .HasColumnType("uuid") - .HasColumnName("created_by_id"); + .HasColumnName("created_by"); b.Property("Deleted") .HasColumnType("boolean") @@ -541,17 +575,17 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("deleted_at"); - b.Property("DeletedById") + b.Property("DeletedBy") .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); + .HasColumnName("deleted_by"); b.Property("ModifiedAt") .HasColumnType("timestamp with time zone") .HasColumnName("modified_at"); - b.Property("ModifiedById") + b.Property("ModifiedBy") .HasColumnType("uuid") - .HasColumnName("modified_by_id"); + .HasColumnName("modified_by"); b.Property("ProjectId") .HasColumnType("uuid") @@ -575,6 +609,12 @@ namespace IOL.GreatOffice.Api.Migrations b.HasIndex("ProjectId") .HasDatabaseName("ix_project_labels_project_id"); + b.HasIndex("TenantId") + .HasDatabaseName("ix_project_labels_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_project_labels_user_id"); + b.ToTable("project_labels", (string)null); }); @@ -640,9 +680,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); - b.Property("CreatedById") + b.Property("CreatedBy") .HasColumnType("uuid") - .HasColumnName("created_by_id"); + .HasColumnName("created_by"); b.Property("Deleted") .HasColumnType("boolean") @@ -652,9 +692,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("deleted_at"); - b.Property("DeletedById") + b.Property("DeletedBy") .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); + .HasColumnName("deleted_by"); b.Property("Description") .HasColumnType("text") @@ -672,14 +712,18 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("modified_at"); - b.Property("ModifiedById") + b.Property("ModifiedBy") .HasColumnType("uuid") - .HasColumnName("modified_by_id"); + .HasColumnName("modified_by"); b.Property("Name") .HasColumnType("text") .HasColumnName("name"); + b.Property("OwningTenantId") + .HasColumnType("uuid") + .HasColumnName("owning_tenant_id"); + b.Property("TenantId") .HasColumnType("uuid") .HasColumnName("tenant_id"); @@ -691,6 +735,12 @@ namespace IOL.GreatOffice.Api.Migrations b.HasKey("Id") .HasName("pk_tenants"); + b.HasIndex("OwningTenantId") + .HasDatabaseName("ix_tenants_owning_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_tenants_user_id"); + b.ToTable("tenants", (string)null); }); @@ -709,9 +759,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); - b.Property("CreatedById") + b.Property("CreatedBy") .HasColumnType("uuid") - .HasColumnName("created_by_id"); + .HasColumnName("created_by"); b.Property("Deleted") .HasColumnType("boolean") @@ -721,17 +771,17 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("deleted_at"); - b.Property("DeletedById") + b.Property("DeletedBy") .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); + .HasColumnName("deleted_by"); b.Property("ModifiedAt") .HasColumnType("timestamp with time zone") .HasColumnName("modified_at"); - b.Property("ModifiedById") + b.Property("ModifiedBy") .HasColumnType("uuid") - .HasColumnName("modified_by_id"); + .HasColumnName("modified_by"); b.Property("Name") .HasColumnType("text") @@ -748,6 +798,12 @@ namespace IOL.GreatOffice.Api.Migrations b.HasKey("Id") .HasName("pk_time_categories"); + b.HasIndex("TenantId") + .HasDatabaseName("ix_time_categories_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_time_categories_user_id"); + b.ToTable("time_categories", (string)null); }); @@ -766,9 +822,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); - b.Property("CreatedById") + b.Property("CreatedBy") .HasColumnType("uuid") - .HasColumnName("created_by_id"); + .HasColumnName("created_by"); b.Property("Deleted") .HasColumnType("boolean") @@ -778,9 +834,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("deleted_at"); - b.Property("DeletedById") + b.Property("DeletedBy") .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); + .HasColumnName("deleted_by"); b.Property("Description") .HasColumnType("text") @@ -790,9 +846,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("modified_at"); - b.Property("ModifiedById") + b.Property("ModifiedBy") .HasColumnType("uuid") - .HasColumnName("modified_by_id"); + .HasColumnName("modified_by"); b.Property("Start") .HasColumnType("timestamp with time zone") @@ -816,6 +872,12 @@ namespace IOL.GreatOffice.Api.Migrations b.HasIndex("CategoryId") .HasDatabaseName("ix_time_entries_category_id"); + b.HasIndex("TenantId") + .HasDatabaseName("ix_time_entries_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_time_entries_user_id"); + b.ToTable("time_entries", (string)null); }); @@ -834,9 +896,9 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); - b.Property("CreatedById") + b.Property("CreatedBy") .HasColumnType("uuid") - .HasColumnName("created_by_id"); + .HasColumnName("created_by"); b.Property("Deleted") .HasColumnType("boolean") @@ -846,17 +908,17 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("deleted_at"); - b.Property("DeletedById") + b.Property("DeletedBy") .HasColumnType("uuid") - .HasColumnName("deleted_by_id"); + .HasColumnName("deleted_by"); b.Property("ModifiedAt") .HasColumnType("timestamp with time zone") .HasColumnName("modified_at"); - b.Property("ModifiedById") + b.Property("ModifiedBy") .HasColumnType("uuid") - .HasColumnName("modified_by_id"); + .HasColumnName("modified_by"); b.Property("Name") .HasColumnType("text") @@ -877,12 +939,383 @@ namespace IOL.GreatOffice.Api.Migrations b.HasKey("Id") .HasName("pk_time_labels"); + b.HasIndex("TenantId") + .HasDatabaseName("ix_time_labels_tenant_id"); + b.HasIndex("TimeEntryId") .HasDatabaseName("ix_time_labels_time_entry_id"); + b.HasIndex("UserId") + .HasDatabaseName("ix_time_labels_user_id"); + b.ToTable("time_labels", (string)null); }); + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Todo", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("AssignedToId") + .HasColumnType("uuid") + .HasColumnName("assigned_to_id"); + + b.Property("ClosedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("closed_at"); + + b.Property("ClosedById") + .HasColumnType("uuid") + .HasColumnName("closed_by_id"); + + b.Property("CollectionId") + .HasColumnType("uuid") + .HasColumnName("collection_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("PublicId") + .HasColumnType("text") + .HasColumnName("public_id"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("Title") + .HasColumnType("text") + .HasColumnName("title"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_todos"); + + b.HasIndex("AssignedToId") + .HasDatabaseName("ix_todos_assigned_to_id"); + + b.HasIndex("ClosedById") + .HasDatabaseName("ix_todos_closed_by_id"); + + b.HasIndex("CollectionId") + .HasDatabaseName("ix_todos_collection_id"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_todos_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_todos_user_id"); + + b.ToTable("todos", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoCollection", 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("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("ProjectId") + .HasColumnType("uuid") + .HasColumnName("project_id"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("Visibility") + .HasColumnType("integer") + .HasColumnName("visibility"); + + b.HasKey("Id") + .HasName("pk_todo_collections"); + + b.HasIndex("ProjectId") + .HasDatabaseName("ix_todo_collections_project_id"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_todo_collections_tenant_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_todo_collections_user_id"); + + b.ToTable("todo_collections", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoCollectionAccessControl", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("CanBrowse") + .HasColumnType("boolean") + .HasColumnName("can_browse"); + + b.Property("CanComment") + .HasColumnType("boolean") + .HasColumnName("can_comment"); + + b.Property("CanEdit") + .HasColumnType("boolean") + .HasColumnName("can_edit"); + + b.Property("CanSubmit") + .HasColumnType("boolean") + .HasColumnName("can_submit"); + + b.Property("CollectionId") + .HasColumnType("uuid") + .HasColumnName("collection_id"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_todo_collection_access_controls"); + + b.HasIndex("CollectionId") + .HasDatabaseName("ix_todo_collection_access_controls_collection_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_todo_collection_access_controls_user_id"); + + b.ToTable("todo_collection_access_controls", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoComment", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("ClosingStatement") + .HasColumnType("integer") + .HasColumnName("closing_statement"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("TodoId") + .HasColumnType("uuid") + .HasColumnName("todo_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.Property("Value") + .HasColumnType("text") + .HasColumnName("value"); + + b.HasKey("Id") + .HasName("pk_todo_comments"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_todo_comments_tenant_id"); + + b.HasIndex("TodoId") + .HasDatabaseName("ix_todo_comments_todo_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_todo_comments_user_id"); + + b.ToTable("todo_comments", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoLabel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property("Color") + .HasColumnType("text") + .HasColumnName("color"); + + b.Property("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property("CreatedBy") + .HasColumnType("uuid") + .HasColumnName("created_by"); + + b.Property("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property("DeletedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("deleted_at"); + + b.Property("DeletedBy") + .HasColumnType("uuid") + .HasColumnName("deleted_by"); + + b.Property("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property("ModifiedBy") + .HasColumnType("uuid") + .HasColumnName("modified_by"); + + b.Property("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property("TodoId") + .HasColumnType("uuid") + .HasColumnName("todo_id"); + + b.Property("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_todo_labels"); + + b.HasIndex("TenantId") + .HasDatabaseName("ix_todo_labels_tenant_id"); + + b.HasIndex("TodoId") + .HasDatabaseName("ix_todo_labels_todo_id"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_todo_labels_user_id"); + + b.ToTable("todo_labels", (string)null); + }); + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.User", b => { b.Property("Id") @@ -922,6 +1355,10 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("text") .HasColumnName("password"); + b.Property("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + b.Property("Username") .HasColumnType("text") .HasColumnName("username"); @@ -929,6 +1366,9 @@ namespace IOL.GreatOffice.Api.Migrations b.HasKey("Id") .HasName("pk_users"); + b.HasIndex("TenantId") + .HasDatabaseName("ix_users_tenant_id"); + b.ToTable("users", (string)null); }); @@ -955,25 +1395,6 @@ namespace IOL.GreatOffice.Api.Migrations b.ToTable("data_protection_keys", (string)null); }); - modelBuilder.Entity("TenantUser", b => - { - b.Property("TenantsId") - .HasColumnType("uuid") - .HasColumnName("tenants_id"); - - b.Property("UsersId") - .HasColumnType("uuid") - .HasColumnName("users_id"); - - b.HasKey("TenantsId", "UsersId") - .HasName("pk_tenant_user"); - - b.HasIndex("UsersId") - .HasDatabaseName("ix_tenant_user_users_id"); - - b.ToTable("tenant_user", (string)null); - }); - modelBuilder.Entity("CustomerCustomerGroup", b => { b.HasOne("IOL.GreatOffice.Api.Data.Database.Customer", null) @@ -1021,11 +1442,25 @@ namespace IOL.GreatOffice.Api.Migrations modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Customer", b => { b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "Owner") + .WithMany() + .HasForeignKey("OwnerId") + .HasConstraintName("fk_customers_users_owner_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_customers_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") .WithMany() .HasForeignKey("UserId") .HasConstraintName("fk_customers_users_user_id"); b.Navigation("Owner"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); }); modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.CustomerContact", b => @@ -1035,7 +1470,21 @@ namespace IOL.GreatOffice.Api.Migrations .HasForeignKey("CustomerId") .HasConstraintName("fk_customer_contacts_customers_customer_id"); + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_customer_contacts_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_customer_contacts_users_user_id"); + b.Navigation("Customer"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); }); modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.CustomerEvent", b => @@ -1045,7 +1494,38 @@ namespace IOL.GreatOffice.Api.Migrations .HasForeignKey("CustomerId") .HasConstraintName("fk_customer_events_customers_customer_id"); + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_customer_events_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_customer_events_users_user_id"); + b.Navigation("Customer"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.CustomerGroup", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_customer_groups_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_customer_groups_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); }); modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ForgotPasswordRequest", b => @@ -1060,6 +1540,23 @@ namespace IOL.GreatOffice.Api.Migrations b.Navigation("User"); }); + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Project", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_projects_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_projects_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ProjectLabel", b => { b.HasOne("IOL.GreatOffice.Api.Data.Database.Project", "Project") @@ -1067,6 +1564,20 @@ namespace IOL.GreatOffice.Api.Migrations .HasForeignKey("ProjectId") .HasConstraintName("fk_project_labels_projects_project_id"); + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_project_labels_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_project_labels_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + b.Navigation("Project"); }); @@ -1087,6 +1598,40 @@ namespace IOL.GreatOffice.Api.Migrations b.Navigation("User"); }); + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Tenant", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("OwningTenantId") + .HasConstraintName("fk_tenants_tenants_owning_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany("Tenants") + .HasForeignKey("UserId") + .HasConstraintName("fk_tenants_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeCategory", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_time_categories_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_time_categories_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeEntry", b => { b.HasOne("IOL.GreatOffice.Api.Data.Database.TimeCategory", "Category") @@ -1094,32 +1639,180 @@ namespace IOL.GreatOffice.Api.Migrations .HasForeignKey("CategoryId") .HasConstraintName("fk_time_entries_time_categories_category_id"); + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_time_entries_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_time_entries_users_user_id"); + b.Navigation("Category"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); }); modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeLabel", b => { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_time_labels_tenants_tenant_id"); + b.HasOne("IOL.GreatOffice.Api.Data.Database.TimeEntry", null) .WithMany("Labels") .HasForeignKey("TimeEntryId") .HasConstraintName("fk_time_labels_time_entries_time_entry_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_time_labels_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); }); - modelBuilder.Entity("TenantUser", b => + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Todo", b => { - b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", null) + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "AssignedTo") .WithMany() - .HasForeignKey("TenantsId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_tenant_user_tenants_tenants_id"); + .HasForeignKey("AssignedToId") + .HasConstraintName("fk_todos_users_assigned_to_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "ClosedBy") + .WithMany() + .HasForeignKey("ClosedById") + .HasConstraintName("fk_todos_users_closed_by_id"); - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", null) + b.HasOne("IOL.GreatOffice.Api.Data.Database.TodoCollection", "Collection") .WithMany() - .HasForeignKey("UsersId") + .HasForeignKey("CollectionId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() - .HasConstraintName("fk_tenant_user_users_users_id"); + .HasConstraintName("fk_todos_todo_projects_collection_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_todos_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_todos_users_user_id"); + + b.Navigation("AssignedTo"); + + b.Navigation("ClosedBy"); + + b.Navigation("Collection"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoCollection", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Project", "Project") + .WithMany() + .HasForeignKey("ProjectId") + .HasConstraintName("fk_todo_collections_projects_project_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_todo_collections_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_todo_collections_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoCollectionAccessControl", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.TodoCollection", "Collection") + .WithMany("AccessControls") + .HasForeignKey("CollectionId") + .HasConstraintName("fk_todo_collection_access_controls_todo_collections_collection"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "User") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_todo_collection_access_controls_users_user_id"); + + b.Navigation("Collection"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoComment", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_todo_comments_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Todo", "Todo") + .WithMany("Comments") + .HasForeignKey("TodoId") + .HasConstraintName("fk_todo_comments_todos_todo_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_todo_comments_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + + b.Navigation("Todo"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoLabel", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "OwningTenant") + .WithMany() + .HasForeignKey("TenantId") + .HasConstraintName("fk_todo_labels_tenants_tenant_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.Todo", "Todo") + .WithMany("Labels") + .HasForeignKey("TodoId") + .HasConstraintName("fk_todo_labels_todos_todo_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "OwningUser") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_todo_labels_users_user_id"); + + b.Navigation("OwningTenant"); + + b.Navigation("OwningUser"); + + b.Navigation("Todo"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.User", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", null) + .WithMany("Users") + .HasForeignKey("TenantId") + .HasConstraintName("fk_users_tenants_tenant_id"); }); modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Customer", b => @@ -1136,10 +1829,32 @@ namespace IOL.GreatOffice.Api.Migrations b.Navigation("Members"); }); + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Tenant", b => + { + b.Navigation("Users"); + }); + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeEntry", b => { b.Navigation("Labels"); }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Todo", b => + { + b.Navigation("Comments"); + + b.Navigation("Labels"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TodoCollection", b => + { + b.Navigation("AccessControls"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.User", b => + { + b.Navigation("Tenants"); + }); #pragma warning restore 612, 618 } } -- cgit v1.3