diff --git a/src/Imprink.Domain/Entities/Orders/Order.cs b/src/Imprink.Domain/Entities/Orders/Order.cs index b9b0c4c..629b623 100644 --- a/src/Imprink.Domain/Entities/Orders/Order.cs +++ b/src/Imprink.Domain/Entities/Orders/Order.cs @@ -1,3 +1,5 @@ +using Imprink.Domain.Entities.Users; + namespace Imprink.Domain.Entities.Orders; public class Order : EntityBase @@ -11,6 +13,7 @@ public class Order : EntityBase public string Notes { get; set; } = null!; public OrderStatus OrderStatus { get; set; } = null!; + public User User { get; set; } = null!; public ShippingStatus ShippingStatus { get; set; } = null!; public OrderAddress OrderAddress { get; set; } = null!; public virtual ICollection OrderItems { get; set; } = new List(); diff --git a/src/Imprink.Domain/Entities/Users/User.cs b/src/Imprink.Domain/Entities/Users/User.cs index 00cd877..3e5eb31 100644 --- a/src/Imprink.Domain/Entities/Users/User.cs +++ b/src/Imprink.Domain/Entities/Users/User.cs @@ -1,3 +1,5 @@ +using Imprink.Domain.Entities.Orders; + namespace Imprink.Domain.Entities.Users; public class User : EntityBase @@ -13,6 +15,7 @@ public class User : EntityBase public virtual ICollection
Addresses { get; set; } = new List
(); public virtual ICollection UserRoles { get; set; } = new List(); + public virtual ICollection Orders { get; set; } = new List(); public string FullName => $"{FirstName} {LastName}"; public Address? DefaultAddress => Addresses.FirstOrDefault(a => a.IsDefault && a.IsActive); diff --git a/src/Imprink.Domain/Imprink.Domain.csproj b/src/Imprink.Domain/Imprink.Domain.csproj index da1134f..17f66ee 100644 --- a/src/Imprink.Domain/Imprink.Domain.csproj +++ b/src/Imprink.Domain/Imprink.Domain.csproj @@ -7,7 +7,6 @@ - diff --git a/src/Imprink.Infrastructure/Configuration/Orders/OrderConfiguration.cs b/src/Imprink.Infrastructure/Configuration/Orders/OrderConfiguration.cs index 8380191..cb6af3d 100644 --- a/src/Imprink.Infrastructure/Configuration/Orders/OrderConfiguration.cs +++ b/src/Imprink.Infrastructure/Configuration/Orders/OrderConfiguration.cs @@ -49,6 +49,12 @@ public class OrderConfiguration : EntityBaseConfiguration .WithOne(oa => oa.Order) .HasForeignKey(oa => oa.OrderId) .OnDelete(DeleteBehavior.Cascade); + + builder.HasOne(o => o.User) + .WithMany(u => u.Orders) + .HasForeignKey(o => o.UserId) + .HasPrincipalKey(u => u.Id) + .OnDelete(DeleteBehavior.Restrict); builder.HasIndex(o => o.UserId) .HasDatabaseName("IX_Order_UserId"); diff --git a/src/Imprink.Infrastructure/Migrations/20250606162608_RelateUsersAndOrders.Designer.cs b/src/Imprink.Infrastructure/Migrations/20250606162608_RelateUsersAndOrders.Designer.cs new file mode 100644 index 0000000..beadbed --- /dev/null +++ b/src/Imprink.Infrastructure/Migrations/20250606162608_RelateUsersAndOrders.Designer.cs @@ -0,0 +1,1033 @@ +// +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("20250606162608_RelateUsersAndOrders")] + partial class RelateUsersAndOrders + { + /// + 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.HasOne("Imprink.Domain.Entities.Users.User", "User") + .WithMany("Orders") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + + b.Navigation("OrderStatus"); + + b.Navigation("ShippingStatus"); + + b.Navigation("User"); + }); + + 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("Orders"); + + b.Navigation("UserRoles"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/src/Imprink.Infrastructure/Migrations/20250606162608_RelateUsersAndOrders.cs b/src/Imprink.Infrastructure/Migrations/20250606162608_RelateUsersAndOrders.cs new file mode 100644 index 0000000..5ebedd2 --- /dev/null +++ b/src/Imprink.Infrastructure/Migrations/20250606162608_RelateUsersAndOrders.cs @@ -0,0 +1,30 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace Imprink.Infrastructure.Migrations +{ + /// + public partial class RelateUsersAndOrders : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddForeignKey( + name: "FK_Orders_User_UserId", + table: "Orders", + column: "UserId", + principalTable: "User", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Orders_User_UserId", + table: "Orders"); + } + } +} diff --git a/src/Imprink.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs b/src/Imprink.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs index ace5cdb..b88b787 100644 --- a/src/Imprink.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/src/Imprink.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs @@ -867,9 +867,17 @@ namespace Imprink.Infrastructure.Migrations .OnDelete(DeleteBehavior.Restrict) .IsRequired(); + b.HasOne("Imprink.Domain.Entities.Users.User", "User") + .WithMany("Orders") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Restrict) + .IsRequired(); + b.Navigation("OrderStatus"); b.Navigation("ShippingStatus"); + + b.Navigation("User"); }); modelBuilder.Entity("Imprink.Domain.Entities.Orders.OrderAddress", b => @@ -1012,6 +1020,8 @@ namespace Imprink.Infrastructure.Migrations { b.Navigation("Addresses"); + b.Navigation("Orders"); + b.Navigation("UserRoles"); }); #pragma warning restore 612, 618