Repositories + some models
This commit is contained in:
12
src/Printbase.Domain/Common/Models/PagedResult.cs
Normal file
12
src/Printbase.Domain/Common/Models/PagedResult.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
namespace Printbase.Domain.Common.Models;
|
||||||
|
|
||||||
|
public class PagedResult<T>
|
||||||
|
{
|
||||||
|
public IEnumerable<T> Items { get; set; } = new List<T>();
|
||||||
|
public int TotalCount { get; set; }
|
||||||
|
public int PageNumber { get; set; }
|
||||||
|
public int PageSize { get; set; }
|
||||||
|
public int TotalPages => (int)Math.Ceiling((double)TotalCount / PageSize);
|
||||||
|
public bool HasPreviousPage => PageNumber > 1;
|
||||||
|
public bool HasNextPage => PageNumber < TotalPages;
|
||||||
|
}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
namespace Printbase.Domain.Common.Models;
|
||||||
|
|
||||||
|
public class ProductFilterParameters
|
||||||
|
{
|
||||||
|
public int PageNumber { get; set; } = 1;
|
||||||
|
public int PageSize { get; set; } = 10;
|
||||||
|
public string? SearchTerm { get; set; }
|
||||||
|
public Guid? CategoryId { get; set; }
|
||||||
|
public decimal? MinPrice { get; set; }
|
||||||
|
public decimal? MaxPrice { get; set; }
|
||||||
|
public bool? IsActive { get; set; } = true;
|
||||||
|
public bool? IsCustomizable { get; set; }
|
||||||
|
public string SortBy { get; set; } = "Name";
|
||||||
|
public string SortDirection { get; set; } = "ASC";
|
||||||
|
}
|
||||||
@@ -5,6 +5,6 @@ public abstract class EntityBase
|
|||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
public DateTime CreatedAt { get; set; }
|
public DateTime CreatedAt { get; set; }
|
||||||
public DateTime ModifiedAt { get; set; }
|
public DateTime ModifiedAt { get; set; }
|
||||||
public string CreatedBy { get; set; }
|
public string? CreatedBy { get; set; }
|
||||||
public string ModifiedBy { get; set; }
|
public string? ModifiedBy { get; set; }
|
||||||
}
|
}
|
||||||
@@ -2,16 +2,16 @@ namespace Printbase.Domain.Entities.Orders;
|
|||||||
|
|
||||||
public class Order : EntityBase
|
public class Order : EntityBase
|
||||||
{
|
{
|
||||||
public string UserId { get; set; }
|
public string UserId { get; set; } = null!;
|
||||||
public DateTime OrderDate { get; set; }
|
public DateTime OrderDate { get; set; }
|
||||||
public decimal TotalPrice { get; set; }
|
public decimal TotalPrice { get; set; }
|
||||||
public int OrderStatusId { get; set; }
|
public int OrderStatusId { get; set; }
|
||||||
public int ShippingStatusId { get; set; }
|
public int ShippingStatusId { get; set; }
|
||||||
public string OrderNumber { get; set; }
|
public string OrderNumber { get; set; } = null!;
|
||||||
public string Notes { get; set; }
|
public string Notes { get; set; } = null!;
|
||||||
|
|
||||||
public virtual OrderStatus OrderStatus { get; set; }
|
public OrderStatus OrderStatus { get; set; } = null!;
|
||||||
public virtual ShippingStatus ShippingStatus { get; set; }
|
public ShippingStatus ShippingStatus { get; set; } = null!;
|
||||||
public virtual OrderAddress OrderAddress { get; set; }
|
public OrderAddress OrderAddress { get; set; } = null!;
|
||||||
public virtual ICollection<OrderItem> OrderItems { get; set; } = new List<OrderItem>();
|
public virtual ICollection<OrderItem> OrderItems { get; set; } = new List<OrderItem>();
|
||||||
}
|
}
|
||||||
@@ -3,11 +3,11 @@ namespace Printbase.Domain.Entities.Orders;
|
|||||||
public class OrderAddress : EntityBase
|
public class OrderAddress : EntityBase
|
||||||
{
|
{
|
||||||
public Guid OrderId { get; set; }
|
public Guid OrderId { get; set; }
|
||||||
public string Street { get; set; }
|
public required string Street { get; set; }
|
||||||
public string City { get; set; }
|
public required string City { get; set; }
|
||||||
public string State { get; set; }
|
public required string State { get; set; }
|
||||||
public string PostalCode { get; set; }
|
public required string PostalCode { get; set; }
|
||||||
public string Country { get; set; }
|
public required string Country { get; set; }
|
||||||
|
|
||||||
public virtual Order Order { get; set; }
|
public virtual required Order Order { get; set; }
|
||||||
}
|
}
|
||||||
@@ -10,10 +10,10 @@ public class OrderItem : EntityBase
|
|||||||
public int Quantity { get; set; }
|
public int Quantity { get; set; }
|
||||||
public decimal UnitPrice { get; set; }
|
public decimal UnitPrice { get; set; }
|
||||||
public decimal TotalPrice { get; set; }
|
public decimal TotalPrice { get; set; }
|
||||||
public string CustomizationImageUrl { get; set; } = default!;
|
public string CustomizationImageUrl { get; set; } = null!;
|
||||||
public string CustomizationDescription { get; set; } = default!;
|
public string CustomizationDescription { get; set; } = null!;
|
||||||
|
|
||||||
public virtual Order Order { get; set; } = default!;
|
public Order Order { get; set; } = null!;
|
||||||
public virtual Product.Product Product { get; set; } = default!;
|
public Product.Product Product { get; set; } = null!;
|
||||||
public virtual ProductVariant ProductVariant { get; set; } = default!;
|
public ProductVariant ProductVariant { get; set; } = null!;
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@ namespace Printbase.Domain.Entities.Orders;
|
|||||||
public class OrderStatus
|
public class OrderStatus
|
||||||
{
|
{
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; } = null!;
|
||||||
|
|
||||||
public virtual ICollection<Order> Orders { get; set; } = new List<Order>();
|
public virtual ICollection<Order> Orders { get; set; } = new List<Order>();
|
||||||
}
|
}
|
||||||
@@ -3,7 +3,7 @@ namespace Printbase.Domain.Entities.Orders;
|
|||||||
public class ShippingStatus
|
public class ShippingStatus
|
||||||
{
|
{
|
||||||
public int Id { get; set; }
|
public int Id { get; set; }
|
||||||
public string Name { get; set; }
|
public string Name { get; set; } = null!;
|
||||||
|
|
||||||
public virtual ICollection<Order> Orders { get; set; } = new List<Order>();
|
public virtual ICollection<Order> Orders { get; set; } = new List<Order>();
|
||||||
}
|
}
|
||||||
@@ -2,14 +2,14 @@ namespace Printbase.Domain.Entities.Product;
|
|||||||
|
|
||||||
public class Category : EntityBase
|
public class Category : EntityBase
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public string Name { get; set; } = null!;
|
||||||
public string Description { get; set; }
|
public string Description { get; set; } = null!;
|
||||||
public string ImageUrl { get; set; }
|
public string? ImageUrl { get; set; }
|
||||||
public int SortOrder { get; set; }
|
public int SortOrder { get; set; }
|
||||||
public bool IsActive { get; set; }
|
public bool IsActive { get; set; }
|
||||||
public Guid? ParentCategoryId { get; set; }
|
public Guid? ParentCategoryId { get; set; }
|
||||||
|
|
||||||
public virtual Category ParentCategory { get; set; }
|
public virtual Category? ParentCategory { get; set; }
|
||||||
public virtual ICollection<Category> SubCategories { get; set; } = new List<Category>();
|
public virtual ICollection<Category> SubCategories { get; set; } = new List<Category>();
|
||||||
public virtual ICollection<Product> Products { get; set; } = new List<Product>();
|
public virtual ICollection<Product> Products { get; set; } = new List<Product>();
|
||||||
}
|
}
|
||||||
@@ -4,15 +4,15 @@ namespace Printbase.Domain.Entities.Product;
|
|||||||
|
|
||||||
public class Product : EntityBase
|
public class Product : EntityBase
|
||||||
{
|
{
|
||||||
public string Name { get; set; }
|
public required string Name { get; set; }
|
||||||
public string Description { get; set; }
|
public string? Description { get; set; }
|
||||||
public decimal BasePrice { get; set; }
|
public required decimal BasePrice { get; set; }
|
||||||
public bool IsCustomizable { get; set; }
|
public required bool IsCustomizable { get; set; }
|
||||||
public bool IsActive { get; set; }
|
public required bool IsActive { get; set; }
|
||||||
public string ImageUrl { get; set; }
|
public string? ImageUrl { get; set; }
|
||||||
public Guid? CategoryId { get; set; }
|
public Guid? CategoryId { get; set; }
|
||||||
|
|
||||||
public virtual Category Category { get; set; }
|
public virtual required Category Category { get; set; }
|
||||||
public virtual ICollection<ProductVariant> ProductVariants { get; set; } = new List<ProductVariant>();
|
public virtual ICollection<ProductVariant> ProductVariants { get; set; } = new List<ProductVariant>();
|
||||||
public virtual ICollection<OrderItem> OrderItems { get; set; } = new List<OrderItem>();
|
public virtual ICollection<OrderItem> OrderItems { get; set; } = new List<OrderItem>();
|
||||||
}
|
}
|
||||||
@@ -4,15 +4,15 @@ namespace Printbase.Domain.Entities.Product;
|
|||||||
|
|
||||||
public class ProductVariant : EntityBase
|
public class ProductVariant : EntityBase
|
||||||
{
|
{
|
||||||
public Guid ProductId { get; set; }
|
public required Guid ProductId { get; set; }
|
||||||
public string Size { get; set; }
|
public required string Size { get; set; }
|
||||||
public string Color { get; set; }
|
public string? Color { get; set; }
|
||||||
public decimal Price { get; set; }
|
public required decimal Price { get; set; }
|
||||||
public string ImageUrl { get; set; }
|
public string? ImageUrl { get; set; }
|
||||||
public string SKU { get; set; }
|
public required string Sku { get; set; }
|
||||||
public int StockQuantity { get; set; }
|
public int StockQuantity { get; set; }
|
||||||
public bool IsActive { get; set; }
|
public bool IsActive { get; set; }
|
||||||
|
|
||||||
public virtual Product Product { get; set; }
|
public virtual required Product Product { get; set; }
|
||||||
public virtual ICollection<OrderItem> OrderItems { get; set; } = new List<OrderItem>();
|
public virtual ICollection<OrderItem> OrderItems { get; set; } = new List<OrderItem>();
|
||||||
}
|
}
|
||||||
@@ -2,13 +2,13 @@ namespace Printbase.Domain.Entities.Users;
|
|||||||
|
|
||||||
public class Address : EntityBase
|
public class Address : EntityBase
|
||||||
{
|
{
|
||||||
public string UserId { get; set; }
|
public required string UserId { get; set; }
|
||||||
public string AddressType { get; set; }
|
public required string AddressType { get; set; }
|
||||||
public string Street { get; set; }
|
public required string Street { get; set; }
|
||||||
public string City { get; set; }
|
public required string City { get; set; }
|
||||||
public string State { get; set; }
|
public required string State { get; set; }
|
||||||
public string PostalCode { get; set; }
|
public required string PostalCode { get; set; }
|
||||||
public string Country { get; set; }
|
public required string Country { get; set; }
|
||||||
public bool IsDefault { get; set; }
|
public required bool IsDefault { get; set; }
|
||||||
public bool IsActive { get; set; }
|
public required bool IsActive { get; set; }
|
||||||
}
|
}
|
||||||
@@ -4,15 +4,13 @@ namespace Printbase.Domain.Entities.Users;
|
|||||||
|
|
||||||
public class ApplicationRole : IdentityRole
|
public class ApplicationRole : IdentityRole
|
||||||
{
|
{
|
||||||
public string Description { get; set; }
|
public string Description { get; set; } = null!;
|
||||||
public DateTime CreatedAt { get; set; }
|
public DateTime CreatedAt { get; set; }
|
||||||
public bool IsActive { get; set; }
|
public bool IsActive { get; set; }
|
||||||
|
|
||||||
public ApplicationRole() : base()
|
public ApplicationRole()
|
||||||
{
|
{}
|
||||||
}
|
|
||||||
|
|
||||||
public ApplicationRole(string roleName) : base(roleName)
|
public ApplicationRole(string roleName) : base(roleName)
|
||||||
{
|
{}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -5,13 +5,13 @@ namespace Printbase.Domain.Entities.Users;
|
|||||||
|
|
||||||
public sealed class ApplicationUser : IdentityUser
|
public sealed class ApplicationUser : IdentityUser
|
||||||
{
|
{
|
||||||
public string FirstName { get; set; }
|
public required string FirstName { get; set; }
|
||||||
public string LastName { get; set; }
|
public required string LastName { get; set; }
|
||||||
public DateTime? DateOfBirth { get; set; }
|
public DateTime? DateOfBirth { get; set; }
|
||||||
public DateTime CreatedAt { get; set; }
|
public DateTime CreatedAt { get; set; }
|
||||||
public DateTime LastLoginAt { get; set; }
|
public DateTime LastLoginAt { get; set; }
|
||||||
public bool IsActive { get; set; }
|
public bool IsActive { get; set; }
|
||||||
public string ProfileImageUrl { get; set; }
|
public string? ProfileImageUrl { get; set; }
|
||||||
|
|
||||||
public ICollection<Address> Addresses { get; set; } = new List<Address>();
|
public ICollection<Address> Addresses { get; set; } = new List<Address>();
|
||||||
public ICollection<Order> Orders { get; set; } = new List<Order>();
|
public ICollection<Order> Orders { get; set; } = new List<Order>();
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<Folder Include="Common\Enums\" />
|
||||||
<Folder Include="Exceptions\" />
|
<Folder Include="Exceptions\" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
|||||||
20
src/Printbase.Domain/Repositories/ICategoryRepository.cs
Normal file
20
src/Printbase.Domain/Repositories/ICategoryRepository.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using Printbase.Domain.Entities.Product;
|
||||||
|
|
||||||
|
namespace Printbase.Domain.Repositories;
|
||||||
|
|
||||||
|
public interface ICategoryRepository
|
||||||
|
{
|
||||||
|
Task<Category?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<Category?> GetByIdWithSubCategoriesAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<Category?> GetByIdWithProductsAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<IEnumerable<Category>> GetAllAsync(CancellationToken cancellationToken = default);
|
||||||
|
Task<IEnumerable<Category>> GetActiveAsync(CancellationToken cancellationToken = default);
|
||||||
|
Task<IEnumerable<Category>> GetRootCategoriesAsync(CancellationToken cancellationToken = default);
|
||||||
|
Task<IEnumerable<Category>> GetSubCategoriesAsync(Guid parentCategoryId, CancellationToken cancellationToken = default);
|
||||||
|
Task<Category> AddAsync(Category category, CancellationToken cancellationToken = default);
|
||||||
|
Task<Category> UpdateAsync(Category category, CancellationToken cancellationToken = default);
|
||||||
|
Task DeleteAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<bool> ExistsAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<bool> HasSubCategoriesAsync(Guid categoryId, CancellationToken cancellationToken = default);
|
||||||
|
Task<bool> HasProductsAsync(Guid categoryId, CancellationToken cancellationToken = default);
|
||||||
|
}
|
||||||
20
src/Printbase.Domain/Repositories/IProductRepository.cs
Normal file
20
src/Printbase.Domain/Repositories/IProductRepository.cs
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
using Printbase.Domain.Common;
|
||||||
|
using Printbase.Domain.Common.Models;
|
||||||
|
using Printbase.Domain.Entities.Product;
|
||||||
|
|
||||||
|
namespace Printbase.Domain.Repositories;
|
||||||
|
|
||||||
|
public interface IProductRepository
|
||||||
|
{
|
||||||
|
Task<Product?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<Product?> GetByIdWithVariantsAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<Product?> GetByIdWithCategoryAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<Product?> GetByIdFullAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<PagedResult<Product>> GetPagedAsync(ProductFilterParameters filterParameters, CancellationToken cancellationToken = default);
|
||||||
|
Task<IEnumerable<Product>> GetByCategoryAsync(Guid categoryId, CancellationToken cancellationToken = default);
|
||||||
|
Task<IEnumerable<Product>> GetCustomizableAsync(CancellationToken cancellationToken = default);
|
||||||
|
Task<Product> AddAsync(Product product, CancellationToken cancellationToken = default);
|
||||||
|
Task<Product> UpdateAsync(Product product, CancellationToken cancellationToken = default);
|
||||||
|
Task DeleteAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<bool> ExistsAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
}
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
using Printbase.Domain.Entities.Product;
|
||||||
|
|
||||||
|
namespace Printbase.Domain.Repositories;
|
||||||
|
|
||||||
|
public interface IProductVariantRepository
|
||||||
|
{
|
||||||
|
Task<ProductVariant?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<ProductVariant?> GetByIdWithProductAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<ProductVariant?> GetBySkuAsync(string sku, CancellationToken cancellationToken = default);
|
||||||
|
Task<IEnumerable<ProductVariant>> GetByProductIdAsync(Guid productId, CancellationToken cancellationToken = default);
|
||||||
|
Task<IEnumerable<ProductVariant>> GetActiveByProductIdAsync(Guid productId, CancellationToken cancellationToken = default);
|
||||||
|
Task<IEnumerable<ProductVariant>> GetInStockByProductIdAsync(Guid productId, CancellationToken cancellationToken = default);
|
||||||
|
Task<ProductVariant> AddAsync(ProductVariant productVariant, CancellationToken cancellationToken = default);
|
||||||
|
Task<ProductVariant> UpdateAsync(ProductVariant productVariant, CancellationToken cancellationToken = default);
|
||||||
|
Task DeleteAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<bool> ExistsAsync(Guid id, CancellationToken cancellationToken = default);
|
||||||
|
Task<bool> SkuExistsAsync(string sku, Guid? excludeId = null, CancellationToken cancellationToken = default);
|
||||||
|
Task UpdateStockQuantityAsync(Guid id, int quantity, CancellationToken cancellationToken = default);
|
||||||
|
}
|
||||||
@@ -26,7 +26,7 @@ public class ProductVariantConfiguration : EntityBaseConfiguration<ProductVarian
|
|||||||
builder.Property(pv => pv.ImageUrl)
|
builder.Property(pv => pv.ImageUrl)
|
||||||
.HasMaxLength(500);
|
.HasMaxLength(500);
|
||||||
|
|
||||||
builder.Property(pv => pv.SKU)
|
builder.Property(pv => pv.Sku)
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(100);
|
.HasMaxLength(100);
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ public class ProductVariantConfiguration : EntityBaseConfiguration<ProductVarian
|
|||||||
builder.HasIndex(pv => pv.ProductId)
|
builder.HasIndex(pv => pv.ProductId)
|
||||||
.HasDatabaseName("IX_ProductVariant_ProductId");
|
.HasDatabaseName("IX_ProductVariant_ProductId");
|
||||||
|
|
||||||
builder.HasIndex(pv => pv.SKU)
|
builder.HasIndex(pv => pv.Sku)
|
||||||
.IsUnique()
|
.IsUnique()
|
||||||
.HasDatabaseName("IX_ProductVariant_SKU");
|
.HasDatabaseName("IX_ProductVariant_SKU");
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ public class ApplicationDbContext(DbContextOptions<ApplicationDbContext> options
|
|||||||
public DbSet<Address> Addresses { get; set; }
|
public DbSet<Address> Addresses { get; set; }
|
||||||
public DbSet<OrderStatus> OrderStatuses { get; set; }
|
public DbSet<OrderStatus> OrderStatuses { get; set; }
|
||||||
public DbSet<ShippingStatus> ShippingStatuses { get; set; }
|
public DbSet<ShippingStatus> ShippingStatuses { get; set; }
|
||||||
|
public DbSet<Category> Categories { get; set; }
|
||||||
|
|
||||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||||
{
|
{
|
||||||
@@ -38,5 +39,6 @@ public class ApplicationDbContext(DbContextOptions<ApplicationDbContext> options
|
|||||||
modelBuilder.ApplyConfiguration(new AddressConfiguration());
|
modelBuilder.ApplyConfiguration(new AddressConfiguration());
|
||||||
modelBuilder.ApplyConfiguration(new OrderStatusConfiguration());
|
modelBuilder.ApplyConfiguration(new OrderStatusConfiguration());
|
||||||
modelBuilder.ApplyConfiguration(new ShippingStatusConfiguration());
|
modelBuilder.ApplyConfiguration(new ShippingStatusConfiguration());
|
||||||
|
modelBuilder.ApplyConfiguration(new CategoryConfiguration());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,777 +0,0 @@
|
|||||||
using System;
|
|
||||||
using Microsoft.EntityFrameworkCore.Migrations;
|
|
||||||
|
|
||||||
#nullable disable
|
|
||||||
|
|
||||||
#pragma warning disable CA1814 // Prefer jagged arrays over multidimensional
|
|
||||||
|
|
||||||
namespace Printbase.Infrastructure.Migrations
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
public partial class InitialSetup : Migration
|
|
||||||
{
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Up(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "AspNetRoles",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<string>(type: "nvarchar(450)", nullable: false),
|
|
||||||
Description = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: false),
|
|
||||||
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()"),
|
|
||||||
IsActive = table.Column<bool>(type: "bit", nullable: false, defaultValue: true),
|
|
||||||
Name = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
|
|
||||||
NormalizedName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
|
|
||||||
ConcurrencyStamp = table.Column<string>(type: "nvarchar(max)", nullable: true)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_AspNetRoles", x => x.Id);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "AspNetUsers",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<string>(type: "nvarchar(450)", nullable: false),
|
|
||||||
FirstName = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
|
|
||||||
LastName = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
|
|
||||||
DateOfBirth = table.Column<DateTime>(type: "datetime2", nullable: true),
|
|
||||||
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()"),
|
|
||||||
LastLoginAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()"),
|
|
||||||
IsActive = table.Column<bool>(type: "bit", nullable: false, defaultValue: true),
|
|
||||||
ProfileImageUrl = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: false),
|
|
||||||
UserName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
|
|
||||||
NormalizedUserName = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
|
|
||||||
Email = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
|
|
||||||
NormalizedEmail = table.Column<string>(type: "nvarchar(256)", maxLength: 256, nullable: true),
|
|
||||||
EmailConfirmed = table.Column<bool>(type: "bit", nullable: false),
|
|
||||||
PasswordHash = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
|
||||||
SecurityStamp = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
|
||||||
ConcurrencyStamp = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
|
||||||
PhoneNumber = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
|
||||||
PhoneNumberConfirmed = table.Column<bool>(type: "bit", nullable: false),
|
|
||||||
TwoFactorEnabled = table.Column<bool>(type: "bit", nullable: false),
|
|
||||||
LockoutEnd = table.Column<DateTimeOffset>(type: "datetimeoffset", nullable: true),
|
|
||||||
LockoutEnabled = table.Column<bool>(type: "bit", nullable: false),
|
|
||||||
AccessFailedCount = table.Column<int>(type: "int", nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_AspNetUsers", x => x.Id);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "Category",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
|
||||||
Name = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
|
||||||
Description = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
|
||||||
ImageUrl = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
|
||||||
SortOrder = table.Column<int>(type: "int", nullable: false),
|
|
||||||
IsActive = table.Column<bool>(type: "bit", nullable: false),
|
|
||||||
ParentCategoryId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
|
||||||
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
|
|
||||||
ModifiedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
|
|
||||||
CreatedBy = table.Column<string>(type: "nvarchar(max)", nullable: false),
|
|
||||||
ModifiedBy = table.Column<string>(type: "nvarchar(max)", nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_Category", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_Category_Category_ParentCategoryId",
|
|
||||||
column: x => x.ParentCategoryId,
|
|
||||||
principalTable: "Category",
|
|
||||||
principalColumn: "Id");
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "OrderStatuses",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(type: "int", nullable: false),
|
|
||||||
Name = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_OrderStatuses", x => x.Id);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ShippingStatuses",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(type: "int", nullable: false),
|
|
||||||
Name = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ShippingStatuses", x => x.Id);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "AspNetRoleClaims",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(type: "int", nullable: false)
|
|
||||||
.Annotation("SqlServer:Identity", "1, 1"),
|
|
||||||
RoleId = table.Column<string>(type: "nvarchar(450)", nullable: false),
|
|
||||||
ClaimType = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
|
||||||
ClaimValue = table.Column<string>(type: "nvarchar(max)", nullable: true)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_AspNetRoleClaims", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_AspNetRoleClaims_AspNetRoles_RoleId",
|
|
||||||
column: x => x.RoleId,
|
|
||||||
principalTable: "AspNetRoles",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "Addresses",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false, defaultValueSql: "NEWID()"),
|
|
||||||
UserId = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false),
|
|
||||||
AddressType = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
|
|
||||||
Street = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
|
||||||
City = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
|
|
||||||
State = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
|
|
||||||
PostalCode = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: false),
|
|
||||||
Country = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
|
|
||||||
IsDefault = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
|
|
||||||
IsActive = table.Column<bool>(type: "bit", nullable: false, defaultValue: true),
|
|
||||||
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
|
|
||||||
ModifiedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()"),
|
|
||||||
CreatedBy = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false),
|
|
||||||
ModifiedBy = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_Addresses", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_Addresses_AspNetUsers_UserId",
|
|
||||||
column: x => x.UserId,
|
|
||||||
principalTable: "AspNetUsers",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "AspNetUserClaims",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<int>(type: "int", nullable: false)
|
|
||||||
.Annotation("SqlServer:Identity", "1, 1"),
|
|
||||||
UserId = table.Column<string>(type: "nvarchar(450)", nullable: false),
|
|
||||||
ClaimType = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
|
||||||
ClaimValue = table.Column<string>(type: "nvarchar(max)", nullable: true)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_AspNetUserClaims", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_AspNetUserClaims_AspNetUsers_UserId",
|
|
||||||
column: x => x.UserId,
|
|
||||||
principalTable: "AspNetUsers",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "AspNetUserLogins",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
LoginProvider = table.Column<string>(type: "nvarchar(450)", nullable: false),
|
|
||||||
ProviderKey = table.Column<string>(type: "nvarchar(450)", nullable: false),
|
|
||||||
ProviderDisplayName = table.Column<string>(type: "nvarchar(max)", nullable: true),
|
|
||||||
UserId = table.Column<string>(type: "nvarchar(450)", nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_AspNetUserLogins", x => new { x.LoginProvider, x.ProviderKey });
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_AspNetUserLogins_AspNetUsers_UserId",
|
|
||||||
column: x => x.UserId,
|
|
||||||
principalTable: "AspNetUsers",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "AspNetUserRoles",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
UserId = table.Column<string>(type: "nvarchar(450)", nullable: false),
|
|
||||||
RoleId = table.Column<string>(type: "nvarchar(450)", nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_AspNetUserRoles", x => new { x.UserId, x.RoleId });
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_AspNetUserRoles_AspNetRoles_RoleId",
|
|
||||||
column: x => x.RoleId,
|
|
||||||
principalTable: "AspNetRoles",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_AspNetUserRoles_AspNetUsers_UserId",
|
|
||||||
column: x => x.UserId,
|
|
||||||
principalTable: "AspNetUsers",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "AspNetUserTokens",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
UserId = table.Column<string>(type: "nvarchar(450)", nullable: false),
|
|
||||||
LoginProvider = table.Column<string>(type: "nvarchar(450)", nullable: false),
|
|
||||||
Name = table.Column<string>(type: "nvarchar(450)", nullable: false),
|
|
||||||
Value = table.Column<string>(type: "nvarchar(max)", nullable: true)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_AspNetUserTokens", x => new { x.UserId, x.LoginProvider, x.Name });
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_AspNetUserTokens_AspNetUsers_UserId",
|
|
||||||
column: x => x.UserId,
|
|
||||||
principalTable: "AspNetUsers",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "Products",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false, defaultValueSql: "NEWID()"),
|
|
||||||
Name = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
|
||||||
Description = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: false),
|
|
||||||
BasePrice = table.Column<decimal>(type: "decimal(18,2)", nullable: false),
|
|
||||||
IsCustomizable = table.Column<bool>(type: "bit", nullable: false, defaultValue: false),
|
|
||||||
IsActive = table.Column<bool>(type: "bit", nullable: false, defaultValue: true),
|
|
||||||
ImageUrl = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: false),
|
|
||||||
CategoryId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
|
||||||
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
|
|
||||||
ModifiedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()"),
|
|
||||||
CreatedBy = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false),
|
|
||||||
ModifiedBy = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_Products", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_Products_Category_CategoryId",
|
|
||||||
column: x => x.CategoryId,
|
|
||||||
principalTable: "Category",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.SetNull);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "Orders",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false, defaultValueSql: "NEWID()"),
|
|
||||||
UserId = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false),
|
|
||||||
OrderDate = table.Column<DateTime>(type: "datetime2", nullable: false),
|
|
||||||
TotalPrice = table.Column<decimal>(type: "decimal(18,2)", nullable: false),
|
|
||||||
OrderStatusId = table.Column<int>(type: "int", nullable: false),
|
|
||||||
ShippingStatusId = table.Column<int>(type: "int", nullable: false),
|
|
||||||
OrderNumber = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
|
|
||||||
Notes = table.Column<string>(type: "nvarchar(1000)", maxLength: 1000, nullable: false),
|
|
||||||
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
|
|
||||||
ModifiedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()"),
|
|
||||||
CreatedBy = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false),
|
|
||||||
ModifiedBy = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_Orders", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_Orders_AspNetUsers_UserId",
|
|
||||||
column: x => x.UserId,
|
|
||||||
principalTable: "AspNetUsers",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Restrict);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_Orders_OrderStatuses_OrderStatusId",
|
|
||||||
column: x => x.OrderStatusId,
|
|
||||||
principalTable: "OrderStatuses",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Restrict);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_Orders_ShippingStatuses_ShippingStatusId",
|
|
||||||
column: x => x.ShippingStatusId,
|
|
||||||
principalTable: "ShippingStatuses",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Restrict);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "ProductVariants",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false, defaultValueSql: "NEWID()"),
|
|
||||||
ProductId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
|
||||||
Size = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
|
|
||||||
Color = table.Column<string>(type: "nvarchar(50)", maxLength: 50, nullable: false),
|
|
||||||
Price = table.Column<decimal>(type: "decimal(18,2)", nullable: false),
|
|
||||||
ImageUrl = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: false),
|
|
||||||
SKU = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
|
|
||||||
StockQuantity = table.Column<int>(type: "int", nullable: false, defaultValue: 0),
|
|
||||||
IsActive = table.Column<bool>(type: "bit", nullable: false, defaultValue: true),
|
|
||||||
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
|
|
||||||
ModifiedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()"),
|
|
||||||
CreatedBy = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false),
|
|
||||||
ModifiedBy = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_ProductVariants", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_ProductVariants_Products_ProductId",
|
|
||||||
column: x => x.ProductId,
|
|
||||||
principalTable: "Products",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "OrderAddresses",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false, defaultValueSql: "NEWID()"),
|
|
||||||
OrderId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
|
||||||
Street = table.Column<string>(type: "nvarchar(200)", maxLength: 200, nullable: false),
|
|
||||||
City = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
|
|
||||||
State = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
|
|
||||||
PostalCode = table.Column<string>(type: "nvarchar(20)", maxLength: 20, nullable: false),
|
|
||||||
Country = table.Column<string>(type: "nvarchar(100)", maxLength: 100, nullable: false),
|
|
||||||
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
|
|
||||||
ModifiedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()"),
|
|
||||||
CreatedBy = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false),
|
|
||||||
ModifiedBy = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_OrderAddresses", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_OrderAddresses_Orders_OrderId",
|
|
||||||
column: x => x.OrderId,
|
|
||||||
principalTable: "Orders",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateTable(
|
|
||||||
name: "OrderItems",
|
|
||||||
columns: table => new
|
|
||||||
{
|
|
||||||
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false, defaultValueSql: "NEWID()"),
|
|
||||||
OrderId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
|
||||||
ProductId = table.Column<Guid>(type: "uniqueidentifier", nullable: false),
|
|
||||||
ProductVariantId = table.Column<Guid>(type: "uniqueidentifier", nullable: true),
|
|
||||||
Quantity = table.Column<int>(type: "int", nullable: false, defaultValue: 1),
|
|
||||||
UnitPrice = table.Column<decimal>(type: "decimal(18,2)", nullable: false),
|
|
||||||
TotalPrice = table.Column<decimal>(type: "decimal(18,2)", nullable: false),
|
|
||||||
CustomizationImageUrl = table.Column<string>(type: "nvarchar(500)", maxLength: 500, nullable: false),
|
|
||||||
CustomizationDescription = table.Column<string>(type: "nvarchar(2000)", maxLength: 2000, nullable: false),
|
|
||||||
CreatedAt = table.Column<DateTime>(type: "datetime2", nullable: false),
|
|
||||||
ModifiedAt = table.Column<DateTime>(type: "datetime2", nullable: false, defaultValueSql: "GETUTCDATE()"),
|
|
||||||
CreatedBy = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false),
|
|
||||||
ModifiedBy = table.Column<string>(type: "nvarchar(450)", maxLength: 450, nullable: false)
|
|
||||||
},
|
|
||||||
constraints: table =>
|
|
||||||
{
|
|
||||||
table.PrimaryKey("PK_OrderItems", x => x.Id);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_OrderItems_Orders_OrderId",
|
|
||||||
column: x => x.OrderId,
|
|
||||||
principalTable: "Orders",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Cascade);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_OrderItems_ProductVariants_ProductVariantId",
|
|
||||||
column: x => x.ProductVariantId,
|
|
||||||
principalTable: "ProductVariants",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Restrict);
|
|
||||||
table.ForeignKey(
|
|
||||||
name: "FK_OrderItems_Products_ProductId",
|
|
||||||
column: x => x.ProductId,
|
|
||||||
principalTable: "Products",
|
|
||||||
principalColumn: "Id",
|
|
||||||
onDelete: ReferentialAction.Restrict);
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.InsertData(
|
|
||||||
table: "AspNetRoles",
|
|
||||||
columns: new[] { "Id", "ConcurrencyStamp", "CreatedAt", "Description", "IsActive", "Name", "NormalizedName" },
|
|
||||||
values: new object[,]
|
|
||||||
{
|
|
||||||
{ "1", null, new DateTime(2025, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), "Full system access", true, "Administrator", "ADMINISTRATOR" },
|
|
||||||
{ "2", null, new DateTime(2025, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), "Standard customer access", true, "Customer", "CUSTOMER" },
|
|
||||||
{ "3", null, new DateTime(2025, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), "Manage orders and fulfillment", true, "OrderManager", "ORDERMANAGER" },
|
|
||||||
{ "4", null, new DateTime(2025, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc), "Manage products and inventory", true, "ProductManager", "PRODUCTMANAGER" }
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.InsertData(
|
|
||||||
table: "OrderStatuses",
|
|
||||||
columns: new[] { "Id", "Name" },
|
|
||||||
values: new object[,]
|
|
||||||
{
|
|
||||||
{ 0, "Pending" },
|
|
||||||
{ 1, "Processing" },
|
|
||||||
{ 2, "Completed" },
|
|
||||||
{ 3, "Cancelled" }
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.InsertData(
|
|
||||||
table: "ShippingStatuses",
|
|
||||||
columns: new[] { "Id", "Name" },
|
|
||||||
values: new object[,]
|
|
||||||
{
|
|
||||||
{ 0, "Prepping" },
|
|
||||||
{ 1, "Packaging" },
|
|
||||||
{ 2, "Shipped" },
|
|
||||||
{ 3, "Delivered" }
|
|
||||||
});
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Address_CreatedAt",
|
|
||||||
table: "Addresses",
|
|
||||||
column: "CreatedAt");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Address_CreatedBy",
|
|
||||||
table: "Addresses",
|
|
||||||
column: "CreatedBy");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Address_ModifiedAt",
|
|
||||||
table: "Addresses",
|
|
||||||
column: "ModifiedAt");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Address_User_Default",
|
|
||||||
table: "Addresses",
|
|
||||||
columns: new[] { "UserId", "IsDefault" });
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Address_User_Type",
|
|
||||||
table: "Addresses",
|
|
||||||
columns: new[] { "UserId", "AddressType" });
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Address_UserId",
|
|
||||||
table: "Addresses",
|
|
||||||
column: "UserId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_AspNetRoleClaims_RoleId",
|
|
||||||
table: "AspNetRoleClaims",
|
|
||||||
column: "RoleId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ApplicationRole_IsActive",
|
|
||||||
table: "AspNetRoles",
|
|
||||||
column: "IsActive");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "RoleNameIndex",
|
|
||||||
table: "AspNetRoles",
|
|
||||||
column: "NormalizedName",
|
|
||||||
unique: true,
|
|
||||||
filter: "[NormalizedName] IS NOT NULL");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_AspNetUserClaims_UserId",
|
|
||||||
table: "AspNetUserClaims",
|
|
||||||
column: "UserId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_AspNetUserLogins_UserId",
|
|
||||||
table: "AspNetUserLogins",
|
|
||||||
column: "UserId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_AspNetUserRoles_RoleId",
|
|
||||||
table: "AspNetUserRoles",
|
|
||||||
column: "RoleId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "EmailIndex",
|
|
||||||
table: "AspNetUsers",
|
|
||||||
column: "NormalizedEmail");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "UserNameIndex",
|
|
||||||
table: "AspNetUsers",
|
|
||||||
column: "NormalizedUserName",
|
|
||||||
unique: true,
|
|
||||||
filter: "[NormalizedUserName] IS NOT NULL");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Category_ParentCategoryId",
|
|
||||||
table: "Category",
|
|
||||||
column: "ParentCategoryId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_OrderAddress_CreatedAt",
|
|
||||||
table: "OrderAddresses",
|
|
||||||
column: "CreatedAt");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_OrderAddress_CreatedBy",
|
|
||||||
table: "OrderAddresses",
|
|
||||||
column: "CreatedBy");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_OrderAddress_ModifiedAt",
|
|
||||||
table: "OrderAddresses",
|
|
||||||
column: "ModifiedAt");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_OrderAddress_OrderId",
|
|
||||||
table: "OrderAddresses",
|
|
||||||
column: "OrderId",
|
|
||||||
unique: true);
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_OrderItem_CreatedAt",
|
|
||||||
table: "OrderItems",
|
|
||||||
column: "CreatedAt");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_OrderItem_CreatedBy",
|
|
||||||
table: "OrderItems",
|
|
||||||
column: "CreatedBy");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_OrderItem_ModifiedAt",
|
|
||||||
table: "OrderItems",
|
|
||||||
column: "ModifiedAt");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_OrderItem_Order_Product",
|
|
||||||
table: "OrderItems",
|
|
||||||
columns: new[] { "OrderId", "ProductId" });
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_OrderItem_OrderId",
|
|
||||||
table: "OrderItems",
|
|
||||||
column: "OrderId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_OrderItem_ProductId",
|
|
||||||
table: "OrderItems",
|
|
||||||
column: "ProductId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_OrderItem_ProductVariantId",
|
|
||||||
table: "OrderItems",
|
|
||||||
column: "ProductVariantId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Order_CreatedAt",
|
|
||||||
table: "Orders",
|
|
||||||
column: "CreatedAt");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Order_CreatedBy",
|
|
||||||
table: "Orders",
|
|
||||||
column: "CreatedBy");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Order_ModifiedAt",
|
|
||||||
table: "Orders",
|
|
||||||
column: "ModifiedAt");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Order_OrderDate",
|
|
||||||
table: "Orders",
|
|
||||||
column: "OrderDate");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Order_OrderNumber",
|
|
||||||
table: "Orders",
|
|
||||||
column: "OrderNumber",
|
|
||||||
unique: true);
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Order_OrderStatusId",
|
|
||||||
table: "Orders",
|
|
||||||
column: "OrderStatusId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Order_ShippingStatusId",
|
|
||||||
table: "Orders",
|
|
||||||
column: "ShippingStatusId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Order_User_Date",
|
|
||||||
table: "Orders",
|
|
||||||
columns: new[] { "UserId", "OrderDate" });
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Order_UserId",
|
|
||||||
table: "Orders",
|
|
||||||
column: "UserId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_OrderStatus_Name",
|
|
||||||
table: "OrderStatuses",
|
|
||||||
column: "Name",
|
|
||||||
unique: true);
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Product_Active_Customizable",
|
|
||||||
table: "Products",
|
|
||||||
columns: new[] { "IsActive", "IsCustomizable" });
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Product_Category_Active",
|
|
||||||
table: "Products",
|
|
||||||
columns: new[] { "CategoryId", "IsActive" });
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Product_CategoryId",
|
|
||||||
table: "Products",
|
|
||||||
column: "CategoryId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Product_CreatedAt",
|
|
||||||
table: "Products",
|
|
||||||
column: "CreatedAt");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Product_CreatedBy",
|
|
||||||
table: "Products",
|
|
||||||
column: "CreatedBy");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Product_IsActive",
|
|
||||||
table: "Products",
|
|
||||||
column: "IsActive");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Product_IsCustomizable",
|
|
||||||
table: "Products",
|
|
||||||
column: "IsCustomizable");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Product_ModifiedAt",
|
|
||||||
table: "Products",
|
|
||||||
column: "ModifiedAt");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_Product_Name",
|
|
||||||
table: "Products",
|
|
||||||
column: "Name");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ProductVariant_CreatedAt",
|
|
||||||
table: "ProductVariants",
|
|
||||||
column: "CreatedAt");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ProductVariant_CreatedBy",
|
|
||||||
table: "ProductVariants",
|
|
||||||
column: "CreatedBy");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ProductVariant_IsActive",
|
|
||||||
table: "ProductVariants",
|
|
||||||
column: "IsActive");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ProductVariant_ModifiedAt",
|
|
||||||
table: "ProductVariants",
|
|
||||||
column: "ModifiedAt");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ProductVariant_Product_Size_Color",
|
|
||||||
table: "ProductVariants",
|
|
||||||
columns: new[] { "ProductId", "Size", "Color" },
|
|
||||||
unique: true);
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ProductVariant_ProductId",
|
|
||||||
table: "ProductVariants",
|
|
||||||
column: "ProductId");
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ProductVariant_SKU",
|
|
||||||
table: "ProductVariants",
|
|
||||||
column: "SKU",
|
|
||||||
unique: true);
|
|
||||||
|
|
||||||
migrationBuilder.CreateIndex(
|
|
||||||
name: "IX_ShippingStatus_Name",
|
|
||||||
table: "ShippingStatuses",
|
|
||||||
column: "Name",
|
|
||||||
unique: true);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
protected override void Down(MigrationBuilder migrationBuilder)
|
|
||||||
{
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "Addresses");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "AspNetRoleClaims");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "AspNetUserClaims");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "AspNetUserLogins");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "AspNetUserRoles");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "AspNetUserTokens");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "OrderAddresses");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "OrderItems");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "AspNetRoles");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "Orders");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ProductVariants");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "AspNetUsers");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "OrderStatuses");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "ShippingStatuses");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "Products");
|
|
||||||
|
|
||||||
migrationBuilder.DropTable(
|
|
||||||
name: "Category");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -22,4 +22,8 @@
|
|||||||
<ProjectReference Include="..\Printbase.Domain\Printbase.Domain.csproj" />
|
<ProjectReference Include="..\Printbase.Domain\Printbase.Domain.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Folder Include="Migrations\" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
111
src/Printbase.Infrastructure/Repositories/CategoryRepository.cs
Normal file
111
src/Printbase.Infrastructure/Repositories/CategoryRepository.cs
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Printbase.Domain.Entities.Product;
|
||||||
|
using Printbase.Domain.Repositories;
|
||||||
|
using Printbase.Infrastructure.Database;
|
||||||
|
|
||||||
|
namespace Printbase.Infrastructure.Repositories;
|
||||||
|
|
||||||
|
public class CategoryRepository(ApplicationDbContext context) : ICategoryRepository
|
||||||
|
{
|
||||||
|
public async Task<Category?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Categories
|
||||||
|
.FirstOrDefaultAsync(c => c.Id == id, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<Category?> GetByIdWithSubCategoriesAsync(Guid id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Categories
|
||||||
|
.Include(c => c.SubCategories.Where(sc => sc.IsActive))
|
||||||
|
.FirstOrDefaultAsync(c => c.Id == id, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<Category?> GetByIdWithProductsAsync(Guid id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Categories
|
||||||
|
.Include(c => c.Products.Where(p => p.IsActive))
|
||||||
|
.FirstOrDefaultAsync(c => c.Id == id, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<Category>> GetAllAsync(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Categories
|
||||||
|
.OrderBy(c => c.SortOrder)
|
||||||
|
.ThenBy(c => c.Name)
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<Category>> GetActiveAsync(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Categories
|
||||||
|
.Where(c => c.IsActive)
|
||||||
|
.OrderBy(c => c.SortOrder)
|
||||||
|
.ThenBy(c => c.Name)
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<Category>> GetRootCategoriesAsync(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Categories
|
||||||
|
.Where(c => c.ParentCategoryId == null && c.IsActive)
|
||||||
|
.OrderBy(c => c.SortOrder)
|
||||||
|
.ThenBy(c => c.Name)
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<Category>> GetSubCategoriesAsync(Guid parentCategoryId, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Categories
|
||||||
|
.Where(c => c.ParentCategoryId == parentCategoryId && c.IsActive)
|
||||||
|
.OrderBy(c => c.SortOrder)
|
||||||
|
.ThenBy(c => c.Name)
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<Category> AddAsync(Category category, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
category.Id = Guid.NewGuid();
|
||||||
|
category.CreatedAt = DateTime.UtcNow;
|
||||||
|
category.ModifiedAt = DateTime.UtcNow;
|
||||||
|
|
||||||
|
context.Categories.Add(category);
|
||||||
|
await context.SaveChangesAsync(cancellationToken);
|
||||||
|
return category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<Category> UpdateAsync(Category category, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
category.ModifiedAt = DateTime.UtcNow;
|
||||||
|
context.Categories.Update(category);
|
||||||
|
await context.SaveChangesAsync(cancellationToken);
|
||||||
|
return category;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DeleteAsync(Guid id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var category = await GetByIdAsync(id, cancellationToken);
|
||||||
|
if (category != null)
|
||||||
|
{
|
||||||
|
context.Categories.Remove(category);
|
||||||
|
await context.SaveChangesAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> ExistsAsync(Guid id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Categories
|
||||||
|
.AnyAsync(c => c.Id == id, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> HasSubCategoriesAsync(Guid categoryId, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Categories
|
||||||
|
.AnyAsync(c => c.ParentCategoryId == categoryId, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> HasProductsAsync(Guid categoryId, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Products
|
||||||
|
.AnyAsync(p => p.CategoryId == categoryId, cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
155
src/Printbase.Infrastructure/Repositories/ProductRepository.cs
Normal file
155
src/Printbase.Infrastructure/Repositories/ProductRepository.cs
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Printbase.Domain.Common.Models;
|
||||||
|
using Printbase.Domain.Entities.Product;
|
||||||
|
using Printbase.Domain.Repositories;
|
||||||
|
using Printbase.Infrastructure.Database;
|
||||||
|
|
||||||
|
namespace Printbase.Infrastructure.Repositories;
|
||||||
|
|
||||||
|
public class ProductRepository(ApplicationDbContext context) : IProductRepository
|
||||||
|
{
|
||||||
|
public async Task<Product?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Products
|
||||||
|
.FirstOrDefaultAsync(p => p.Id == id, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<Product?> GetByIdWithVariantsAsync(Guid id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Products
|
||||||
|
.Include(p => p.ProductVariants.Where(pv => pv.IsActive))
|
||||||
|
.FirstOrDefaultAsync(p => p.Id == id, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<Product?> GetByIdWithCategoryAsync(Guid id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Products
|
||||||
|
.Include(p => p.Category)
|
||||||
|
.FirstOrDefaultAsync(p => p.Id == id, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<Product?> GetByIdFullAsync(Guid id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Products
|
||||||
|
.Include(p => p.Category)
|
||||||
|
.Include(p => p.ProductVariants.Where(pv => pv.IsActive))
|
||||||
|
.FirstOrDefaultAsync(p => p.Id == id, cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<PagedResult<Product>> GetPagedAsync(ProductFilterParameters filterParameters, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var query = context.Products
|
||||||
|
.Include(p => p.Category)
|
||||||
|
.AsQueryable();
|
||||||
|
|
||||||
|
if (filterParameters.IsActive.HasValue)
|
||||||
|
{
|
||||||
|
query = query.Where(p => p.IsActive == filterParameters.IsActive.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!string.IsNullOrEmpty(filterParameters.SearchTerm))
|
||||||
|
{
|
||||||
|
query = query.Where(p => p.Name.Contains(filterParameters.SearchTerm) ||
|
||||||
|
(p.Description != null && p.Description.Contains(filterParameters.SearchTerm)));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterParameters.CategoryId.HasValue)
|
||||||
|
{
|
||||||
|
query = query.Where(p => p.CategoryId == filterParameters.CategoryId.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterParameters.MinPrice.HasValue)
|
||||||
|
{
|
||||||
|
query = query.Where(p => p.BasePrice >= filterParameters.MinPrice.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterParameters.MaxPrice.HasValue)
|
||||||
|
{
|
||||||
|
query = query.Where(p => p.BasePrice <= filterParameters.MaxPrice.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (filterParameters.IsCustomizable.HasValue)
|
||||||
|
{
|
||||||
|
query = query.Where(p => p.IsCustomizable == filterParameters.IsCustomizable.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
query = filterParameters.SortBy.ToLower() switch
|
||||||
|
{
|
||||||
|
"price" => filterParameters.SortDirection.ToUpper() == "DESC"
|
||||||
|
? query.OrderByDescending(p => p.BasePrice)
|
||||||
|
: query.OrderBy(p => p.BasePrice),
|
||||||
|
"name" => filterParameters.SortDirection.ToUpper() == "DESC"
|
||||||
|
? query.OrderByDescending(p => p.Name)
|
||||||
|
: query.OrderBy(p => p.Name),
|
||||||
|
_ => query.OrderBy(p => p.Name)
|
||||||
|
};
|
||||||
|
|
||||||
|
var totalCount = await query.CountAsync(cancellationToken);
|
||||||
|
|
||||||
|
var items = await query
|
||||||
|
.Skip((filterParameters.PageNumber - 1) * filterParameters.PageSize)
|
||||||
|
.Take(filterParameters.PageSize)
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
|
||||||
|
return new PagedResult<Product>
|
||||||
|
{
|
||||||
|
Items = items,
|
||||||
|
TotalCount = totalCount,
|
||||||
|
PageNumber = filterParameters.PageNumber,
|
||||||
|
PageSize = filterParameters.PageSize
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<Product>> GetByCategoryAsync(Guid categoryId, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Products
|
||||||
|
.Include(p => p.Category)
|
||||||
|
.Where(p => p.CategoryId == categoryId && p.IsActive)
|
||||||
|
.OrderBy(p => p.Name)
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<IEnumerable<Product>> GetCustomizableAsync(CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Products
|
||||||
|
.Include(p => p.Category)
|
||||||
|
.Where(p => p.IsCustomizable && p.IsActive)
|
||||||
|
.OrderBy(p => p.Name)
|
||||||
|
.ToListAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<Product> AddAsync(Product product, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
product.Id = Guid.NewGuid();
|
||||||
|
product.CreatedAt = DateTime.UtcNow;
|
||||||
|
product.ModifiedAt = DateTime.UtcNow;
|
||||||
|
|
||||||
|
context.Products.Add(product);
|
||||||
|
await context.SaveChangesAsync(cancellationToken);
|
||||||
|
return product;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<Product> UpdateAsync(Product product, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
product.ModifiedAt = DateTime.UtcNow;
|
||||||
|
context.Products.Update(product);
|
||||||
|
await context.SaveChangesAsync(cancellationToken);
|
||||||
|
return product;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task DeleteAsync(Guid id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var product = await GetByIdAsync(id, cancellationToken);
|
||||||
|
if (product != null)
|
||||||
|
{
|
||||||
|
context.Products.Remove(product);
|
||||||
|
await context.SaveChangesAsync(cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<bool> ExistsAsync(Guid id, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
return await context.Products
|
||||||
|
.AnyAsync(p => p.Id == id, cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user