From 27a59d70490781a1a5ec9842e5250e518b4d2628 Mon Sep 17 00:00:00 2001 From: lumijiez <59575049+lumijiez@users.noreply.github.com> Date: Fri, 6 Jun 2025 19:15:50 +0300 Subject: [PATCH] Add users & migrations --- src/Imprink.Domain/Entities/Users/Role.cs | 9 + src/Imprink.Domain/Entities/Users/User.cs | 20 + src/Imprink.Domain/Entities/Users/UserRole.cs | 9 + .../Configuration/Users/RoleConfiguration.cs | 31 + .../Configuration/Users/UserConfiguration.cs | 65 ++ .../Users/UserRoleConfiguration.cs | 31 + .../Database/ApplicationDbContext.cs | 3 + .../20250606161235_AddUserRoles.Designer.cs | 1023 +++++++++++++++++ .../Migrations/20250606161235_AddUserRoles.cs | 152 +++ .../ApplicationDbContextModelSnapshot.cs | 170 +++ 10 files changed, 1513 insertions(+) create mode 100644 src/Imprink.Domain/Entities/Users/Role.cs create mode 100644 src/Imprink.Domain/Entities/Users/User.cs create mode 100644 src/Imprink.Domain/Entities/Users/UserRole.cs create mode 100644 src/Imprink.Infrastructure/Configuration/Users/RoleConfiguration.cs create mode 100644 src/Imprink.Infrastructure/Configuration/Users/UserConfiguration.cs create mode 100644 src/Imprink.Infrastructure/Configuration/Users/UserRoleConfiguration.cs create mode 100644 src/Imprink.Infrastructure/Migrations/20250606161235_AddUserRoles.Designer.cs create mode 100644 src/Imprink.Infrastructure/Migrations/20250606161235_AddUserRoles.cs diff --git a/src/Imprink.Domain/Entities/Users/Role.cs b/src/Imprink.Domain/Entities/Users/Role.cs new file mode 100644 index 0000000..7732966 --- /dev/null +++ b/src/Imprink.Domain/Entities/Users/Role.cs @@ -0,0 +1,9 @@ +namespace Imprink.Domain.Entities.Users; + +public class Role +{ + public Guid Id { get; set; } + public string RoleName { get; set; } = null!; + + public virtual ICollection UserRoles { get; set; } = new List(); +} \ No newline at end of file diff --git a/src/Imprink.Domain/Entities/Users/User.cs b/src/Imprink.Domain/Entities/Users/User.cs new file mode 100644 index 0000000..00cd877 --- /dev/null +++ b/src/Imprink.Domain/Entities/Users/User.cs @@ -0,0 +1,20 @@ +namespace Imprink.Domain.Entities.Users; + +public class User : EntityBase +{ + public new string Id { get; set; } = null!; + public required string Email { get; set; } + public required string FirstName { get; set; } + public required string LastName { get; set; } + public string? PhoneNumber { get; set; } + public DateTime? DateOfBirth { get; set; } + public required bool IsActive { get; set; } + public DateTime? LastLoginAt { get; set; } + + public virtual ICollection
Addresses { get; set; } = new List
(); + public virtual ICollection UserRoles { get; set; } = new List(); + + public string FullName => $"{FirstName} {LastName}"; + public Address? DefaultAddress => Addresses.FirstOrDefault(a => a.IsDefault && a.IsActive); + public IEnumerable Roles => UserRoles.Select(ur => ur.Role); +} \ No newline at end of file diff --git a/src/Imprink.Domain/Entities/Users/UserRole.cs b/src/Imprink.Domain/Entities/Users/UserRole.cs new file mode 100644 index 0000000..b6de7cc --- /dev/null +++ b/src/Imprink.Domain/Entities/Users/UserRole.cs @@ -0,0 +1,9 @@ +namespace Imprink.Domain.Entities.Users; + +public class UserRole +{ + public string UserId { get; set; } = null!; + public Guid RoleId { get; set; } + + public virtual Role Role { get; set; } = null!; +} \ No newline at end of file diff --git a/src/Imprink.Infrastructure/Configuration/Users/RoleConfiguration.cs b/src/Imprink.Infrastructure/Configuration/Users/RoleConfiguration.cs new file mode 100644 index 0000000..d1acb4b --- /dev/null +++ b/src/Imprink.Infrastructure/Configuration/Users/RoleConfiguration.cs @@ -0,0 +1,31 @@ +using Imprink.Domain.Entities.Users; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Imprink.Infrastructure.Configuration.Users; + +public class RoleConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(r => r.Id); + + builder.Property(r => r.Id) + .IsRequired() + .ValueGeneratedNever(); + + builder.Property(r => r.RoleName) + .IsRequired() + .HasMaxLength(50); + + builder.HasIndex(r => r.RoleName) + .IsUnique() + .HasDatabaseName("IX_Role_RoleName"); + + builder.HasData( + new Role { Id = Guid.Parse("11111111-1111-1111-1111-111111111111"), RoleName = "User" }, + new Role { Id = Guid.Parse("22222222-2222-2222-2222-222222222222"), RoleName = "Merchant" }, + new Role { Id = Guid.Parse("33333333-3333-3333-3333-333333333333"), RoleName = "Admin" } + ); + } +} \ No newline at end of file diff --git a/src/Imprink.Infrastructure/Configuration/Users/UserConfiguration.cs b/src/Imprink.Infrastructure/Configuration/Users/UserConfiguration.cs new file mode 100644 index 0000000..404f00d --- /dev/null +++ b/src/Imprink.Infrastructure/Configuration/Users/UserConfiguration.cs @@ -0,0 +1,65 @@ +using Imprink.Domain.Entities.Users; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Imprink.Infrastructure.Configuration.Users; + +public class UserConfiguration : EntityBaseConfiguration +{ + public override void Configure(EntityTypeBuilder builder) + { + base.Configure(builder); + + builder.Property(u => u.Id) + .HasMaxLength(450) + .ValueGeneratedNever(); + + builder.Property(u => u.Email) + .IsRequired() + .HasMaxLength(256); + + builder.Property(u => u.FirstName) + .IsRequired() + .HasMaxLength(100); + + builder.Property(u => u.LastName) + .IsRequired() + .HasMaxLength(100); + + builder.Property(u => u.PhoneNumber) + .HasMaxLength(20); + + builder.Property(u => u.DateOfBirth) + .HasColumnType("date"); + + builder.Property(u => u.IsActive) + .IsRequired() + .HasDefaultValue(true); + + builder.Property(u => u.LastLoginAt) + .HasColumnType("datetime2"); + + builder.HasIndex(u => u.Email) + .IsUnique() + .HasDatabaseName("IX_User_Email"); + + builder.HasIndex(u => u.IsActive) + .HasDatabaseName("IX_User_IsActive"); + + builder.HasMany(u => u.Addresses) + .WithOne() + .HasForeignKey(a => a.UserId) + .HasPrincipalKey(u => u.Id) + .OnDelete(DeleteBehavior.Cascade); + + builder.HasMany(u => u.UserRoles) + .WithOne() + .HasForeignKey(ur => ur.UserId) + .HasPrincipalKey(u => u.Id) + .OnDelete(DeleteBehavior.Cascade); + + builder.Ignore(u => u.FullName); + builder.Ignore(u => u.DefaultAddress); + builder.Ignore(u => u.Roles); + } +} \ No newline at end of file diff --git a/src/Imprink.Infrastructure/Configuration/Users/UserRoleConfiguration.cs b/src/Imprink.Infrastructure/Configuration/Users/UserRoleConfiguration.cs new file mode 100644 index 0000000..d68a698 --- /dev/null +++ b/src/Imprink.Infrastructure/Configuration/Users/UserRoleConfiguration.cs @@ -0,0 +1,31 @@ +using Imprink.Domain.Entities.Users; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Imprink.Infrastructure.Configuration.Users; + +public class UserRoleConfiguration : IEntityTypeConfiguration +{ + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(ur => new { ur.UserId, ur.RoleId }); + + builder.Property(ur => ur.UserId) + .IsRequired() + .HasMaxLength(450); + + builder.Property(ur => ur.RoleId) + .IsRequired(); + + builder.HasIndex(ur => ur.UserId) + .HasDatabaseName("IX_UserRole_UserId"); + + builder.HasIndex(ur => ur.RoleId) + .HasDatabaseName("IX_UserRole_RoleId"); + + builder.HasOne(ur => ur.Role) + .WithMany(r => r.UserRoles) + .HasForeignKey(ur => ur.RoleId) + .OnDelete(DeleteBehavior.Restrict); + } +} \ No newline at end of file diff --git a/src/Imprink.Infrastructure/Database/ApplicationDbContext.cs b/src/Imprink.Infrastructure/Database/ApplicationDbContext.cs index 06f06e2..e4e072e 100644 --- a/src/Imprink.Infrastructure/Database/ApplicationDbContext.cs +++ b/src/Imprink.Infrastructure/Database/ApplicationDbContext.cs @@ -35,5 +35,8 @@ public class ApplicationDbContext(DbContextOptions options modelBuilder.ApplyConfiguration(new OrderStatusConfiguration()); modelBuilder.ApplyConfiguration(new ShippingStatusConfiguration()); modelBuilder.ApplyConfiguration(new CategoryConfiguration()); + modelBuilder.ApplyConfiguration(new RoleConfiguration()); + modelBuilder.ApplyConfiguration(new UserConfiguration()); + modelBuilder.ApplyConfiguration(new UserRoleConfiguration()); } } \ No newline at end of file diff --git a/src/Imprink.Infrastructure/Migrations/20250606161235_AddUserRoles.Designer.cs b/src/Imprink.Infrastructure/Migrations/20250606161235_AddUserRoles.Designer.cs new file mode 100644 index 0000000..e1d71ca --- /dev/null +++ b/src/Imprink.Infrastructure/Migrations/20250606161235_AddUserRoles.Designer.cs @@ -0,0 +1,1023 @@ +// +using System; +using Imprink.Infrastructure.Database; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace Imprink.Infrastructure.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20250606161235_AddUserRoles")] + partial class AddUserRoles + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "9.0.5") + .HasAnnotation("Relational:MaxIdentifierLength", 128); + + SqlServerModelBuilderExtensions.UseIdentityColumns(modelBuilder); + + modelBuilder.Entity("Imprink.Domain.Entities.Orders.Order", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWID()"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("ModifiedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("GETUTCDATE()"); + + b.Property("ModifiedBy") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("Notes") + .IsRequired() + .HasMaxLength(1000) + .HasColumnType("nvarchar(1000)"); + + b.Property("OrderDate") + .HasColumnType("datetime2"); + + b.Property("OrderNumber") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("OrderStatusId") + .HasColumnType("int"); + + b.Property("ShippingStatusId") + .HasColumnType("int"); + + b.Property("TotalPrice") + .HasColumnType("decimal(18,2)"); + + b.Property("UserId") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedAt") + .HasDatabaseName("IX_Order_CreatedAt"); + + b.HasIndex("CreatedBy") + .HasDatabaseName("IX_Order_CreatedBy"); + + b.HasIndex("ModifiedAt") + .HasDatabaseName("IX_Order_ModifiedAt"); + + b.HasIndex("OrderDate") + .HasDatabaseName("IX_Order_OrderDate"); + + b.HasIndex("OrderNumber") + .IsUnique() + .HasDatabaseName("IX_Order_OrderNumber"); + + b.HasIndex("OrderStatusId") + .HasDatabaseName("IX_Order_OrderStatusId"); + + b.HasIndex("ShippingStatusId") + .HasDatabaseName("IX_Order_ShippingStatusId"); + + b.HasIndex("UserId") + .HasDatabaseName("IX_Order_UserId"); + + b.HasIndex("UserId", "OrderDate") + .HasDatabaseName("IX_Order_User_Date"); + + b.ToTable("Orders"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Orders.OrderAddress", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWID()"); + + b.Property("City") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Country") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("ModifiedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("GETUTCDATE()"); + + b.Property("ModifiedBy") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("OrderId") + .HasColumnType("uniqueidentifier"); + + b.Property("PostalCode") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("State") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Street") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedAt") + .HasDatabaseName("IX_OrderAddress_CreatedAt"); + + b.HasIndex("CreatedBy") + .HasDatabaseName("IX_OrderAddress_CreatedBy"); + + b.HasIndex("ModifiedAt") + .HasDatabaseName("IX_OrderAddress_ModifiedAt"); + + b.HasIndex("OrderId") + .IsUnique() + .HasDatabaseName("IX_OrderAddress_OrderId"); + + b.ToTable("OrderAddresses"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Orders.OrderItem", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWID()"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("CustomizationDescription") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.Property("CustomizationImageUrl") + .IsRequired() + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("ModifiedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("GETUTCDATE()"); + + b.Property("ModifiedBy") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("OrderId") + .HasColumnType("uniqueidentifier"); + + b.Property("ProductId") + .HasColumnType("uniqueidentifier"); + + b.Property("ProductVariantId") + .HasColumnType("uniqueidentifier"); + + b.Property("Quantity") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(1); + + b.Property("TotalPrice") + .HasColumnType("decimal(18,2)"); + + b.Property("UnitPrice") + .HasColumnType("decimal(18,2)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedAt") + .HasDatabaseName("IX_OrderItem_CreatedAt"); + + b.HasIndex("CreatedBy") + .HasDatabaseName("IX_OrderItem_CreatedBy"); + + b.HasIndex("ModifiedAt") + .HasDatabaseName("IX_OrderItem_ModifiedAt"); + + b.HasIndex("OrderId") + .HasDatabaseName("IX_OrderItem_OrderId"); + + b.HasIndex("ProductId") + .HasDatabaseName("IX_OrderItem_ProductId"); + + b.HasIndex("ProductVariantId") + .HasDatabaseName("IX_OrderItem_ProductVariantId"); + + b.HasIndex("OrderId", "ProductId") + .HasDatabaseName("IX_OrderItem_Order_Product"); + + b.ToTable("OrderItems"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Orders.OrderStatus", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("IX_OrderStatus_Name"); + + b.ToTable("OrderStatuses"); + + b.HasData( + new + { + Id = 0, + Name = "Pending" + }, + new + { + Id = 1, + Name = "Processing" + }, + new + { + Id = 2, + Name = "Completed" + }, + new + { + Id = 3, + Name = "Cancelled" + }); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Orders.ShippingStatus", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("Name") + .IsUnique() + .HasDatabaseName("IX_ShippingStatus_Name"); + + b.ToTable("ShippingStatuses"); + + b.HasData( + new + { + Id = 0, + Name = "Prepping" + }, + new + { + Id = 1, + Name = "Packaging" + }, + new + { + Id = 2, + Name = "Shipped" + }, + new + { + Id = 3, + Name = "Delivered" + }); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Product.Category", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWID()"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("Description") + .IsRequired() + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.Property("ImageUrl") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(true); + + b.Property("ModifiedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("GETUTCDATE()"); + + b.Property("ModifiedBy") + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("ParentCategoryId") + .HasColumnType("uniqueidentifier"); + + b.Property("SortOrder") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0); + + b.HasKey("Id"); + + b.HasIndex("CreatedAt") + .HasDatabaseName("IX_Category_CreatedAt"); + + b.HasIndex("CreatedBy") + .HasDatabaseName("IX_Category_CreatedBy"); + + b.HasIndex("IsActive") + .HasDatabaseName("IX_Category_IsActive"); + + b.HasIndex("ModifiedAt") + .HasDatabaseName("IX_Category_ModifiedAt"); + + b.HasIndex("Name") + .HasDatabaseName("IX_Category_Name"); + + b.HasIndex("ParentCategoryId") + .HasDatabaseName("IX_Category_ParentCategoryId"); + + b.HasIndex("IsActive", "SortOrder") + .HasDatabaseName("IX_Category_Active_SortOrder"); + + b.HasIndex("ParentCategoryId", "SortOrder") + .HasDatabaseName("IX_Category_Parent_SortOrder"); + + b.ToTable("Categories"); + + b.HasData( + new + { + Id = new Guid("11111111-1111-1111-1111-111111111111"), + CreatedAt = new DateTime(2025, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), + CreatedBy = "system@printbase.com", + Description = "Textile and fabric-based products", + IsActive = true, + ModifiedAt = new DateTime(2025, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), + ModifiedBy = "system@printbase.com", + Name = "Textile", + SortOrder = 1 + }, + new + { + Id = new Guid("22222222-2222-2222-2222-222222222222"), + CreatedAt = new DateTime(2025, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), + CreatedBy = "system@printbase.com", + Description = "Products for hard surface printing", + IsActive = true, + ModifiedAt = new DateTime(2025, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), + ModifiedBy = "system@printbase.com", + Name = "Hard Surfaces", + SortOrder = 2 + }, + new + { + Id = new Guid("33333333-3333-3333-3333-333333333333"), + CreatedAt = new DateTime(2025, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), + CreatedBy = "system@printbase.com", + Description = "Paper-based printing products", + IsActive = true, + ModifiedAt = new DateTime(2025, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), + ModifiedBy = "system@printbase.com", + Name = "Paper", + SortOrder = 3 + }); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Product.Product", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWID()"); + + b.Property("BasePrice") + .HasColumnType("decimal(18,2)"); + + b.Property("CategoryId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("Description") + .HasMaxLength(2000) + .HasColumnType("nvarchar(2000)"); + + b.Property("ImageUrl") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(true); + + b.Property("IsCustomizable") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("ModifiedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("GETUTCDATE()"); + + b.Property("ModifiedBy") + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("Id"); + + b.HasIndex("CategoryId") + .HasDatabaseName("IX_Product_CategoryId"); + + b.HasIndex("CreatedAt") + .HasDatabaseName("IX_Product_CreatedAt"); + + b.HasIndex("CreatedBy") + .HasDatabaseName("IX_Product_CreatedBy"); + + b.HasIndex("IsActive") + .HasDatabaseName("IX_Product_IsActive"); + + b.HasIndex("IsCustomizable") + .HasDatabaseName("IX_Product_IsCustomizable"); + + b.HasIndex("ModifiedAt") + .HasDatabaseName("IX_Product_ModifiedAt"); + + b.HasIndex("Name") + .HasDatabaseName("IX_Product_Name"); + + b.HasIndex("CategoryId", "IsActive") + .HasDatabaseName("IX_Product_Category_Active"); + + b.HasIndex("IsActive", "IsCustomizable") + .HasDatabaseName("IX_Product_Active_Customizable"); + + b.ToTable("Products"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Product.ProductVariant", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWID()"); + + b.Property("Color") + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("ImageUrl") + .HasMaxLength(500) + .HasColumnType("nvarchar(500)"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(true); + + b.Property("ModifiedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("GETUTCDATE()"); + + b.Property("ModifiedBy") + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("Price") + .HasColumnType("decimal(18,2)"); + + b.Property("ProductId") + .HasColumnType("uniqueidentifier"); + + b.Property("Size") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("Sku") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("StockQuantity") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasDefaultValue(0); + + b.HasKey("Id"); + + b.HasIndex("CreatedAt") + .HasDatabaseName("IX_ProductVariant_CreatedAt"); + + b.HasIndex("CreatedBy") + .HasDatabaseName("IX_ProductVariant_CreatedBy"); + + b.HasIndex("IsActive") + .HasDatabaseName("IX_ProductVariant_IsActive"); + + b.HasIndex("ModifiedAt") + .HasDatabaseName("IX_ProductVariant_ModifiedAt"); + + b.HasIndex("ProductId") + .HasDatabaseName("IX_ProductVariant_ProductId"); + + b.HasIndex("Sku") + .IsUnique() + .HasDatabaseName("IX_ProductVariant_SKU"); + + b.HasIndex("ProductId", "Size", "Color") + .IsUnique() + .HasDatabaseName("IX_ProductVariant_Product_Size_Color") + .HasFilter("[Color] IS NOT NULL"); + + b.ToTable("ProductVariants"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.Address", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("uniqueidentifier") + .HasDefaultValueSql("NEWID()"); + + b.Property("AddressType") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.Property("City") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Country") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(true); + + b.Property("IsDefault") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(false); + + b.Property("ModifiedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("GETUTCDATE()"); + + b.Property("ModifiedBy") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("PostalCode") + .IsRequired() + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.Property("State") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("Street") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("UserId") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedAt") + .HasDatabaseName("IX_Address_CreatedAt"); + + b.HasIndex("CreatedBy") + .HasDatabaseName("IX_Address_CreatedBy"); + + b.HasIndex("ModifiedAt") + .HasDatabaseName("IX_Address_ModifiedAt"); + + b.HasIndex("UserId") + .HasDatabaseName("IX_Address_UserId"); + + b.HasIndex("UserId", "AddressType") + .HasDatabaseName("IX_Address_User_Type"); + + b.HasIndex("UserId", "IsDefault") + .HasDatabaseName("IX_Address_User_Default"); + + b.ToTable("Addresses"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.Role", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("RoleName") + .IsUnique() + .HasDatabaseName("IX_Role_RoleName"); + + b.ToTable("Role"); + + b.HasData( + new + { + Id = new Guid("11111111-1111-1111-1111-111111111111"), + RoleName = "User" + }, + new + { + Id = new Guid("22222222-2222-2222-2222-222222222222"), + RoleName = "Merchant" + }, + new + { + Id = new Guid("33333333-3333-3333-3333-333333333333"), + RoleName = "Admin" + }); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.User", b => + { + b.Property("Id") + .HasMaxLength(450) + .HasColumnType("nvarchar(450)") + .HasDefaultValueSql("NEWID()"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("DateOfBirth") + .HasColumnType("date"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(true); + + b.Property("LastLoginAt") + .HasColumnType("datetime2"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ModifiedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("GETUTCDATE()"); + + b.Property("ModifiedBy") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("PhoneNumber") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedAt") + .HasDatabaseName("IX_User_CreatedAt"); + + b.HasIndex("CreatedBy") + .HasDatabaseName("IX_User_CreatedBy"); + + b.HasIndex("Email") + .IsUnique() + .HasDatabaseName("IX_User_Email"); + + b.HasIndex("IsActive") + .HasDatabaseName("IX_User_IsActive"); + + b.HasIndex("ModifiedAt") + .HasDatabaseName("IX_User_ModifiedAt"); + + b.ToTable("User"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.UserRole", b => + { + b.Property("UserId") + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId") + .HasDatabaseName("IX_UserRole_RoleId"); + + b.HasIndex("UserId") + .HasDatabaseName("IX_UserRole_UserId"); + + b.ToTable("UserRole"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Orders.Order", b => + { + b.HasOne("Imprink.Domain.Entities.Orders.OrderStatus", "OrderStatus") + .WithMany("Orders") + .HasForeignKey("OrderStatusId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Imprink.Domain.Entities.Orders.ShippingStatus", "ShippingStatus") + .WithMany("Orders") + .HasForeignKey("ShippingStatusId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("OrderStatus"); + + b.Navigation("ShippingStatus"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Orders.OrderAddress", b => + { + b.HasOne("Imprink.Domain.Entities.Orders.Order", "Order") + .WithOne("OrderAddress") + .HasForeignKey("Imprink.Domain.Entities.Orders.OrderAddress", "OrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Order"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Orders.OrderItem", b => + { + b.HasOne("Imprink.Domain.Entities.Orders.Order", "Order") + .WithMany("OrderItems") + .HasForeignKey("OrderId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("Imprink.Domain.Entities.Product.Product", "Product") + .WithMany("OrderItems") + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Imprink.Domain.Entities.Product.ProductVariant", "ProductVariant") + .WithMany("OrderItems") + .HasForeignKey("ProductVariantId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("Order"); + + b.Navigation("Product"); + + b.Navigation("ProductVariant"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Product.Category", b => + { + b.HasOne("Imprink.Domain.Entities.Product.Category", "ParentCategory") + .WithMany("SubCategories") + .HasForeignKey("ParentCategoryId") + .OnDelete(DeleteBehavior.Restrict); + + b.Navigation("ParentCategory"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Product.Product", b => + { + b.HasOne("Imprink.Domain.Entities.Product.Category", "Category") + .WithMany("Products") + .HasForeignKey("CategoryId") + .OnDelete(DeleteBehavior.SetNull); + + b.Navigation("Category"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Product.ProductVariant", b => + { + b.HasOne("Imprink.Domain.Entities.Product.Product", "Product") + .WithMany("ProductVariants") + .HasForeignKey("ProductId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Product"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.Address", b => + { + b.HasOne("Imprink.Domain.Entities.Users.User", null) + .WithMany("Addresses") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.UserRole", b => + { + b.HasOne("Imprink.Domain.Entities.Users.Role", "Role") + .WithMany("UserRoles") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Imprink.Domain.Entities.Users.User", null) + .WithMany("UserRoles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Orders.Order", b => + { + b.Navigation("OrderAddress") + .IsRequired(); + + b.Navigation("OrderItems"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Orders.OrderStatus", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Orders.ShippingStatus", b => + { + b.Navigation("Orders"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Product.Category", b => + { + b.Navigation("Products"); + + b.Navigation("SubCategories"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Product.Product", b => + { + b.Navigation("OrderItems"); + + b.Navigation("ProductVariants"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Product.ProductVariant", b => + { + b.Navigation("OrderItems"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.Role", b => + { + b.Navigation("UserRoles"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.User", b => + { + b.Navigation("Addresses"); + + b.Navigation("UserRoles"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Imprink.Infrastructure/Migrations/20250606161235_AddUserRoles.cs b/src/Imprink.Infrastructure/Migrations/20250606161235_AddUserRoles.cs new file mode 100644 index 0000000..04ab268 --- /dev/null +++ b/src/Imprink.Infrastructure/Migrations/20250606161235_AddUserRoles.cs @@ -0,0 +1,152 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional + +namespace Imprink.Infrastructure.Migrations +{ + /// + public partial class AddUserRoles : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Role", + columns: table => new + { + Id = table.Column(type: "uniqueidentifier", nullable: false), + RoleName = table.Column(type: "nvarchar(50)", maxLength: 50, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_Role", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "User", + columns: table => new + { + Id = table.Column(type: "nvarchar(450)", maxLength: 450, nullable: false, defaultValueSql: "NEWID()"), + Email = table.Column(type: "nvarchar(256)", maxLength: 256, nullable: false), + FirstName = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), + LastName = table.Column(type: "nvarchar(100)", maxLength: 100, nullable: false), + PhoneNumber = table.Column(type: "nvarchar(20)", maxLength: 20, nullable: true), + DateOfBirth = table.Column(type: "date", nullable: true), + IsActive = table.Column(type: "bit", nullable: false, defaultValue: true), + LastLoginAt = table.Column(type: "datetime2", nullable: true), + CreatedAt = table.Column(type: "datetime2", nullable: false), + ModifiedAt = table.Column(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()"), + CreatedBy = table.Column(type: "nvarchar(450)", maxLength: 450, nullable: false), + ModifiedBy = table.Column(type: "nvarchar(450)", maxLength: 450, nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_User", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "UserRole", + columns: table => new + { + UserId = table.Column(type: "nvarchar(450)", maxLength: 450, nullable: false), + RoleId = table.Column(type: "uniqueidentifier", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_UserRole", x => new { x.UserId, x.RoleId }); + table.ForeignKey( + name: "FK_UserRole_Role_RoleId", + column: x => x.RoleId, + principalTable: "Role", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_UserRole_User_UserId", + column: x => x.UserId, + principalTable: "User", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.InsertData( + table: "Role", + columns: new[] { "Id", "RoleName" }, + values: new object[,] + { + { new Guid("11111111-1111-1111-1111-111111111111"), "User" }, + { new Guid("22222222-2222-2222-2222-222222222222"), "Merchant" }, + { new Guid("33333333-3333-3333-3333-333333333333"), "Admin" } + }); + + migrationBuilder.CreateIndex( + name: "IX_Role_RoleName", + table: "Role", + column: "RoleName", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_User_CreatedAt", + table: "User", + column: "CreatedAt"); + + migrationBuilder.CreateIndex( + name: "IX_User_CreatedBy", + table: "User", + column: "CreatedBy"); + + migrationBuilder.CreateIndex( + name: "IX_User_Email", + table: "User", + column: "Email", + unique: true); + + migrationBuilder.CreateIndex( + name: "IX_User_IsActive", + table: "User", + column: "IsActive"); + + migrationBuilder.CreateIndex( + name: "IX_User_ModifiedAt", + table: "User", + column: "ModifiedAt"); + + migrationBuilder.CreateIndex( + name: "IX_UserRole_RoleId", + table: "UserRole", + column: "RoleId"); + + migrationBuilder.CreateIndex( + name: "IX_UserRole_UserId", + table: "UserRole", + column: "UserId"); + + migrationBuilder.AddForeignKey( + name: "FK_Addresses_User_UserId", + table: "Addresses", + column: "UserId", + principalTable: "User", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Addresses_User_UserId", + table: "Addresses"); + + migrationBuilder.DropTable( + name: "UserRole"); + + migrationBuilder.DropTable( + name: "Role"); + + migrationBuilder.DropTable( + name: "User"); + } + } +} diff --git a/src/Imprink.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs b/src/Imprink.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs index 15b77ed..ace5cdb 100644 --- a/src/Imprink.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/src/Imprink.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs @@ -721,6 +721,138 @@ namespace Imprink.Infrastructure.Migrations b.ToTable("Addresses"); }); + modelBuilder.Entity("Imprink.Domain.Entities.Users.Role", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("RoleName") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Id"); + + b.HasIndex("RoleName") + .IsUnique() + .HasDatabaseName("IX_Role_RoleName"); + + b.ToTable("Role"); + + b.HasData( + new + { + Id = new Guid("11111111-1111-1111-1111-111111111111"), + RoleName = "User" + }, + new + { + Id = new Guid("22222222-2222-2222-2222-222222222222"), + RoleName = "Merchant" + }, + new + { + Id = new Guid("33333333-3333-3333-3333-333333333333"), + RoleName = "Admin" + }); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.User", b => + { + b.Property("Id") + .HasMaxLength(450) + .HasColumnType("nvarchar(450)") + .HasDefaultValueSql("NEWID()"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreatedBy") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("DateOfBirth") + .HasColumnType("date"); + + b.Property("Email") + .IsRequired() + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("FirstName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("IsActive") + .ValueGeneratedOnAdd() + .HasColumnType("bit") + .HasDefaultValue(true); + + b.Property("LastLoginAt") + .HasColumnType("datetime2"); + + b.Property("LastName") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("ModifiedAt") + .ValueGeneratedOnAdd() + .HasColumnType("datetime2") + .HasDefaultValueSql("GETUTCDATE()"); + + b.Property("ModifiedBy") + .IsRequired() + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("PhoneNumber") + .HasMaxLength(20) + .HasColumnType("nvarchar(20)"); + + b.HasKey("Id"); + + b.HasIndex("CreatedAt") + .HasDatabaseName("IX_User_CreatedAt"); + + b.HasIndex("CreatedBy") + .HasDatabaseName("IX_User_CreatedBy"); + + b.HasIndex("Email") + .IsUnique() + .HasDatabaseName("IX_User_Email"); + + b.HasIndex("IsActive") + .HasDatabaseName("IX_User_IsActive"); + + b.HasIndex("ModifiedAt") + .HasDatabaseName("IX_User_ModifiedAt"); + + b.ToTable("User"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.UserRole", b => + { + b.Property("UserId") + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("uniqueidentifier"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId") + .HasDatabaseName("IX_UserRole_RoleId"); + + b.HasIndex("UserId") + .HasDatabaseName("IX_UserRole_UserId"); + + b.ToTable("UserRole"); + }); + modelBuilder.Entity("Imprink.Domain.Entities.Orders.Order", b => { b.HasOne("Imprink.Domain.Entities.Orders.OrderStatus", "OrderStatus") @@ -808,6 +940,32 @@ namespace Imprink.Infrastructure.Migrations b.Navigation("Product"); }); + modelBuilder.Entity("Imprink.Domain.Entities.Users.Address", b => + { + b.HasOne("Imprink.Domain.Entities.Users.User", null) + .WithMany("Addresses") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.UserRole", b => + { + b.HasOne("Imprink.Domain.Entities.Users.Role", "Role") + .WithMany("UserRoles") + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.HasOne("Imprink.Domain.Entities.Users.User", null) + .WithMany("UserRoles") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Role"); + }); + modelBuilder.Entity("Imprink.Domain.Entities.Orders.Order", b => { b.Navigation("OrderAddress") @@ -844,6 +1002,18 @@ namespace Imprink.Infrastructure.Migrations { b.Navigation("OrderItems"); }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.Role", b => + { + b.Navigation("UserRoles"); + }); + + modelBuilder.Entity("Imprink.Domain.Entities.Users.User", b => + { + b.Navigation("Addresses"); + + b.Navigation("UserRoles"); + }); #pragma warning restore 612, 618 } }