diff options
Diffstat (limited to 'server')
20 files changed, 1353 insertions, 228 deletions
diff --git a/server/src/Data/AppDbContext.cs b/server/src/Data/AppDbContext.cs index 3f949dd..ae34861 100644 --- a/server/src/Data/AppDbContext.cs +++ b/server/src/Data/AppDbContext.cs @@ -23,17 +23,14 @@ public class AppDbContext : DbContext }); modelBuilder.Entity<TimeCategory>(e => { - e.HasOne(c => c.User); e.ToTable("time_categories"); }); modelBuilder.Entity<TimeLabel>(e => { - e.HasOne(c => c.User); e.ToTable("time_labels"); }); modelBuilder.Entity<TimeEntry>(e => { - e.HasOne(c => c.User); e.HasOne(c => c.Category); e.HasMany(c => c.Labels); e.ToTable("time_entries"); diff --git a/server/src/Data/Database/Base.cs b/server/src/Data/Database/Base.cs index 2439668..90b52da 100644 --- a/server/src/Data/Database/Base.cs +++ b/server/src/Data/Database/Base.cs @@ -10,5 +10,6 @@ public class Base public Guid Id { get; init; } public DateTime CreatedAt { get; init; } public DateTime? ModifiedAt { get; private set; } + public bool Deleted { get; set; } public void Modified() => ModifiedAt = DateTime.UtcNow; } diff --git a/server/src/Data/Database/BaseWithOwner.cs b/server/src/Data/Database/BaseWithOwner.cs index bc60b48..8c54aa2 100644 --- a/server/src/Data/Database/BaseWithOwner.cs +++ b/server/src/Data/Database/BaseWithOwner.cs @@ -11,14 +11,9 @@ public class BaseWithOwner : Base UserId = userId; } - public Guid UserId { get; set; } - public User User { get; init; } + public Guid? UserId { get; set; } public Guid? TenantId { get; init; } - public Tenant Tenant { get; init; } public Guid? ModifiedById { get; init; } - public User ModifiedBy { get; init; } public Guid? CreatedById { get; init; } - public User CreatedBy { get; init; } public Guid? DeletedById { get; init; } - public User DeletedBy { get; init; } } diff --git a/server/src/Data/Database/Customer.cs b/server/src/Data/Database/Customer.cs new file mode 100644 index 0000000..7e83c00 --- /dev/null +++ b/server/src/Data/Database/Customer.cs @@ -0,0 +1,7 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class Customer : BaseWithOwner +{ + public string Name { get; set; } + +} diff --git a/server/src/Data/Database/CustomerContact.cs b/server/src/Data/Database/CustomerContact.cs new file mode 100644 index 0000000..f5a951d --- /dev/null +++ b/server/src/Data/Database/CustomerContact.cs @@ -0,0 +1,12 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class CustomerContact : BaseWithOwner +{ + public Customer Customer { get; set; } + public string FirstName { get; set; } + public string LastName { get; set; } + public string Email { get; set; } + public string Phone { get; set; } + public string WorkTitle { get; set; } + public string Note { get; set; } +} diff --git a/server/src/Data/Database/CustomerEvent.cs b/server/src/Data/Database/CustomerEvent.cs new file mode 100644 index 0000000..da3e3ed --- /dev/null +++ b/server/src/Data/Database/CustomerEvent.cs @@ -0,0 +1,7 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class CustomerEvent : BaseWithOwner +{ + public Customer Customer { get; set; } + public string Name { get; set; } +} diff --git a/server/src/Data/Database/Project.cs b/server/src/Data/Database/Project.cs new file mode 100644 index 0000000..7e694ee --- /dev/null +++ b/server/src/Data/Database/Project.cs @@ -0,0 +1,7 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class Project : BaseWithOwner +{ + public string Name { get; set; } + public Guid? CustomerId { get; set; } +} diff --git a/server/src/Data/Database/Tenant.cs b/server/src/Data/Database/Tenant.cs index 3028d13..b185c7a 100644 --- a/server/src/Data/Database/Tenant.cs +++ b/server/src/Data/Database/Tenant.cs @@ -7,4 +7,5 @@ public class Tenant : BaseWithOwner public string ContactEmail { get; set; } public Guid MasterUserId { get; set; } public string MasterUserPassword { get; set; } + public ICollection<User> Users { get; set; } } diff --git a/server/src/Data/Database/Todo.cs b/server/src/Data/Database/Todo.cs new file mode 100644 index 0000000..5fe3c9a --- /dev/null +++ b/server/src/Data/Database/Todo.cs @@ -0,0 +1,13 @@ +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<TodoLabel> Labels { get; set; } + public ICollection<TodoComment> Comments { get; set; } +} diff --git a/server/src/Data/Database/TodoComment.cs b/server/src/Data/Database/TodoComment.cs new file mode 100644 index 0000000..44dcbed --- /dev/null +++ b/server/src/Data/Database/TodoComment.cs @@ -0,0 +1,7 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class TodoComment : BaseWithOwner +{ + public string Value { get; set; } + public Todo Todo { get; set; } +} diff --git a/server/src/Data/Database/TodoLabel.cs b/server/src/Data/Database/TodoLabel.cs new file mode 100644 index 0000000..7753ade --- /dev/null +++ b/server/src/Data/Database/TodoLabel.cs @@ -0,0 +1,8 @@ +namespace IOL.GreatOffice.Api.Data.Database; + +public class TodoLabel : BaseWithOwner +{ + public string Name { get; set; } + public string Color { get; set; } + public Todo Todo { get; set; } +} diff --git a/server/src/Data/Database/TodoProject.cs b/server/src/Data/Database/TodoProject.cs new file mode 100644 index 0000000..0a4a7be --- /dev/null +++ b/server/src/Data/Database/TodoProject.cs @@ -0,0 +1,16 @@ +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; } +} + +public enum TodoVisibility +{ + PRIVATE = 0, + UNLISTED = 1, + TENANT_WIDE = 2, + PUBLIC = 3, +} diff --git a/server/src/Data/Database/TodoProjectAccessControl.cs b/server/src/Data/Database/TodoProjectAccessControl.cs new file mode 100644 index 0000000..964f831 --- /dev/null +++ b/server/src/Data/Database/TodoProjectAccessControl.cs @@ -0,0 +1,11 @@ +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/server/src/Data/Database/TodoStatus.cs b/server/src/Data/Database/TodoStatus.cs new file mode 100644 index 0000000..416212d --- /dev/null +++ b/server/src/Data/Database/TodoStatus.cs @@ -0,0 +1,45 @@ +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<TodoStatus> GetDefaultStatusSetForTenant(Guid tenantId) { + return new List<TodoStatus>() { + new() { + Name = "Reported", + TenantId = tenantId + }, + new() { + Name = "Resolved", + TenantId = tenantId + }, + new() { + Name = "Fixed", + TenantId = tenantId + }, + new() { + Name = "Implemented", + TenantId = tenantId + }, + new() { + Name = "Won't fix", + TenantId = tenantId + }, + new() { + Name = "By design", + TenantId = tenantId + }, + new() { + Name = "Invalid", + TenantId = tenantId + }, + new() { + Name = "Duplicate", + TenantId = tenantId + } + }; + } +} diff --git a/server/src/Data/Database/User.cs b/server/src/Data/Database/User.cs index c5063f6..83b8338 100644 --- a/server/src/Data/Database/User.cs +++ b/server/src/Data/Database/User.cs @@ -8,8 +8,12 @@ public class User : Base Username = username; } + public string FirstName { get; set; } + public string LastName { get; set; } + public string Email { get; set; } public string Username { get; set; } public string Password { get; set; } + public ICollection<Tenant> Tenants { get; set; } public void HashAndSetPassword(string password) { diff --git a/server/src/Endpoints/Internal/Account/GetArchiveRoute.cs b/server/src/Endpoints/Internal/Account/GetArchiveRoute.cs index 44f5249..951dee0 100644 --- a/server/src/Endpoints/Internal/Account/GetArchiveRoute.cs +++ b/server/src/Endpoints/Internal/Account/GetArchiveRoute.cs @@ -26,7 +26,7 @@ public class GetAccountArchiveRoute : RouteBaseAsync.WithoutRequest.WithActionRe .AsNoTracking() .Include(c => c.Labels) .Include(c => c.Category) - .Where(c => c.User.Id == user.Id) + .Where(c => c.UserId == user.Id) .ToList(); var jsonOptions = new JsonSerializerOptions { diff --git a/server/src/Endpoints/V1/Labels/UpdateLabelRoute.cs b/server/src/Endpoints/V1/Labels/UpdateLabelRoute.cs index 0868671..30d72ec 100644 --- a/server/src/Endpoints/V1/Labels/UpdateLabelRoute.cs +++ b/server/src/Endpoints/V1/Labels/UpdateLabelRoute.cs @@ -26,7 +26,7 @@ public class UpdateLabelEndpoint : RouteBaseSync.WithRequest<TimeLabel.TimeLabel return NotFound(); } - if (LoggedInUser.Id != label.User.Id) { + if (LoggedInUser.Id != label.UserId) { return Forbid(); } diff --git a/server/src/Migrations/20220606232346_FleshOutNewModules.Designer.cs b/server/src/Migrations/20220606232346_FleshOutNewModules.Designer.cs new file mode 100644 index 0000000..69d4f7e --- /dev/null +++ b/server/src/Migrations/20220606232346_FleshOutNewModules.Designer.cs @@ -0,0 +1,510 @@ +// <auto-generated /> +using System; +using IOL.GreatOffice.Api.Data; +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(AppDbContext))] + [Migration("20220606232346_FleshOutNewModules")] + partial class FleshOutNewModules + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "6.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ApiAccessToken", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<bool>("AllowCreate") + .HasColumnType("boolean") + .HasColumnName("allow_create"); + + b.Property<bool>("AllowDelete") + .HasColumnType("boolean") + .HasColumnName("allow_delete"); + + b.Property<bool>("AllowRead") + .HasColumnType("boolean") + .HasColumnName("allow_read"); + + b.Property<bool>("AllowUpdate") + .HasColumnType("boolean") + .HasColumnName("allow_update"); + + b.Property<DateTime>("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property<bool>("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property<DateTime>("ExpiryDate") + .HasColumnType("timestamp with time zone") + .HasColumnName("expiry_date"); + + b.Property<DateTime?>("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property<Guid?>("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.ForgotPasswordRequest", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<DateTime>("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property<Guid>("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.GithubUserMapping", b => + { + b.Property<string>("GithubId") + .HasColumnType("text") + .HasColumnName("github_id"); + + b.Property<string>("Email") + .HasColumnType("text") + .HasColumnName("email"); + + b.Property<string>("RefreshToken") + .HasColumnType("text") + .HasColumnName("refresh_token"); + + b.Property<Guid?>("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("GithubId") + .HasName("pk_github_user_mappings"); + + b.HasIndex("UserId") + .HasDatabaseName("ix_github_user_mappings_user_id"); + + b.ToTable("github_user_mappings", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Tenant", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<string>("ContactEmail") + .HasColumnType("text") + .HasColumnName("contact_email"); + + b.Property<DateTime>("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property<Guid?>("CreatedById") + .HasColumnType("uuid") + .HasColumnName("created_by_id"); + + b.Property<bool>("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property<Guid?>("DeletedById") + .HasColumnType("uuid") + .HasColumnName("deleted_by_id"); + + b.Property<string>("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property<Guid>("MasterUserId") + .HasColumnType("uuid") + .HasColumnName("master_user_id"); + + b.Property<string>("MasterUserPassword") + .HasColumnType("text") + .HasColumnName("master_user_password"); + + b.Property<DateTime?>("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property<Guid?>("ModifiedById") + .HasColumnType("uuid") + .HasColumnName("modified_by_id"); + + b.Property<string>("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property<Guid?>("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property<Guid?>("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_tenants"); + + b.ToTable("tenants", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeCategory", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<string>("Color") + .HasColumnType("text") + .HasColumnName("color"); + + b.Property<DateTime>("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property<Guid?>("CreatedById") + .HasColumnType("uuid") + .HasColumnName("created_by_id"); + + b.Property<bool>("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property<Guid?>("DeletedById") + .HasColumnType("uuid") + .HasColumnName("deleted_by_id"); + + b.Property<DateTime?>("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property<Guid?>("ModifiedById") + .HasColumnType("uuid") + .HasColumnName("modified_by_id"); + + b.Property<string>("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property<Guid?>("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property<Guid?>("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_time_categories"); + + b.ToTable("time_categories", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeEntry", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<Guid?>("CategoryId") + .HasColumnType("uuid") + .HasColumnName("category_id"); + + b.Property<DateTime>("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property<Guid?>("CreatedById") + .HasColumnType("uuid") + .HasColumnName("created_by_id"); + + b.Property<bool>("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property<Guid?>("DeletedById") + .HasColumnType("uuid") + .HasColumnName("deleted_by_id"); + + b.Property<string>("Description") + .HasColumnType("text") + .HasColumnName("description"); + + b.Property<DateTime?>("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property<Guid?>("ModifiedById") + .HasColumnType("uuid") + .HasColumnName("modified_by_id"); + + b.Property<DateTime>("Start") + .HasColumnType("timestamp with time zone") + .HasColumnName("start"); + + b.Property<DateTime>("Stop") + .HasColumnType("timestamp with time zone") + .HasColumnName("stop"); + + b.Property<Guid?>("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property<Guid?>("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_time_entries"); + + b.HasIndex("CategoryId") + .HasDatabaseName("ix_time_entries_category_id"); + + b.ToTable("time_entries", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeLabel", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<string>("Color") + .HasColumnType("text") + .HasColumnName("color"); + + b.Property<DateTime>("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property<Guid?>("CreatedById") + .HasColumnType("uuid") + .HasColumnName("created_by_id"); + + b.Property<bool>("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property<Guid?>("DeletedById") + .HasColumnType("uuid") + .HasColumnName("deleted_by_id"); + + b.Property<DateTime?>("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property<Guid?>("ModifiedById") + .HasColumnType("uuid") + .HasColumnName("modified_by_id"); + + b.Property<string>("Name") + .HasColumnType("text") + .HasColumnName("name"); + + b.Property<Guid?>("TenantId") + .HasColumnType("uuid") + .HasColumnName("tenant_id"); + + b.Property<Guid?>("TimeEntryId") + .HasColumnType("uuid") + .HasColumnName("time_entry_id"); + + b.Property<Guid?>("UserId") + .HasColumnType("uuid") + .HasColumnName("user_id"); + + b.HasKey("Id") + .HasName("pk_time_labels"); + + b.HasIndex("TimeEntryId") + .HasDatabaseName("ix_time_labels_time_entry_id"); + + b.ToTable("time_labels", (string)null); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.User", b => + { + b.Property<Guid>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uuid") + .HasColumnName("id"); + + b.Property<DateTime>("CreatedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("created_at"); + + b.Property<bool>("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property<string>("Email") + .HasColumnType("text") + .HasColumnName("email"); + + b.Property<string>("FirstName") + .HasColumnType("text") + .HasColumnName("first_name"); + + b.Property<string>("LastName") + .HasColumnType("text") + .HasColumnName("last_name"); + + b.Property<DateTime?>("ModifiedAt") + .HasColumnType("timestamp with time zone") + .HasColumnName("modified_at"); + + b.Property<string>("Password") + .HasColumnType("text") + .HasColumnName("password"); + + b.Property<string>("Username") + .HasColumnType("text") + .HasColumnName("username"); + + b.HasKey("Id") + .HasName("pk_users"); + + b.ToTable("users", (string)null); + }); + + modelBuilder.Entity("TenantUser", b => + { + b.Property<Guid>("TenantsId") + .HasColumnType("uuid") + .HasColumnName("tenants_id"); + + b.Property<Guid>("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("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.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.GithubUserMapping", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "User") + .WithMany() + .HasForeignKey("UserId") + .HasConstraintName("fk_github_user_mappings_users_user_id"); + + b.Navigation("User"); + }); + + 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.Navigation("Category"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeLabel", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.TimeEntry", null) + .WithMany("Labels") + .HasForeignKey("TimeEntryId") + .HasConstraintName("fk_time_labels_time_entries_time_entry_id"); + }); + + modelBuilder.Entity("TenantUser", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", null) + .WithMany() + .HasForeignKey("TenantsId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_tenant_user_tenants_tenants_id"); + + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_tenant_user_users_users_id"); + }); + + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeEntry", b => + { + b.Navigation("Labels"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/server/src/Migrations/20220606232346_FleshOutNewModules.cs b/server/src/Migrations/20220606232346_FleshOutNewModules.cs new file mode 100644 index 0000000..49a36b8 --- /dev/null +++ b/server/src/Migrations/20220606232346_FleshOutNewModules.cs @@ -0,0 +1,630 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace IOL.GreatOffice.Api.Migrations +{ + public partial class FleshOutNewModules : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "fk_tenants_tenants_tenant_id1", + table: "tenants"); + + migrationBuilder.DropForeignKey( + name: "fk_tenants_users_created_by_id", + table: "tenants"); + + migrationBuilder.DropForeignKey( + name: "fk_tenants_users_deleted_by_id", + table: "tenants"); + + migrationBuilder.DropForeignKey( + name: "fk_tenants_users_modified_by_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_created_by_id", + table: "time_categories"); + + migrationBuilder.DropForeignKey( + name: "fk_time_categories_users_deleted_by_id", + table: "time_categories"); + + migrationBuilder.DropForeignKey( + name: "fk_time_categories_users_modified_by_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_created_by_id", + table: "time_entries"); + + migrationBuilder.DropForeignKey( + name: "fk_time_entries_users_deleted_by_id", + table: "time_entries"); + + migrationBuilder.DropForeignKey( + name: "fk_time_entries_users_modified_by_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_created_by_id", + table: "time_labels"); + + migrationBuilder.DropForeignKey( + name: "fk_time_labels_users_deleted_by_id", + table: "time_labels"); + + migrationBuilder.DropForeignKey( + name: "fk_time_labels_users_modified_by_id", + table: "time_labels"); + + migrationBuilder.DropForeignKey( + name: "fk_time_labels_users_user_id", + table: "time_labels"); + + migrationBuilder.DropIndex( + name: "ix_time_labels_created_by_id", + table: "time_labels"); + + migrationBuilder.DropIndex( + name: "ix_time_labels_deleted_by_id", + table: "time_labels"); + + migrationBuilder.DropIndex( + name: "ix_time_labels_modified_by_id", + table: "time_labels"); + + 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_created_by_id", + table: "time_entries"); + + migrationBuilder.DropIndex( + name: "ix_time_entries_deleted_by_id", + table: "time_entries"); + + migrationBuilder.DropIndex( + name: "ix_time_entries_modified_by_id", + table: "time_entries"); + + 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_created_by_id", + table: "time_categories"); + + migrationBuilder.DropIndex( + name: "ix_time_categories_deleted_by_id", + table: "time_categories"); + + migrationBuilder.DropIndex( + name: "ix_time_categories_modified_by_id", + table: "time_categories"); + + 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_created_by_id", + table: "tenants"); + + migrationBuilder.DropIndex( + name: "ix_tenants_deleted_by_id", + table: "tenants"); + + migrationBuilder.DropIndex( + name: "ix_tenants_modified_by_id", + table: "tenants"); + + migrationBuilder.DropIndex( + name: "ix_tenants_tenant_id1", + table: "tenants"); + + migrationBuilder.DropIndex( + name: "ix_tenants_user_id", + table: "tenants"); + + migrationBuilder.DropColumn( + name: "tenant_id1", + table: "tenants"); + + migrationBuilder.AddColumn<bool>( + name: "deleted", + table: "users", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn<string>( + name: "email", + table: "users", + type: "text", + nullable: true); + + migrationBuilder.AddColumn<string>( + name: "first_name", + table: "users", + type: "text", + nullable: true); + + migrationBuilder.AddColumn<string>( + name: "last_name", + table: "users", + type: "text", + nullable: true); + + migrationBuilder.AlterColumn<Guid>( + name: "user_id", + table: "time_labels", + type: "uuid", + nullable: true, + oldClrType: typeof(Guid), + oldType: "uuid"); + + migrationBuilder.AddColumn<bool>( + name: "deleted", + table: "time_labels", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.AlterColumn<Guid>( + name: "user_id", + table: "time_entries", + type: "uuid", + nullable: true, + oldClrType: typeof(Guid), + oldType: "uuid"); + + migrationBuilder.AddColumn<bool>( + name: "deleted", + table: "time_entries", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.AlterColumn<Guid>( + name: "user_id", + table: "time_categories", + type: "uuid", + nullable: true, + oldClrType: typeof(Guid), + oldType: "uuid"); + + migrationBuilder.AddColumn<bool>( + name: "deleted", + table: "time_categories", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.AlterColumn<Guid>( + name: "user_id", + table: "tenants", + type: "uuid", + nullable: true, + oldClrType: typeof(Guid), + oldType: "uuid"); + + migrationBuilder.AddColumn<bool>( + name: "deleted", + table: "tenants", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.AddColumn<bool>( + name: "deleted", + table: "api_access_tokens", + type: "boolean", + nullable: false, + defaultValue: false); + + migrationBuilder.CreateTable( + name: "tenant_user", + columns: table => new + { + tenants_id = table.Column<Guid>(type: "uuid", nullable: false), + users_id = table.Column<Guid>(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"); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "tenant_user"); + + migrationBuilder.DropColumn( + name: "deleted", + table: "users"); + + migrationBuilder.DropColumn( + name: "email", + table: "users"); + + migrationBuilder.DropColumn( + name: "first_name", + table: "users"); + + migrationBuilder.DropColumn( + name: "last_name", + table: "users"); + + migrationBuilder.DropColumn( + name: "deleted", + table: "time_labels"); + + migrationBuilder.DropColumn( + name: "deleted", + table: "time_entries"); + + migrationBuilder.DropColumn( + name: "deleted", + table: "time_categories"); + + migrationBuilder.DropColumn( + name: "deleted", + table: "tenants"); + + migrationBuilder.DropColumn( + name: "deleted", + table: "api_access_tokens"); + + migrationBuilder.AlterColumn<Guid>( + name: "user_id", + table: "time_labels", + type: "uuid", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + oldClrType: typeof(Guid), + oldType: "uuid", + oldNullable: true); + + migrationBuilder.AlterColumn<Guid>( + name: "user_id", + table: "time_entries", + type: "uuid", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + oldClrType: typeof(Guid), + oldType: "uuid", + oldNullable: true); + + migrationBuilder.AlterColumn<Guid>( + name: "user_id", + table: "time_categories", + type: "uuid", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + oldClrType: typeof(Guid), + oldType: "uuid", + oldNullable: true); + + migrationBuilder.AlterColumn<Guid>( + name: "user_id", + table: "tenants", + type: "uuid", + nullable: false, + defaultValue: new Guid("00000000-0000-0000-0000-000000000000"), + oldClrType: typeof(Guid), + oldType: "uuid", + oldNullable: true); + + migrationBuilder.AddColumn<Guid>( + name: "tenant_id1", + table: "tenants", + type: "uuid", + nullable: true); + + migrationBuilder.CreateIndex( + name: "ix_time_labels_created_by_id", + table: "time_labels", + column: "created_by_id"); + + migrationBuilder.CreateIndex( + name: "ix_time_labels_deleted_by_id", + table: "time_labels", + column: "deleted_by_id"); + + migrationBuilder.CreateIndex( + name: "ix_time_labels_modified_by_id", + table: "time_labels", + column: "modified_by_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_created_by_id", + table: "time_entries", + column: "created_by_id"); + + migrationBuilder.CreateIndex( + name: "ix_time_entries_deleted_by_id", + table: "time_entries", + column: "deleted_by_id"); + + migrationBuilder.CreateIndex( + name: "ix_time_entries_modified_by_id", + table: "time_entries", + column: "modified_by_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_created_by_id", + table: "time_categories", + column: "created_by_id"); + + migrationBuilder.CreateIndex( + name: "ix_time_categories_deleted_by_id", + table: "time_categories", + column: "deleted_by_id"); + + migrationBuilder.CreateIndex( + name: "ix_time_categories_modified_by_id", + table: "time_categories", + column: "modified_by_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_created_by_id", + table: "tenants", + column: "created_by_id"); + + migrationBuilder.CreateIndex( + name: "ix_tenants_deleted_by_id", + table: "tenants", + column: "deleted_by_id"); + + migrationBuilder.CreateIndex( + name: "ix_tenants_modified_by_id", + table: "tenants", + column: "modified_by_id"); + + migrationBuilder.CreateIndex( + name: "ix_tenants_tenant_id1", + table: "tenants", + column: "tenant_id1"); + + migrationBuilder.CreateIndex( + name: "ix_tenants_user_id", + table: "tenants", + column: "user_id"); + + migrationBuilder.AddForeignKey( + name: "fk_tenants_tenants_tenant_id1", + table: "tenants", + column: "tenant_id1", + principalTable: "tenants", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_tenants_users_created_by_id", + table: "tenants", + column: "created_by_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_tenants_users_deleted_by_id", + table: "tenants", + column: "deleted_by_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_tenants_users_modified_by_id", + table: "tenants", + column: "modified_by_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_tenants_users_user_id", + table: "tenants", + column: "user_id", + principalTable: "users", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + 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_created_by_id", + table: "time_categories", + column: "created_by_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_categories_users_deleted_by_id", + table: "time_categories", + column: "deleted_by_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_categories_users_modified_by_id", + table: "time_categories", + column: "modified_by_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_categories_users_user_id", + table: "time_categories", + column: "user_id", + principalTable: "users", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + 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_created_by_id", + table: "time_entries", + column: "created_by_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_entries_users_deleted_by_id", + table: "time_entries", + column: "deleted_by_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_entries_users_modified_by_id", + table: "time_entries", + column: "modified_by_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_entries_users_user_id", + table: "time_entries", + column: "user_id", + principalTable: "users", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + + 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_created_by_id", + table: "time_labels", + column: "created_by_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_labels_users_deleted_by_id", + table: "time_labels", + column: "deleted_by_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_labels_users_modified_by_id", + table: "time_labels", + column: "modified_by_id", + principalTable: "users", + principalColumn: "id"); + + migrationBuilder.AddForeignKey( + name: "fk_time_labels_users_user_id", + table: "time_labels", + column: "user_id", + principalTable: "users", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/server/src/Migrations/AppDbContextModelSnapshot.cs b/server/src/Migrations/AppDbContextModelSnapshot.cs index a777782..70582b5 100644 --- a/server/src/Migrations/AppDbContextModelSnapshot.cs +++ b/server/src/Migrations/AppDbContextModelSnapshot.cs @@ -49,6 +49,10 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property<bool>("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + b.Property<DateTime>("ExpiryDate") .HasColumnType("timestamp with time zone") .HasColumnName("expiry_date"); @@ -140,6 +144,10 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("uuid") .HasColumnName("created_by_id"); + b.Property<bool>("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + b.Property<Guid?>("DeletedById") .HasColumnType("uuid") .HasColumnName("deleted_by_id"); @@ -172,32 +180,13 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("uuid") .HasColumnName("tenant_id"); - b.Property<Guid?>("TenantId1") - .HasColumnType("uuid") - .HasColumnName("tenant_id1"); - - b.Property<Guid>("UserId") + b.Property<Guid?>("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.HasKey("Id") .HasName("pk_tenants"); - b.HasIndex("CreatedById") - .HasDatabaseName("ix_tenants_created_by_id"); - - b.HasIndex("DeletedById") - .HasDatabaseName("ix_tenants_deleted_by_id"); - - b.HasIndex("ModifiedById") - .HasDatabaseName("ix_tenants_modified_by_id"); - - b.HasIndex("TenantId1") - .HasDatabaseName("ix_tenants_tenant_id1"); - - b.HasIndex("UserId") - .HasDatabaseName("ix_tenants_user_id"); - b.ToTable("tenants", (string)null); }); @@ -220,6 +209,10 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("uuid") .HasColumnName("created_by_id"); + b.Property<bool>("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + b.Property<Guid?>("DeletedById") .HasColumnType("uuid") .HasColumnName("deleted_by_id"); @@ -240,28 +233,13 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("uuid") .HasColumnName("tenant_id"); - b.Property<Guid>("UserId") + b.Property<Guid?>("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.HasKey("Id") .HasName("pk_time_categories"); - b.HasIndex("CreatedById") - .HasDatabaseName("ix_time_categories_created_by_id"); - - b.HasIndex("DeletedById") - .HasDatabaseName("ix_time_categories_deleted_by_id"); - - b.HasIndex("ModifiedById") - .HasDatabaseName("ix_time_categories_modified_by_id"); - - b.HasIndex("TenantId") - .HasDatabaseName("ix_time_categories_tenant_id"); - - b.HasIndex("UserId") - .HasDatabaseName("ix_time_categories_user_id"); - b.ToTable("time_categories", (string)null); }); @@ -284,6 +262,10 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("uuid") .HasColumnName("created_by_id"); + b.Property<bool>("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + b.Property<Guid?>("DeletedById") .HasColumnType("uuid") .HasColumnName("deleted_by_id"); @@ -312,7 +294,7 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("uuid") .HasColumnName("tenant_id"); - b.Property<Guid>("UserId") + b.Property<Guid?>("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); @@ -322,21 +304,6 @@ namespace IOL.GreatOffice.Api.Migrations b.HasIndex("CategoryId") .HasDatabaseName("ix_time_entries_category_id"); - b.HasIndex("CreatedById") - .HasDatabaseName("ix_time_entries_created_by_id"); - - b.HasIndex("DeletedById") - .HasDatabaseName("ix_time_entries_deleted_by_id"); - - b.HasIndex("ModifiedById") - .HasDatabaseName("ix_time_entries_modified_by_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); }); @@ -359,6 +326,10 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("uuid") .HasColumnName("created_by_id"); + b.Property<bool>("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + b.Property<Guid?>("DeletedById") .HasColumnType("uuid") .HasColumnName("deleted_by_id"); @@ -383,31 +354,16 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("uuid") .HasColumnName("time_entry_id"); - b.Property<Guid>("UserId") + b.Property<Guid?>("UserId") .HasColumnType("uuid") .HasColumnName("user_id"); b.HasKey("Id") .HasName("pk_time_labels"); - b.HasIndex("CreatedById") - .HasDatabaseName("ix_time_labels_created_by_id"); - - b.HasIndex("DeletedById") - .HasDatabaseName("ix_time_labels_deleted_by_id"); - - b.HasIndex("ModifiedById") - .HasDatabaseName("ix_time_labels_modified_by_id"); - - 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); }); @@ -422,6 +378,22 @@ namespace IOL.GreatOffice.Api.Migrations .HasColumnType("timestamp with time zone") .HasColumnName("created_at"); + b.Property<bool>("Deleted") + .HasColumnType("boolean") + .HasColumnName("deleted"); + + b.Property<string>("Email") + .HasColumnType("text") + .HasColumnName("email"); + + b.Property<string>("FirstName") + .HasColumnType("text") + .HasColumnName("first_name"); + + b.Property<string>("LastName") + .HasColumnType("text") + .HasColumnName("last_name"); + b.Property<DateTime?>("ModifiedAt") .HasColumnType("timestamp with time zone") .HasColumnName("modified_at"); @@ -440,114 +412,53 @@ namespace IOL.GreatOffice.Api.Migrations b.ToTable("users", (string)null); }); - modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ApiAccessToken", b => + modelBuilder.Entity("TenantUser", b => { - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "User") - .WithMany() - .HasForeignKey("UserId") - .HasConstraintName("fk_api_access_tokens_users_user_id"); + b.Property<Guid>("TenantsId") + .HasColumnType("uuid") + .HasColumnName("tenants_id"); - b.Navigation("User"); - }); + b.Property<Guid>("UsersId") + .HasColumnType("uuid") + .HasColumnName("users_id"); - 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.HasKey("TenantsId", "UsersId") + .HasName("pk_tenant_user"); - b.Navigation("User"); + b.HasIndex("UsersId") + .HasDatabaseName("ix_tenant_user_users_id"); + + b.ToTable("tenant_user", (string)null); }); - modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.GithubUserMapping", b => + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ApiAccessToken", b => { b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "User") .WithMany() .HasForeignKey("UserId") - .HasConstraintName("fk_github_user_mappings_users_user_id"); + .HasConstraintName("fk_api_access_tokens_users_user_id"); b.Navigation("User"); }); - modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.Tenant", b => + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.ForgotPasswordRequest", b => { - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "CreatedBy") - .WithMany() - .HasForeignKey("CreatedById") - .HasConstraintName("fk_tenants_users_created_by_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "DeletedBy") - .WithMany() - .HasForeignKey("DeletedById") - .HasConstraintName("fk_tenants_users_deleted_by_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "ModifiedBy") - .WithMany() - .HasForeignKey("ModifiedById") - .HasConstraintName("fk_tenants_users_modified_by_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId1") - .HasConstraintName("fk_tenants_tenants_tenant_id1"); - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "User") .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() - .HasConstraintName("fk_tenants_users_user_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("ModifiedBy"); - - b.Navigation("Tenant"); + .HasConstraintName("fk_forgot_password_requests_users_user_id"); b.Navigation("User"); }); - modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeCategory", b => + modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.GithubUserMapping", b => { - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "CreatedBy") - .WithMany() - .HasForeignKey("CreatedById") - .HasConstraintName("fk_time_categories_users_created_by_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "DeletedBy") - .WithMany() - .HasForeignKey("DeletedById") - .HasConstraintName("fk_time_categories_users_deleted_by_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "ModifiedBy") - .WithMany() - .HasForeignKey("ModifiedById") - .HasConstraintName("fk_time_categories_users_modified_by_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .HasConstraintName("fk_time_categories_tenants_tenant_id"); - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "User") .WithMany() .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_time_categories_users_user_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("ModifiedBy"); - - b.Navigation("Tenant"); + .HasConstraintName("fk_github_user_mappings_users_user_id"); b.Navigation("User"); }); @@ -559,89 +470,32 @@ namespace IOL.GreatOffice.Api.Migrations .HasForeignKey("CategoryId") .HasConstraintName("fk_time_entries_time_categories_category_id"); - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "CreatedBy") - .WithMany() - .HasForeignKey("CreatedById") - .HasConstraintName("fk_time_entries_users_created_by_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "DeletedBy") - .WithMany() - .HasForeignKey("DeletedById") - .HasConstraintName("fk_time_entries_users_deleted_by_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "ModifiedBy") - .WithMany() - .HasForeignKey("ModifiedById") - .HasConstraintName("fk_time_entries_users_modified_by_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "Tenant") - .WithMany() - .HasForeignKey("TenantId") - .HasConstraintName("fk_time_entries_tenants_tenant_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "User") - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired() - .HasConstraintName("fk_time_entries_users_user_id"); - b.Navigation("Category"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("ModifiedBy"); - - b.Navigation("Tenant"); - - b.Navigation("User"); }); modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeLabel", b => { - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "CreatedBy") - .WithMany() - .HasForeignKey("CreatedById") - .HasConstraintName("fk_time_labels_users_created_by_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "DeletedBy") - .WithMany() - .HasForeignKey("DeletedById") - .HasConstraintName("fk_time_labels_users_deleted_by_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.User", "ModifiedBy") - .WithMany() - .HasForeignKey("ModifiedById") - .HasConstraintName("fk_time_labels_users_modified_by_id"); - - b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", "Tenant") - .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", "User") + modelBuilder.Entity("TenantUser", b => + { + b.HasOne("IOL.GreatOffice.Api.Data.Database.Tenant", null) .WithMany() - .HasForeignKey("UserId") + .HasForeignKey("TenantsId") .OnDelete(DeleteBehavior.Cascade) .IsRequired() - .HasConstraintName("fk_time_labels_users_user_id"); - - b.Navigation("CreatedBy"); - - b.Navigation("DeletedBy"); - - b.Navigation("ModifiedBy"); - - b.Navigation("Tenant"); + .HasConstraintName("fk_tenant_user_tenants_tenants_id"); - b.Navigation("User"); + b.HasOne("IOL.GreatOffice.Api.Data.Database.User", null) + .WithMany() + .HasForeignKey("UsersId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_tenant_user_users_users_id"); }); modelBuilder.Entity("IOL.GreatOffice.Api.Data.Database.TimeEntry", b => |
