From 3858375b66d4575386fdeb15a43be56d2dce6bef Mon Sep 17 00:00:00 2001 From: "Tizian.Breuch" Date: Thu, 31 Jul 2025 16:37:35 +0200 Subject: [PATCH] order --- .../Controllers/Customers/OrdersController.cs | 67 +- Webshop.Api/Program.cs | 5 +- .../Customers/Interfaces/IOrderService.cs | 15 +- .../Services/Customers/OrderService.cs | 207 ++- .../Interfaces/IShippingMethodRepository.cs | 11 +- .../20250731131435_addCategory.Designer.cs | 1239 ----------------- .../Migrations/20250731131435_addCategory.cs | 832 ----------- .../ApplicationDbContextModelSnapshot.cs | 1236 ---------------- .../Repositories/ShippingMethodRepository.cs | 27 +- 9 files changed, 290 insertions(+), 3349 deletions(-) delete mode 100644 Webshop.Infrastructure/Migrations/20250731131435_addCategory.Designer.cs delete mode 100644 Webshop.Infrastructure/Migrations/20250731131435_addCategory.cs delete mode 100644 Webshop.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs diff --git a/Webshop.Api/Controllers/Customers/OrdersController.cs b/Webshop.Api/Controllers/Customers/OrdersController.cs index 26a0cf3..6fe8761 100644 --- a/Webshop.Api/Controllers/Customers/OrdersController.cs +++ b/Webshop.Api/Controllers/Customers/OrdersController.cs @@ -1,22 +1,71 @@ -// Auto-generiert von CreateWebshopFiles.ps1 -using Microsoft.AspNetCore.Mvc; +// src/Webshop.Api/Controllers/Customer/OrdersController.cs using Microsoft.AspNetCore.Authorization; - +using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; +using System.Security.Claims; using System.Threading.Tasks; +using Webshop.Application.DTOs.Orders; +using Webshop.Application.Services.Customers; +using Webshop.Application.Services.Customers.Interfaces; // Für IOrderService -namespace Webshop.Api.Controllers.Customers +namespace Webshop.Api.Controllers.Customer { [ApiController] - [Route("api/v1/customer/[controller]")] + [Route("api/v1/customer/orders")] [Authorize(Roles = "Customer")] public class OrdersController : ControllerBase { - [HttpGet("my-orders")] - public async Task GetMyOrders() + private readonly IOrderService _orderService; + + public OrdersController(IOrderService orderService) { - return Ok(new { Message = "Dies ist Ihr persönlicher Bestellverlauf (Platzhalter)." }); + _orderService = orderService; + } + + [HttpPost] + public async Task CreateOrder([FromBody] CreateOrderDto orderDto) + { + if (!ModelState.IsValid) return BadRequest(ModelState); + + var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); + if (string.IsNullOrEmpty(userId)) + { + // In einer [Authorize]-Methode sollte das nie passieren, aber zur Sicherheit + return Unauthorized(); + } + + var (success, createdOrder, errorMessage) = await _orderService.CreateOrderAsync(orderDto, userId); + + if (!success) + { + return BadRequest(new { Message = errorMessage }); + } + + // Hier wird GetMyOrderById referenziert, also erstellen wir eine leere Methode dafür + return CreatedAtAction(nameof(GetMyOrderById), new { id = createdOrder.Id }, createdOrder); + } + + [HttpGet] + public async Task>> GetMyOrders() + { + var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); + if (string.IsNullOrEmpty(userId)) return Unauthorized(); + + var orders = await _orderService.GetMyOrdersAsync(userId); + return Ok(orders); + } + + [HttpGet("{id}")] + public async Task> GetMyOrderById(Guid id) + { + var userId = User.FindFirstValue(ClaimTypes.NameIdentifier); + if (string.IsNullOrEmpty(userId)) return Unauthorized(); + + var order = await _orderService.GetMyOrderByIdAsync(id, userId); + if (order == null) return NotFound(); + + return Ok(order); } } -} +} \ No newline at end of file diff --git a/Webshop.Api/Program.cs b/Webshop.Api/Program.cs index aafc681..5a6f74c 100644 --- a/Webshop.Api/Program.cs +++ b/Webshop.Api/Program.cs @@ -83,6 +83,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); +builder.Services.AddScoped(); // AUTH Services builder.Services.AddScoped(); @@ -101,12 +102,12 @@ builder.Services.AddScoped(); // Hinzugefügt für Konsistenz builder.Services.AddScoped(); //builder.Services.AddScoped(); // Hinzugefügt für Konsistenz -//builder.Services.AddScoped(); // Hinzugefügt für Konsistenz +builder.Services.AddScoped(); // Hinzugefügt für Konsistenz //builder.Services.AddScoped(); // Hinzugefügt für Konsistenz // CUSTOMER Services (später Implementierungen hinzufügen) builder.Services.AddScoped(); -//builder.Services.AddScoped(); // Hinzugefügt für Konsistenz +builder.Services.AddScoped(); // Hinzugefügt für Konsistenz //builder.Services.AddScoped(); // Hinzugefügt für Konsistenz //builder.Services.AddScoped(); // Hinzugefügt für Konsistenz diff --git a/Webshop.Application/Services/Customers/Interfaces/IOrderService.cs b/Webshop.Application/Services/Customers/Interfaces/IOrderService.cs index acd51bd..aac6e13 100644 --- a/Webshop.Application/Services/Customers/Interfaces/IOrderService.cs +++ b/Webshop.Application/Services/Customers/Interfaces/IOrderService.cs @@ -1,16 +1,15 @@ -// Auto-generiert von CreateWebshopFiles.ps1 +// src/Webshop.Application/Services/Customers/IOrderService.cs using System; using System.Collections.Generic; using System.Threading.Tasks; -using Webshop.Application.DTOs; -using Webshop.Application.DTOs.Auth; -using Webshop.Application.DTOs.Users; +using Webshop.Application.DTOs.Orders; - -namespace Webshop.Application.Services.Customers.Interfaces +namespace Webshop.Application.Services.Customers { public interface IOrderService { - // Fügen Sie hier Methodensignaturen hinzu + Task<(bool Success, OrderDetailDto? CreatedOrder, string? ErrorMessage)> CreateOrderAsync(CreateOrderDto orderDto, string userId); + Task> GetMyOrdersAsync(string userId); + Task GetMyOrderByIdAsync(Guid orderId, string userId); } -} +} \ No newline at end of file diff --git a/Webshop.Application/Services/Customers/OrderService.cs b/Webshop.Application/Services/Customers/OrderService.cs index e6dc28c..932de52 100644 --- a/Webshop.Application/Services/Customers/OrderService.cs +++ b/Webshop.Application/Services/Customers/OrderService.cs @@ -1,18 +1,211 @@ -// Auto-generiert von CreateWebshopFiles.ps1 +// src/Webshop.Application/Services/Customers/OrderService.cs +using Microsoft.EntityFrameworkCore; using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; -using Webshop.Application.Services.Customers.Interfaces; - +using Webshop.Application.DTOs.Orders; +using Webshop.Domain.Entities; +using Webshop.Domain.Enums; +using Webshop.Domain.Interfaces; +using Webshop.Infrastructure.Data; namespace Webshop.Application.Services.Customers { public class OrderService : IOrderService { - // Fügen Sie hier Abhängigkeiten per Dependency Injection hinzu (z.B. Repositories) + private readonly ApplicationDbContext _context; + private readonly IOrderRepository _orderRepository; + private readonly IProductRepository _productRepository; + private readonly IShippingMethodRepository _shippingMethodRepository; + private readonly ICustomerRepository _customerRepository; - // public OrderService(IYourRepository repository) { } + public OrderService( + ApplicationDbContext context, + IOrderRepository orderRepository, + IProductRepository productRepository, + IShippingMethodRepository shippingMethodRepository, + ICustomerRepository customerRepository) + { + _context = context; + _orderRepository = orderRepository; + _productRepository = productRepository; + _shippingMethodRepository = shippingMethodRepository; + _customerRepository = customerRepository; + } - // Fügen Sie hier Service-Methoden hinzu + public async Task<(bool Success, OrderDetailDto? CreatedOrder, string? ErrorMessage)> CreateOrderAsync(CreateOrderDto orderDto, string userId) + { + await using var transaction = await _context.Database.BeginTransactionAsync(); + + try + { + var customer = await _customerRepository.GetByUserIdAsync(userId); + if (customer == null) + { + return (false, null, "Kundenprofil nicht gefunden."); + } + + var shippingMethod = await _shippingMethodRepository.GetByIdAsync(orderDto.ShippingMethodId); + if (shippingMethod == null || !shippingMethod.IsActive) return (false, null, "Ungültige Versandmethode."); + + var paymentMethod = await _context.PaymentMethods.FindAsync(orderDto.PaymentMethodId); + if (paymentMethod == null || !paymentMethod.IsActive) return (false, null, "Ungültige Zahlungsmethode."); + + if (!await _context.Addresses.AnyAsync(a => a.Id == orderDto.ShippingAddressId && a.Customer.AspNetUserId == userId) || + !await _context.Addresses.AnyAsync(a => a.Id == orderDto.BillingAddressId && a.Customer.AspNetUserId == userId)) + { + return (false, null, "Ungültige oder nicht zugehörige Liefer- oder Rechnungsadresse."); + } + + var orderItems = new List(); + decimal itemsTotal = 0; + + foreach (var itemDto in orderDto.Items) + { + var product = await _productRepository.GetProductByIdAsync(itemDto.ProductId); + if (product == null || !product.IsActive) + { + await transaction.RollbackAsync(); + return (false, null, $"Produkt mit ID {itemDto.ProductId} ist nicht verfügbar."); + } + + if (product.StockQuantity < itemDto.Quantity) + { + await transaction.RollbackAsync(); + return (false, null, $"Nicht genügend Lagerbestand für {product.Name}. Verfügbar: {product.StockQuantity}."); + } + + var orderItem = new OrderItem + { + Id = Guid.NewGuid(), + ProductId = product.Id, + ProductVariantId = itemDto.ProductVariantId, + ProductName = product.Name, + ProductSKU = product.SKU, + Quantity = itemDto.Quantity, + UnitPrice = product.Price, + TotalPrice = product.Price * itemDto.Quantity + }; + + orderItems.Add(orderItem); + itemsTotal += orderItem.TotalPrice; + + product.StockQuantity -= itemDto.Quantity; + _context.Products.Update(product); + } + + decimal shippingCost = shippingMethod.BaseCost; + decimal taxAmount = (itemsTotal + shippingCost) * 0.19m; // Annahme: 19% MwSt. + decimal orderTotal = itemsTotal + shippingCost + taxAmount; + + var newOrder = new Order + { + Id = Guid.NewGuid(), + OrderNumber = $"WS-{DateTime.UtcNow:yyyyMMdd}-{new Random().Next(1000, 9999)}", + CustomerId = customer.Id, // Verwende die interne Customer-ID + OrderDate = DateTimeOffset.UtcNow, + OrderStatus = OrderStatus.Pending.ToString(), + PaymentStatus = PaymentStatus.Pending.ToString(), + OrderTotal = orderTotal, + ShippingCost = shippingCost, + TaxAmount = taxAmount, + DiscountAmount = 0, + PaymentMethod = paymentMethod.Name, + PaymentMethodId = paymentMethod.Id, + ShippingMethodId = shippingMethod.Id, + BillingAddressId = orderDto.BillingAddressId, + ShippingAddressId = orderDto.ShippingAddressId, + OrderItems = orderItems + }; + + await _orderRepository.AddAsync(newOrder); + + await transaction.CommitAsync(); + + var createdOrderDto = new OrderDetailDto { Id = newOrder.Id, OrderNumber = newOrder.OrderNumber /* ... weitere Felder mappen ... */ }; + return (true, createdOrderDto, null); + } + catch (Exception ex) + { + await transaction.RollbackAsync(); + return (false, null, $"Ein unerwarteter Fehler ist aufgetreten: {ex.Message}"); + } + } + + public async Task> GetMyOrdersAsync(string userId) + { + var customer = await _customerRepository.GetByUserIdAsync(userId); + if (customer == null) + { + return new List(); + } + + var orders = await _context.Orders + .Where(o => o.CustomerId == customer.Id) + .OrderByDescending(o => o.OrderDate) + .ToListAsync(); + + return orders.Select(o => new OrderSummaryDto + { + Id = o.Id, + OrderNumber = o.OrderNumber, + OrderDate = o.OrderDate, + CustomerName = $"{customer.FirstName} {customer.LastName}", + TotalAmount = o.OrderTotal, + Status = Enum.TryParse(o.OrderStatus, true, out var orderStatus) ? orderStatus : OrderStatus.Pending, + PaymentStatus = Enum.TryParse(o.PaymentStatus, true, out var paymentStatus) ? paymentStatus : PaymentStatus.Pending + }).ToList(); + } + + public async Task GetMyOrderByIdAsync(Guid orderId, string userId) + { + var customer = await _customerRepository.GetByUserIdAsync(userId); + if (customer == null) + { + return null; + } + + var order = await _context.Orders + .Include(o => o.BillingAddress) + .Include(o => o.ShippingAddress) + .Include(o => o.PaymentMethodInfo) + .Include(o => o.OrderItems) + .ThenInclude(oi => oi.Product) + .FirstOrDefaultAsync(o => o.Id == orderId && o.CustomerId == customer.Id); + + if (order == null) + { + return null; + } + + return new OrderDetailDto + { + Id = order.Id, + OrderNumber = order.OrderNumber, + OrderDate = order.OrderDate, + CustomerId = order.CustomerId, + Status = Enum.TryParse(order.OrderStatus, true, out var orderStatus) ? orderStatus : OrderStatus.Pending, + TotalAmount = order.OrderTotal, + ShippingAddress = order.ShippingAddress, + BillingAddress = order.BillingAddress, + PaymentMethod = order.PaymentMethod, + PaymentStatus = Enum.TryParse(order.PaymentStatus, true, out var paymentStatus) ? paymentStatus : PaymentStatus.Pending, + ShippingTrackingNumber = order.ShippingTrackingNumber, + ShippedDate = order.ShippedDate, + DeliveredDate = order.DeliveredDate, + OrderItems = order.OrderItems.Select(oi => new OrderItemDto + { + Id = oi.Id, + ProductId = oi.ProductId, + ProductVariantId = oi.ProductVariantId, + ProductName = oi.ProductName, + ProductSKU = oi.ProductSKU, + Quantity = oi.Quantity, + UnitPrice = oi.UnitPrice, + TotalPrice = oi.TotalPrice + }).ToList() + }; + } } -} +} \ No newline at end of file diff --git a/Webshop.Domain/Interfaces/IShippingMethodRepository.cs b/Webshop.Domain/Interfaces/IShippingMethodRepository.cs index 51d3245..e9a227e 100644 --- a/Webshop.Domain/Interfaces/IShippingMethodRepository.cs +++ b/Webshop.Domain/Interfaces/IShippingMethodRepository.cs @@ -1,14 +1,17 @@ -// Auto-generiert von CreateWebshopFiles.ps1 +// src/Webshop.Domain/Interfaces/IShippingMethodRepository.cs using System; using System.Collections.Generic; using System.Threading.Tasks; using Webshop.Domain.Entities; - namespace Webshop.Domain.Interfaces { public interface IShippingMethodRepository { -// Fügen Sie hier Methodensignaturen hinzu + Task> GetAllAsync(); + Task GetByIdAsync(Guid id); // << HINZUFÜGEN >> + Task AddAsync(ShippingMethod shippingMethod); + Task UpdateAsync(ShippingMethod shippingMethod); + Task DeleteAsync(Guid id); } -} +} \ No newline at end of file diff --git a/Webshop.Infrastructure/Migrations/20250731131435_addCategory.Designer.cs b/Webshop.Infrastructure/Migrations/20250731131435_addCategory.Designer.cs deleted file mode 100644 index 1f05d57..0000000 --- a/Webshop.Infrastructure/Migrations/20250731131435_addCategory.Designer.cs +++ /dev/null @@ -1,1239 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Migrations; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; -using Webshop.Infrastructure.Data; - -#nullable disable - -namespace Webshop.Infrastructure.Migrations -{ - [DbContext(typeof(ApplicationDbContext))] - [Migration("20250731131435_addCategory")] - partial class addCategory - { - /// - protected override void BuildTargetModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.18") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("Roles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("RoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("UserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("text"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("UserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("UserTokens", (string)null); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Address", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AddressType") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("City") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("CompanyName") - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("Country") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("CustomerId") - .HasColumnType("uuid"); - - b.Property("FirstName") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("LastName") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PostalCode") - .IsRequired() - .HasMaxLength(20) - .HasColumnType("character varying(20)"); - - b.Property("State") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("Street") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("Street2") - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.HasKey("Id"); - - b.HasIndex("CustomerId"); - - b.ToTable("Addresses"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Category", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatedDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("DisplayOrder") - .HasColumnType("integer"); - - b.Property("ImageUrl") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("LastModifiedDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("ParentCategoryId") - .HasColumnType("uuid"); - - b.Property("Slug") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.HasKey("Id"); - - b.HasIndex("ParentCategoryId"); - - b.HasIndex("Slug") - .IsUnique(); - - b.ToTable("Categories"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.CategoryDiscount", b => - { - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("DiscountId") - .HasColumnType("uuid"); - - b.HasKey("CategoryId", "DiscountId"); - - b.HasIndex("DiscountId"); - - b.ToTable("CategoryDiscounts"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Customer", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AspNetUserId") - .IsRequired() - .HasColumnType("text"); - - b.Property("DefaultBillingAddressId") - .HasColumnType("uuid"); - - b.Property("DefaultShippingAddressId") - .HasColumnType("uuid"); - - b.Property("FirstName") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("LastName") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.HasIndex("AspNetUserId") - .IsUnique(); - - b.ToTable("Customers"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Discount", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CouponCode") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("CurrentUsageCount") - .HasColumnType("integer"); - - b.Property("Description") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("DiscountType") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("DiscountValue") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("EndDate") - .HasColumnType("timestamp with time zone"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("MaximumUsageCount") - .HasColumnType("integer"); - - b.Property("MinimumOrderAmount") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("RequiresCouponCode") - .HasColumnType("boolean"); - - b.Property("StartDate") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id"); - - b.HasIndex("CouponCode") - .IsUnique() - .HasFilter("\"CouponCode\" IS NOT NULL"); - - b.ToTable("Discounts"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Order", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AdminNotes") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("BillingAddressId") - .HasColumnType("uuid"); - - b.Property("CustomerId") - .HasColumnType("uuid"); - - b.Property("CustomerNotes") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("DiscountAmount") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("GuestEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("GuestPhoneNumber") - .HasMaxLength(20) - .HasColumnType("character varying(20)"); - - b.Property("OrderDate") - .HasColumnType("timestamp with time zone"); - - b.Property("OrderNumber") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("OrderStatus") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("OrderTotal") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("PaymentMethod") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PaymentMethodId") - .HasColumnType("uuid"); - - b.Property("PaymentStatus") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ShippingAddressId") - .HasColumnType("uuid"); - - b.Property("ShippingCost") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("ShippingMethodId") - .HasColumnType("uuid"); - - b.Property("TaxAmount") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("TransactionId") - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.HasKey("Id"); - - b.HasIndex("BillingAddressId"); - - b.HasIndex("CustomerId"); - - b.HasIndex("OrderNumber") - .IsUnique(); - - b.HasIndex("PaymentMethodId"); - - b.HasIndex("ShippingAddressId"); - - b.HasIndex("ShippingMethodId"); - - b.ToTable("Orders"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.OrderItem", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("OrderId") - .HasColumnType("uuid"); - - b.Property("ProductId") - .HasColumnType("uuid"); - - b.Property("ProductName") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("ProductSKU") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ProductVariantId") - .HasColumnType("uuid"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("TotalPrice") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("UnitPrice") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.HasKey("Id"); - - b.HasIndex("OrderId"); - - b.HasIndex("ProductId"); - - b.HasIndex("ProductVariantId"); - - b.ToTable("OrderItems"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.PaymentMethod", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Configuration") - .HasColumnType("jsonb"); - - b.Property("Description") - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PaymentGatewayType") - .HasColumnType("integer"); - - b.Property("ProcessingFee") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.HasKey("Id"); - - b.ToTable("PaymentMethods"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Product", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatedDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasMaxLength(4000) - .HasColumnType("character varying(4000)"); - - b.Property("Height") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("ImageUrl") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("IsInStock") - .HasColumnType("boolean"); - - b.Property("LastModifiedDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Length") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("OldPrice") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("Price") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("PurchasePrice") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("SKU") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ShortDescription") - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("Slug") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("StockQuantity") - .HasColumnType("integer"); - - b.Property("SupplierId") - .HasColumnType("uuid"); - - b.Property("Weight") - .HasPrecision(18, 3) - .HasColumnType("numeric(18,3)"); - - b.Property("Width") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.HasKey("Id"); - - b.HasIndex("SKU") - .IsUnique(); - - b.HasIndex("Slug") - .IsUnique(); - - b.HasIndex("SupplierId"); - - b.ToTable("Products"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ProductCategory", b => - { - b.Property("ProductId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("ProductId", "CategoryId"); - - b.HasIndex("CategoryId"); - - b.ToTable("ProductCategories"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ProductDiscount", b => - { - b.Property("ProductId") - .HasColumnType("uuid"); - - b.Property("DiscountId") - .HasColumnType("uuid"); - - b.HasKey("ProductId", "DiscountId"); - - b.HasIndex("DiscountId"); - - b.ToTable("ProductDiscounts"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ProductVariant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ImageUrl") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PriceAdjustment") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("ProductId") - .HasColumnType("uuid"); - - b.Property("SKU") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("StockQuantity") - .HasColumnType("integer"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.HasIndex("ProductId"); - - b.ToTable("ProductVariants"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Review", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Comment") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("CustomerId") - .HasColumnType("uuid"); - - b.Property("IsApproved") - .HasColumnType("boolean"); - - b.Property("ProductId") - .HasColumnType("uuid"); - - b.Property("Rating") - .HasColumnType("integer"); - - b.Property("ReviewDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Title") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.HasIndex("CustomerId"); - - b.HasIndex("ProductId"); - - b.ToTable("Reviews"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Setting", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Description") - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("Group") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("Value") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.HasKey("Id"); - - b.HasIndex("Key") - .IsUnique(); - - b.ToTable("Settings"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ShippingMethod", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("BaseCost") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("Description") - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("EstimatedDeliveryTime") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("MinimumOrderAmount") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("RequiresTracking") - .HasColumnType("boolean"); - - b.HasKey("Id"); - - b.ToTable("ShippingMethods"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Supplier", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AddressId") - .HasColumnType("uuid"); - - b.Property("ContactPerson") - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("Notes") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("PhoneNumber") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.HasKey("Id"); - - b.HasIndex("AddressId"); - - b.ToTable("Suppliers"); - }); - - modelBuilder.Entity("Webshop.Domain.Identity.ApplicationUser", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("CreatedDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastActive") - .HasColumnType("timestamp with time zone"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("Users", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("Webshop.Domain.Identity.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("Webshop.Domain.Identity.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Webshop.Domain.Identity.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("Webshop.Domain.Identity.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Address", b => - { - b.HasOne("Webshop.Domain.Entities.Customer", "Customer") - .WithMany("Addresses") - .HasForeignKey("CustomerId"); - - b.Navigation("Customer"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Category", b => - { - b.HasOne("Webshop.Domain.Entities.Category", "ParentCategory") - .WithMany("SubCategories") - .HasForeignKey("ParentCategoryId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("ParentCategory"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.CategoryDiscount", b => - { - b.HasOne("Webshop.Domain.Entities.Category", "Category") - .WithMany("CategoryDiscounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Webshop.Domain.Entities.Discount", "Discount") - .WithMany("CategoryDiscounts") - .HasForeignKey("DiscountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("Discount"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Customer", b => - { - b.HasOne("Webshop.Domain.Identity.ApplicationUser", "User") - .WithOne("Customer") - .HasForeignKey("Webshop.Domain.Entities.Customer", "AspNetUserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Order", b => - { - b.HasOne("Webshop.Domain.Entities.Address", "BillingAddress") - .WithMany() - .HasForeignKey("BillingAddressId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.HasOne("Webshop.Domain.Entities.Customer", "Customer") - .WithMany("Orders") - .HasForeignKey("CustomerId"); - - b.HasOne("Webshop.Domain.Entities.PaymentMethod", "PaymentMethodInfo") - .WithMany() - .HasForeignKey("PaymentMethodId"); - - b.HasOne("Webshop.Domain.Entities.Address", "ShippingAddress") - .WithMany() - .HasForeignKey("ShippingAddressId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.HasOne("Webshop.Domain.Entities.ShippingMethod", "ShippingMethodInfo") - .WithMany() - .HasForeignKey("ShippingMethodId"); - - b.Navigation("BillingAddress"); - - b.Navigation("Customer"); - - b.Navigation("PaymentMethodInfo"); - - b.Navigation("ShippingAddress"); - - b.Navigation("ShippingMethodInfo"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.OrderItem", b => - { - b.HasOne("Webshop.Domain.Entities.Order", "Order") - .WithMany("OrderItems") - .HasForeignKey("OrderId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Webshop.Domain.Entities.Product", "Product") - .WithMany() - .HasForeignKey("ProductId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("Webshop.Domain.Entities.ProductVariant", "ProductVariant") - .WithMany() - .HasForeignKey("ProductVariantId") - .OnDelete(DeleteBehavior.SetNull); - - b.Navigation("Order"); - - b.Navigation("Product"); - - b.Navigation("ProductVariant"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Product", b => - { - b.HasOne("Webshop.Domain.Entities.Supplier", "Supplier") - .WithMany("Products") - .HasForeignKey("SupplierId"); - - b.Navigation("Supplier"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ProductCategory", b => - { - b.HasOne("Webshop.Domain.Entities.Category", "Category") - .WithMany("ProductCategories") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Webshop.Domain.Entities.Product", "Product") - .WithMany("ProductCategories") - .HasForeignKey("ProductId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("Product"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ProductDiscount", b => - { - b.HasOne("Webshop.Domain.Entities.Discount", "Discount") - .WithMany("ProductDiscounts") - .HasForeignKey("DiscountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Webshop.Domain.Entities.Product", "Product") - .WithMany("ProductDiscounts") - .HasForeignKey("ProductId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Discount"); - - b.Navigation("Product"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ProductVariant", b => - { - b.HasOne("Webshop.Domain.Entities.Product", "Product") - .WithMany("Variants") - .HasForeignKey("ProductId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Product"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Review", b => - { - b.HasOne("Webshop.Domain.Entities.Customer", "Customer") - .WithMany("Reviews") - .HasForeignKey("CustomerId"); - - b.HasOne("Webshop.Domain.Entities.Product", "Product") - .WithMany("Reviews") - .HasForeignKey("ProductId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Customer"); - - b.Navigation("Product"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Supplier", b => - { - b.HasOne("Webshop.Domain.Entities.Address", "Address") - .WithMany() - .HasForeignKey("AddressId"); - - b.Navigation("Address"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Category", b => - { - b.Navigation("CategoryDiscounts"); - - b.Navigation("ProductCategories"); - - b.Navigation("SubCategories"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Customer", b => - { - b.Navigation("Addresses"); - - b.Navigation("Orders"); - - b.Navigation("Reviews"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Discount", b => - { - b.Navigation("CategoryDiscounts"); - - b.Navigation("ProductDiscounts"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Order", b => - { - b.Navigation("OrderItems"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Product", b => - { - b.Navigation("ProductCategories"); - - b.Navigation("ProductDiscounts"); - - b.Navigation("Reviews"); - - b.Navigation("Variants"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Supplier", b => - { - b.Navigation("Products"); - }); - - modelBuilder.Entity("Webshop.Domain.Identity.ApplicationUser", b => - { - b.Navigation("Customer"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Webshop.Infrastructure/Migrations/20250731131435_addCategory.cs b/Webshop.Infrastructure/Migrations/20250731131435_addCategory.cs deleted file mode 100644 index da289de..0000000 --- a/Webshop.Infrastructure/Migrations/20250731131435_addCategory.cs +++ /dev/null @@ -1,832 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore.Migrations; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; - -#nullable disable - -namespace Webshop.Infrastructure.Migrations -{ - /// - public partial class addCategory : Migration - { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.CreateTable( - name: "Categories", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), - Description = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: true), - Slug = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), - ParentCategoryId = table.Column(type: "uuid", nullable: true), - ImageUrl = table.Column(type: "character varying(2000)", maxLength: 2000, nullable: true), - IsActive = table.Column(type: "boolean", nullable: false), - DisplayOrder = table.Column(type: "integer", nullable: false), - CreatedDate = table.Column(type: "timestamp with time zone", nullable: false), - LastModifiedDate = table.Column(type: "timestamp with time zone", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Categories", x => x.Id); - table.ForeignKey( - name: "FK_Categories_Categories_ParentCategoryId", - column: x => x.ParentCategoryId, - principalTable: "Categories", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - }); - - migrationBuilder.CreateTable( - name: "Discounts", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), - DiscountType = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), - DiscountValue = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), - StartDate = table.Column(type: "timestamp with time zone", nullable: false), - EndDate = table.Column(type: "timestamp with time zone", nullable: true), - IsActive = table.Column(type: "boolean", nullable: false), - RequiresCouponCode = table.Column(type: "boolean", nullable: false), - CouponCode = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - MinimumOrderAmount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true), - MaximumUsageCount = table.Column(type: "integer", nullable: true), - CurrentUsageCount = table.Column(type: "integer", nullable: false), - Description = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Discounts", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "PaymentMethods", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), - Description = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), - IsActive = table.Column(type: "boolean", nullable: false), - PaymentGatewayType = table.Column(type: "integer", nullable: false), - Configuration = table.Column(type: "jsonb", nullable: true), - ProcessingFee = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_PaymentMethods", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Roles", - columns: table => new - { - Id = table.Column(type: "text", nullable: false), - Name = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - ConcurrencyStamp = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Roles", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Settings", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Key = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), - Value = table.Column(type: "character varying(2000)", maxLength: 2000, nullable: true), - Description = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), - IsActive = table.Column(type: "boolean", nullable: false), - Group = table.Column(type: "character varying(100)", maxLength: 100, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Settings", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "ShippingMethods", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), - Description = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), - BaseCost = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), - MinimumOrderAmount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true), - IsActive = table.Column(type: "boolean", nullable: false), - EstimatedDeliveryTime = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), - RequiresTracking = table.Column(type: "boolean", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_ShippingMethods", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "Users", - columns: table => new - { - Id = table.Column(type: "text", nullable: false), - CreatedDate = table.Column(type: "timestamp with time zone", nullable: false), - LastActive = table.Column(type: "timestamp with time zone", nullable: true), - UserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedUserName = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - Email = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - NormalizedEmail = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - EmailConfirmed = table.Column(type: "boolean", nullable: false), - PasswordHash = table.Column(type: "text", nullable: true), - SecurityStamp = table.Column(type: "text", nullable: true), - ConcurrencyStamp = table.Column(type: "text", nullable: true), - PhoneNumber = table.Column(type: "text", nullable: true), - PhoneNumberConfirmed = table.Column(type: "boolean", nullable: false), - TwoFactorEnabled = table.Column(type: "boolean", nullable: false), - LockoutEnd = table.Column(type: "timestamp with time zone", nullable: true), - LockoutEnabled = table.Column(type: "boolean", nullable: false), - AccessFailedCount = table.Column(type: "integer", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Users", x => x.Id); - }); - - migrationBuilder.CreateTable( - name: "CategoryDiscounts", - columns: table => new - { - CategoryId = table.Column(type: "uuid", nullable: false), - DiscountId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_CategoryDiscounts", x => new { x.CategoryId, x.DiscountId }); - table.ForeignKey( - name: "FK_CategoryDiscounts_Categories_CategoryId", - column: x => x.CategoryId, - principalTable: "Categories", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_CategoryDiscounts_Discounts_DiscountId", - column: x => x.DiscountId, - principalTable: "Discounts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "RoleClaims", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - RoleId = table.Column(type: "text", nullable: false), - ClaimType = table.Column(type: "text", nullable: true), - ClaimValue = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_RoleClaims", x => x.Id); - table.ForeignKey( - name: "FK_RoleClaims_Roles_RoleId", - column: x => x.RoleId, - principalTable: "Roles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Customers", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - AspNetUserId = table.Column(type: "text", nullable: false), - FirstName = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), - LastName = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), - DefaultShippingAddressId = table.Column(type: "uuid", nullable: true), - DefaultBillingAddressId = table.Column(type: "uuid", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Customers", x => x.Id); - table.ForeignKey( - name: "FK_Customers_Users_AspNetUserId", - column: x => x.AspNetUserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserClaims", - columns: table => new - { - Id = table.Column(type: "integer", nullable: false) - .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), - UserId = table.Column(type: "text", nullable: false), - ClaimType = table.Column(type: "text", nullable: true), - ClaimValue = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_UserClaims", x => x.Id); - table.ForeignKey( - name: "FK_UserClaims_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserLogins", - columns: table => new - { - LoginProvider = table.Column(type: "text", nullable: false), - ProviderKey = table.Column(type: "text", nullable: false), - ProviderDisplayName = table.Column(type: "text", nullable: true), - UserId = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserLogins", x => new { x.LoginProvider, x.ProviderKey }); - table.ForeignKey( - name: "FK_UserLogins_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserRoles", - columns: table => new - { - UserId = table.Column(type: "text", nullable: false), - RoleId = table.Column(type: "text", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_UserRoles", x => new { x.UserId, x.RoleId }); - table.ForeignKey( - name: "FK_UserRoles_Roles_RoleId", - column: x => x.RoleId, - principalTable: "Roles", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_UserRoles_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "UserTokens", - columns: table => new - { - UserId = table.Column(type: "text", nullable: false), - LoginProvider = table.Column(type: "text", nullable: false), - Name = table.Column(type: "text", nullable: false), - Value = table.Column(type: "text", nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_UserTokens", x => new { x.UserId, x.LoginProvider, x.Name }); - table.ForeignKey( - name: "FK_UserTokens_Users_UserId", - column: x => x.UserId, - principalTable: "Users", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "Addresses", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - CustomerId = table.Column(type: "uuid", nullable: true), - AddressType = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - Street = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), - Street2 = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), - City = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), - State = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), - PostalCode = table.Column(type: "character varying(20)", maxLength: 20, nullable: false), - Country = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), - CompanyName = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), - FirstName = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), - LastName = table.Column(type: "character varying(100)", maxLength: 100, nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Addresses", x => x.Id); - table.ForeignKey( - name: "FK_Addresses_Customers_CustomerId", - column: x => x.CustomerId, - principalTable: "Customers", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "Orders", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - OrderNumber = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), - CustomerId = table.Column(type: "uuid", nullable: true), - GuestEmail = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - GuestPhoneNumber = table.Column(type: "character varying(20)", maxLength: 20, nullable: true), - OrderDate = table.Column(type: "timestamp with time zone", nullable: false), - OrderStatus = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), - OrderTotal = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), - ShippingCost = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), - TaxAmount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), - DiscountAmount = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), - PaymentStatus = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), - PaymentMethod = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), - PaymentMethodId = table.Column(type: "uuid", nullable: true), - ShippingMethodId = table.Column(type: "uuid", nullable: true), - TransactionId = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), - BillingAddressId = table.Column(type: "uuid", nullable: false), - ShippingAddressId = table.Column(type: "uuid", nullable: false), - CustomerNotes = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: true), - AdminNotes = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Orders", x => x.Id); - table.ForeignKey( - name: "FK_Orders_Addresses_BillingAddressId", - column: x => x.BillingAddressId, - principalTable: "Addresses", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_Orders_Addresses_ShippingAddressId", - column: x => x.ShippingAddressId, - principalTable: "Addresses", - principalColumn: "Id", - onDelete: ReferentialAction.Restrict); - table.ForeignKey( - name: "FK_Orders_Customers_CustomerId", - column: x => x.CustomerId, - principalTable: "Customers", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_Orders_PaymentMethods_PaymentMethodId", - column: x => x.PaymentMethodId, - principalTable: "PaymentMethods", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_Orders_ShippingMethods_ShippingMethodId", - column: x => x.ShippingMethodId, - principalTable: "ShippingMethods", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "Suppliers", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), - ContactPerson = table.Column(type: "character varying(255)", maxLength: 255, nullable: true), - Email = table.Column(type: "character varying(256)", maxLength: 256, nullable: true), - PhoneNumber = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - AddressId = table.Column(type: "uuid", nullable: true), - Notes = table.Column(type: "character varying(1000)", maxLength: 1000, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Suppliers", x => x.Id); - table.ForeignKey( - name: "FK_Suppliers_Addresses_AddressId", - column: x => x.AddressId, - principalTable: "Addresses", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "Products", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), - Description = table.Column(type: "character varying(4000)", maxLength: 4000, nullable: true), - ShortDescription = table.Column(type: "character varying(500)", maxLength: 500, nullable: true), - SKU = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), - Price = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), - OldPrice = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true), - IsActive = table.Column(type: "boolean", nullable: false), - IsInStock = table.Column(type: "boolean", nullable: false), - StockQuantity = table.Column(type: "integer", nullable: false), - Weight = table.Column(type: "numeric(18,3)", precision: 18, scale: 3, nullable: true), - Width = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true), - Height = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true), - Length = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true), - ImageUrl = table.Column(type: "character varying(2000)", maxLength: 2000, nullable: true), - Slug = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), - CreatedDate = table.Column(type: "timestamp with time zone", nullable: false), - LastModifiedDate = table.Column(type: "timestamp with time zone", nullable: true), - SupplierId = table.Column(type: "uuid", nullable: true), - PurchasePrice = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: true) - }, - constraints: table => - { - table.PrimaryKey("PK_Products", x => x.Id); - table.ForeignKey( - name: "FK_Products_Suppliers_SupplierId", - column: x => x.SupplierId, - principalTable: "Suppliers", - principalColumn: "Id"); - }); - - migrationBuilder.CreateTable( - name: "ProductCategories", - columns: table => new - { - ProductId = table.Column(type: "uuid", nullable: false), - CategoryId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_ProductCategories", x => new { x.ProductId, x.CategoryId }); - table.ForeignKey( - name: "FK_ProductCategories_Categories_CategoryId", - column: x => x.CategoryId, - principalTable: "Categories", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_ProductCategories_Products_ProductId", - column: x => x.ProductId, - principalTable: "Products", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "ProductDiscounts", - columns: table => new - { - ProductId = table.Column(type: "uuid", nullable: false), - DiscountId = table.Column(type: "uuid", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_ProductDiscounts", x => new { x.ProductId, x.DiscountId }); - table.ForeignKey( - name: "FK_ProductDiscounts_Discounts_DiscountId", - column: x => x.DiscountId, - principalTable: "Discounts", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - table.ForeignKey( - name: "FK_ProductDiscounts_Products_ProductId", - column: x => x.ProductId, - principalTable: "Products", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "ProductVariants", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - ProductId = table.Column(type: "uuid", nullable: false), - Name = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), - Value = table.Column(type: "character varying(100)", maxLength: 100, nullable: false), - SKU = table.Column(type: "character varying(50)", maxLength: 50, nullable: true), - PriceAdjustment = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), - StockQuantity = table.Column(type: "integer", nullable: false), - ImageUrl = table.Column(type: "character varying(2000)", maxLength: 2000, nullable: true), - IsActive = table.Column(type: "boolean", 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: "Reviews", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - ProductId = table.Column(type: "uuid", nullable: false), - CustomerId = table.Column(type: "uuid", nullable: true), - Rating = table.Column(type: "integer", nullable: false), - Title = table.Column(type: "character varying(100)", maxLength: 100, nullable: true), - Comment = table.Column(type: "character varying(2000)", maxLength: 2000, nullable: true), - ReviewDate = table.Column(type: "timestamp with time zone", nullable: false), - IsApproved = table.Column(type: "boolean", nullable: false) - }, - constraints: table => - { - table.PrimaryKey("PK_Reviews", x => x.Id); - table.ForeignKey( - name: "FK_Reviews_Customers_CustomerId", - column: x => x.CustomerId, - principalTable: "Customers", - principalColumn: "Id"); - table.ForeignKey( - name: "FK_Reviews_Products_ProductId", - column: x => x.ProductId, - principalTable: "Products", - principalColumn: "Id", - onDelete: ReferentialAction.Cascade); - }); - - migrationBuilder.CreateTable( - name: "OrderItems", - columns: table => new - { - Id = table.Column(type: "uuid", nullable: false), - OrderId = table.Column(type: "uuid", nullable: false), - ProductId = table.Column(type: "uuid", nullable: true), - ProductVariantId = table.Column(type: "uuid", nullable: true), - ProductName = table.Column(type: "character varying(255)", maxLength: 255, nullable: false), - ProductSKU = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), - Quantity = table.Column(type: "integer", nullable: false), - UnitPrice = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, nullable: false), - TotalPrice = table.Column(type: "numeric(18,2)", precision: 18, scale: 2, 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.SetNull); - table.ForeignKey( - name: "FK_OrderItems_Products_ProductId", - column: x => x.ProductId, - principalTable: "Products", - principalColumn: "Id", - onDelete: ReferentialAction.SetNull); - }); - - migrationBuilder.CreateIndex( - name: "IX_Addresses_CustomerId", - table: "Addresses", - column: "CustomerId"); - - migrationBuilder.CreateIndex( - name: "IX_Categories_ParentCategoryId", - table: "Categories", - column: "ParentCategoryId"); - - migrationBuilder.CreateIndex( - name: "IX_Categories_Slug", - table: "Categories", - column: "Slug", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_CategoryDiscounts_DiscountId", - table: "CategoryDiscounts", - column: "DiscountId"); - - migrationBuilder.CreateIndex( - name: "IX_Customers_AspNetUserId", - table: "Customers", - column: "AspNetUserId", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Discounts_CouponCode", - table: "Discounts", - column: "CouponCode", - unique: true, - filter: "\"CouponCode\" IS NOT NULL"); - - migrationBuilder.CreateIndex( - name: "IX_OrderItems_OrderId", - table: "OrderItems", - column: "OrderId"); - - migrationBuilder.CreateIndex( - name: "IX_OrderItems_ProductId", - table: "OrderItems", - column: "ProductId"); - - migrationBuilder.CreateIndex( - name: "IX_OrderItems_ProductVariantId", - table: "OrderItems", - column: "ProductVariantId"); - - migrationBuilder.CreateIndex( - name: "IX_Orders_BillingAddressId", - table: "Orders", - column: "BillingAddressId"); - - migrationBuilder.CreateIndex( - name: "IX_Orders_CustomerId", - table: "Orders", - column: "CustomerId"); - - migrationBuilder.CreateIndex( - name: "IX_Orders_OrderNumber", - table: "Orders", - column: "OrderNumber", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Orders_PaymentMethodId", - table: "Orders", - column: "PaymentMethodId"); - - migrationBuilder.CreateIndex( - name: "IX_Orders_ShippingAddressId", - table: "Orders", - column: "ShippingAddressId"); - - migrationBuilder.CreateIndex( - name: "IX_Orders_ShippingMethodId", - table: "Orders", - column: "ShippingMethodId"); - - migrationBuilder.CreateIndex( - name: "IX_ProductCategories_CategoryId", - table: "ProductCategories", - column: "CategoryId"); - - migrationBuilder.CreateIndex( - name: "IX_ProductDiscounts_DiscountId", - table: "ProductDiscounts", - column: "DiscountId"); - - migrationBuilder.CreateIndex( - name: "IX_Products_SKU", - table: "Products", - column: "SKU", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Products_Slug", - table: "Products", - column: "Slug", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Products_SupplierId", - table: "Products", - column: "SupplierId"); - - migrationBuilder.CreateIndex( - name: "IX_ProductVariants_ProductId", - table: "ProductVariants", - column: "ProductId"); - - migrationBuilder.CreateIndex( - name: "IX_Reviews_CustomerId", - table: "Reviews", - column: "CustomerId"); - - migrationBuilder.CreateIndex( - name: "IX_Reviews_ProductId", - table: "Reviews", - column: "ProductId"); - - migrationBuilder.CreateIndex( - name: "IX_RoleClaims_RoleId", - table: "RoleClaims", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "RoleNameIndex", - table: "Roles", - column: "NormalizedName", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Settings_Key", - table: "Settings", - column: "Key", - unique: true); - - migrationBuilder.CreateIndex( - name: "IX_Suppliers_AddressId", - table: "Suppliers", - column: "AddressId"); - - migrationBuilder.CreateIndex( - name: "IX_UserClaims_UserId", - table: "UserClaims", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_UserLogins_UserId", - table: "UserLogins", - column: "UserId"); - - migrationBuilder.CreateIndex( - name: "IX_UserRoles_RoleId", - table: "UserRoles", - column: "RoleId"); - - migrationBuilder.CreateIndex( - name: "EmailIndex", - table: "Users", - column: "NormalizedEmail"); - - migrationBuilder.CreateIndex( - name: "UserNameIndex", - table: "Users", - column: "NormalizedUserName", - unique: true); - } - - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.DropTable( - name: "CategoryDiscounts"); - - migrationBuilder.DropTable( - name: "OrderItems"); - - migrationBuilder.DropTable( - name: "ProductCategories"); - - migrationBuilder.DropTable( - name: "ProductDiscounts"); - - migrationBuilder.DropTable( - name: "Reviews"); - - migrationBuilder.DropTable( - name: "RoleClaims"); - - migrationBuilder.DropTable( - name: "Settings"); - - migrationBuilder.DropTable( - name: "UserClaims"); - - migrationBuilder.DropTable( - name: "UserLogins"); - - migrationBuilder.DropTable( - name: "UserRoles"); - - migrationBuilder.DropTable( - name: "UserTokens"); - - migrationBuilder.DropTable( - name: "Orders"); - - migrationBuilder.DropTable( - name: "ProductVariants"); - - migrationBuilder.DropTable( - name: "Categories"); - - migrationBuilder.DropTable( - name: "Discounts"); - - migrationBuilder.DropTable( - name: "Roles"); - - migrationBuilder.DropTable( - name: "PaymentMethods"); - - migrationBuilder.DropTable( - name: "ShippingMethods"); - - migrationBuilder.DropTable( - name: "Products"); - - migrationBuilder.DropTable( - name: "Suppliers"); - - migrationBuilder.DropTable( - name: "Addresses"); - - migrationBuilder.DropTable( - name: "Customers"); - - migrationBuilder.DropTable( - name: "Users"); - } - } -} diff --git a/Webshop.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs b/Webshop.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs deleted file mode 100644 index fdd306e..0000000 --- a/Webshop.Infrastructure/Migrations/ApplicationDbContextModelSnapshot.cs +++ /dev/null @@ -1,1236 +0,0 @@ -// -using System; -using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.Infrastructure; -using Microsoft.EntityFrameworkCore.Storage.ValueConversion; -using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; -using Webshop.Infrastructure.Data; - -#nullable disable - -namespace Webshop.Infrastructure.Migrations -{ - [DbContext(typeof(ApplicationDbContext))] - partial class ApplicationDbContextModelSnapshot : ModelSnapshot - { - protected override void BuildModel(ModelBuilder modelBuilder) - { -#pragma warning disable 612, 618 - modelBuilder - .HasAnnotation("ProductVersion", "8.0.18") - .HasAnnotation("Relational:MaxIdentifierLength", 63); - - NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("Name") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedName") - .IsUnique() - .HasDatabaseName("RoleNameIndex"); - - b.ToTable("Roles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("RoleId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("RoleId"); - - b.ToTable("RoleClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("integer"); - - NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); - - b.Property("ClaimType") - .HasColumnType("text"); - - b.Property("ClaimValue") - .HasColumnType("text"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("Id"); - - b.HasIndex("UserId"); - - b.ToTable("UserClaims", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("ProviderKey") - .HasColumnType("text"); - - b.Property("ProviderDisplayName") - .HasColumnType("text"); - - b.Property("UserId") - .IsRequired() - .HasColumnType("text"); - - b.HasKey("LoginProvider", "ProviderKey"); - - b.HasIndex("UserId"); - - b.ToTable("UserLogins", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("RoleId") - .HasColumnType("text"); - - b.HasKey("UserId", "RoleId"); - - b.HasIndex("RoleId"); - - b.ToTable("UserRoles", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.Property("UserId") - .HasColumnType("text"); - - b.Property("LoginProvider") - .HasColumnType("text"); - - b.Property("Name") - .HasColumnType("text"); - - b.Property("Value") - .HasColumnType("text"); - - b.HasKey("UserId", "LoginProvider", "Name"); - - b.ToTable("UserTokens", (string)null); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Address", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AddressType") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("City") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("CompanyName") - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("Country") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("CustomerId") - .HasColumnType("uuid"); - - b.Property("FirstName") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("LastName") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PostalCode") - .IsRequired() - .HasMaxLength(20) - .HasColumnType("character varying(20)"); - - b.Property("State") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("Street") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("Street2") - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.HasKey("Id"); - - b.HasIndex("CustomerId"); - - b.ToTable("Addresses"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Category", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatedDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("DisplayOrder") - .HasColumnType("integer"); - - b.Property("ImageUrl") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("LastModifiedDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("ParentCategoryId") - .HasColumnType("uuid"); - - b.Property("Slug") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.HasKey("Id"); - - b.HasIndex("ParentCategoryId"); - - b.HasIndex("Slug") - .IsUnique(); - - b.ToTable("Categories"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.CategoryDiscount", b => - { - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.Property("DiscountId") - .HasColumnType("uuid"); - - b.HasKey("CategoryId", "DiscountId"); - - b.HasIndex("DiscountId"); - - b.ToTable("CategoryDiscounts"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Customer", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AspNetUserId") - .IsRequired() - .HasColumnType("text"); - - b.Property("DefaultBillingAddressId") - .HasColumnType("uuid"); - - b.Property("DefaultShippingAddressId") - .HasColumnType("uuid"); - - b.Property("FirstName") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("LastName") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.HasIndex("AspNetUserId") - .IsUnique(); - - b.ToTable("Customers"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Discount", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CouponCode") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("CurrentUsageCount") - .HasColumnType("integer"); - - b.Property("Description") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("DiscountType") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("DiscountValue") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("EndDate") - .HasColumnType("timestamp with time zone"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("MaximumUsageCount") - .HasColumnType("integer"); - - b.Property("MinimumOrderAmount") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("RequiresCouponCode") - .HasColumnType("boolean"); - - b.Property("StartDate") - .HasColumnType("timestamp with time zone"); - - b.HasKey("Id"); - - b.HasIndex("CouponCode") - .IsUnique() - .HasFilter("\"CouponCode\" IS NOT NULL"); - - b.ToTable("Discounts"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Order", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AdminNotes") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("BillingAddressId") - .HasColumnType("uuid"); - - b.Property("CustomerId") - .HasColumnType("uuid"); - - b.Property("CustomerNotes") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("DiscountAmount") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("GuestEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("GuestPhoneNumber") - .HasMaxLength(20) - .HasColumnType("character varying(20)"); - - b.Property("OrderDate") - .HasColumnType("timestamp with time zone"); - - b.Property("OrderNumber") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("OrderStatus") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("OrderTotal") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("PaymentMethod") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PaymentMethodId") - .HasColumnType("uuid"); - - b.Property("PaymentStatus") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ShippingAddressId") - .HasColumnType("uuid"); - - b.Property("ShippingCost") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("ShippingMethodId") - .HasColumnType("uuid"); - - b.Property("TaxAmount") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("TransactionId") - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.HasKey("Id"); - - b.HasIndex("BillingAddressId"); - - b.HasIndex("CustomerId"); - - b.HasIndex("OrderNumber") - .IsUnique(); - - b.HasIndex("PaymentMethodId"); - - b.HasIndex("ShippingAddressId"); - - b.HasIndex("ShippingMethodId"); - - b.ToTable("Orders"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.OrderItem", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("OrderId") - .HasColumnType("uuid"); - - b.Property("ProductId") - .HasColumnType("uuid"); - - b.Property("ProductName") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("ProductSKU") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ProductVariantId") - .HasColumnType("uuid"); - - b.Property("Quantity") - .HasColumnType("integer"); - - b.Property("TotalPrice") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("UnitPrice") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.HasKey("Id"); - - b.HasIndex("OrderId"); - - b.HasIndex("ProductId"); - - b.HasIndex("ProductVariantId"); - - b.ToTable("OrderItems"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.PaymentMethod", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Configuration") - .HasColumnType("jsonb"); - - b.Property("Description") - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PaymentGatewayType") - .HasColumnType("integer"); - - b.Property("ProcessingFee") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.HasKey("Id"); - - b.ToTable("PaymentMethods"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Product", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("CreatedDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Description") - .HasMaxLength(4000) - .HasColumnType("character varying(4000)"); - - b.Property("Height") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("ImageUrl") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("IsInStock") - .HasColumnType("boolean"); - - b.Property("LastModifiedDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Length") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("OldPrice") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("Price") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("PurchasePrice") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("SKU") - .IsRequired() - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("ShortDescription") - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("Slug") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("StockQuantity") - .HasColumnType("integer"); - - b.Property("SupplierId") - .HasColumnType("uuid"); - - b.Property("Weight") - .HasPrecision(18, 3) - .HasColumnType("numeric(18,3)"); - - b.Property("Width") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.HasKey("Id"); - - b.HasIndex("SKU") - .IsUnique(); - - b.HasIndex("Slug") - .IsUnique(); - - b.HasIndex("SupplierId"); - - b.ToTable("Products"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ProductCategory", b => - { - b.Property("ProductId") - .HasColumnType("uuid"); - - b.Property("CategoryId") - .HasColumnType("uuid"); - - b.HasKey("ProductId", "CategoryId"); - - b.HasIndex("CategoryId"); - - b.ToTable("ProductCategories"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ProductDiscount", b => - { - b.Property("ProductId") - .HasColumnType("uuid"); - - b.Property("DiscountId") - .HasColumnType("uuid"); - - b.HasKey("ProductId", "DiscountId"); - - b.HasIndex("DiscountId"); - - b.ToTable("ProductDiscounts"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ProductVariant", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("ImageUrl") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("PriceAdjustment") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("ProductId") - .HasColumnType("uuid"); - - b.Property("SKU") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.Property("StockQuantity") - .HasColumnType("integer"); - - b.Property("Value") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.HasIndex("ProductId"); - - b.ToTable("ProductVariants"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Review", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Comment") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.Property("CustomerId") - .HasColumnType("uuid"); - - b.Property("IsApproved") - .HasColumnType("boolean"); - - b.Property("ProductId") - .HasColumnType("uuid"); - - b.Property("Rating") - .HasColumnType("integer"); - - b.Property("ReviewDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Title") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.HasKey("Id"); - - b.HasIndex("CustomerId"); - - b.HasIndex("ProductId"); - - b.ToTable("Reviews"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Setting", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("Description") - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("Group") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("Key") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("Value") - .HasMaxLength(2000) - .HasColumnType("character varying(2000)"); - - b.HasKey("Id"); - - b.HasIndex("Key") - .IsUnique(); - - b.ToTable("Settings"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ShippingMethod", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("BaseCost") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("Description") - .HasMaxLength(500) - .HasColumnType("character varying(500)"); - - b.Property("EstimatedDeliveryTime") - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("IsActive") - .HasColumnType("boolean"); - - b.Property("MinimumOrderAmount") - .HasPrecision(18, 2) - .HasColumnType("numeric(18,2)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(100) - .HasColumnType("character varying(100)"); - - b.Property("RequiresTracking") - .HasColumnType("boolean"); - - b.HasKey("Id"); - - b.ToTable("ShippingMethods"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Supplier", b => - { - b.Property("Id") - .ValueGeneratedOnAdd() - .HasColumnType("uuid"); - - b.Property("AddressId") - .HasColumnType("uuid"); - - b.Property("ContactPerson") - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("Name") - .IsRequired() - .HasMaxLength(255) - .HasColumnType("character varying(255)"); - - b.Property("Notes") - .HasMaxLength(1000) - .HasColumnType("character varying(1000)"); - - b.Property("PhoneNumber") - .HasMaxLength(50) - .HasColumnType("character varying(50)"); - - b.HasKey("Id"); - - b.HasIndex("AddressId"); - - b.ToTable("Suppliers"); - }); - - modelBuilder.Entity("Webshop.Domain.Identity.ApplicationUser", b => - { - b.Property("Id") - .HasColumnType("text"); - - b.Property("AccessFailedCount") - .HasColumnType("integer"); - - b.Property("ConcurrencyStamp") - .IsConcurrencyToken() - .HasColumnType("text"); - - b.Property("CreatedDate") - .HasColumnType("timestamp with time zone"); - - b.Property("Email") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("EmailConfirmed") - .HasColumnType("boolean"); - - b.Property("LastActive") - .HasColumnType("timestamp with time zone"); - - b.Property("LockoutEnabled") - .HasColumnType("boolean"); - - b.Property("LockoutEnd") - .HasColumnType("timestamp with time zone"); - - b.Property("NormalizedEmail") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("NormalizedUserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.Property("PasswordHash") - .HasColumnType("text"); - - b.Property("PhoneNumber") - .HasColumnType("text"); - - b.Property("PhoneNumberConfirmed") - .HasColumnType("boolean"); - - b.Property("SecurityStamp") - .HasColumnType("text"); - - b.Property("TwoFactorEnabled") - .HasColumnType("boolean"); - - b.Property("UserName") - .HasMaxLength(256) - .HasColumnType("character varying(256)"); - - b.HasKey("Id"); - - b.HasIndex("NormalizedEmail") - .HasDatabaseName("EmailIndex"); - - b.HasIndex("NormalizedUserName") - .IsUnique() - .HasDatabaseName("UserNameIndex"); - - b.ToTable("Users", (string)null); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => - { - b.HasOne("Webshop.Domain.Identity.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => - { - b.HasOne("Webshop.Domain.Identity.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => - { - b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) - .WithMany() - .HasForeignKey("RoleId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Webshop.Domain.Identity.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => - { - b.HasOne("Webshop.Domain.Identity.ApplicationUser", null) - .WithMany() - .HasForeignKey("UserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Address", b => - { - b.HasOne("Webshop.Domain.Entities.Customer", "Customer") - .WithMany("Addresses") - .HasForeignKey("CustomerId"); - - b.Navigation("Customer"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Category", b => - { - b.HasOne("Webshop.Domain.Entities.Category", "ParentCategory") - .WithMany("SubCategories") - .HasForeignKey("ParentCategoryId") - .OnDelete(DeleteBehavior.Restrict); - - b.Navigation("ParentCategory"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.CategoryDiscount", b => - { - b.HasOne("Webshop.Domain.Entities.Category", "Category") - .WithMany("CategoryDiscounts") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Webshop.Domain.Entities.Discount", "Discount") - .WithMany("CategoryDiscounts") - .HasForeignKey("DiscountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("Discount"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Customer", b => - { - b.HasOne("Webshop.Domain.Identity.ApplicationUser", "User") - .WithOne("Customer") - .HasForeignKey("Webshop.Domain.Entities.Customer", "AspNetUserId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("User"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Order", b => - { - b.HasOne("Webshop.Domain.Entities.Address", "BillingAddress") - .WithMany() - .HasForeignKey("BillingAddressId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.HasOne("Webshop.Domain.Entities.Customer", "Customer") - .WithMany("Orders") - .HasForeignKey("CustomerId"); - - b.HasOne("Webshop.Domain.Entities.PaymentMethod", "PaymentMethodInfo") - .WithMany() - .HasForeignKey("PaymentMethodId"); - - b.HasOne("Webshop.Domain.Entities.Address", "ShippingAddress") - .WithMany() - .HasForeignKey("ShippingAddressId") - .OnDelete(DeleteBehavior.Restrict) - .IsRequired(); - - b.HasOne("Webshop.Domain.Entities.ShippingMethod", "ShippingMethodInfo") - .WithMany() - .HasForeignKey("ShippingMethodId"); - - b.Navigation("BillingAddress"); - - b.Navigation("Customer"); - - b.Navigation("PaymentMethodInfo"); - - b.Navigation("ShippingAddress"); - - b.Navigation("ShippingMethodInfo"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.OrderItem", b => - { - b.HasOne("Webshop.Domain.Entities.Order", "Order") - .WithMany("OrderItems") - .HasForeignKey("OrderId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Webshop.Domain.Entities.Product", "Product") - .WithMany() - .HasForeignKey("ProductId") - .OnDelete(DeleteBehavior.SetNull); - - b.HasOne("Webshop.Domain.Entities.ProductVariant", "ProductVariant") - .WithMany() - .HasForeignKey("ProductVariantId") - .OnDelete(DeleteBehavior.SetNull); - - b.Navigation("Order"); - - b.Navigation("Product"); - - b.Navigation("ProductVariant"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Product", b => - { - b.HasOne("Webshop.Domain.Entities.Supplier", "Supplier") - .WithMany("Products") - .HasForeignKey("SupplierId"); - - b.Navigation("Supplier"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ProductCategory", b => - { - b.HasOne("Webshop.Domain.Entities.Category", "Category") - .WithMany("ProductCategories") - .HasForeignKey("CategoryId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Webshop.Domain.Entities.Product", "Product") - .WithMany("ProductCategories") - .HasForeignKey("ProductId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Category"); - - b.Navigation("Product"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ProductDiscount", b => - { - b.HasOne("Webshop.Domain.Entities.Discount", "Discount") - .WithMany("ProductDiscounts") - .HasForeignKey("DiscountId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.HasOne("Webshop.Domain.Entities.Product", "Product") - .WithMany("ProductDiscounts") - .HasForeignKey("ProductId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Discount"); - - b.Navigation("Product"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.ProductVariant", b => - { - b.HasOne("Webshop.Domain.Entities.Product", "Product") - .WithMany("Variants") - .HasForeignKey("ProductId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Product"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Review", b => - { - b.HasOne("Webshop.Domain.Entities.Customer", "Customer") - .WithMany("Reviews") - .HasForeignKey("CustomerId"); - - b.HasOne("Webshop.Domain.Entities.Product", "Product") - .WithMany("Reviews") - .HasForeignKey("ProductId") - .OnDelete(DeleteBehavior.Cascade) - .IsRequired(); - - b.Navigation("Customer"); - - b.Navigation("Product"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Supplier", b => - { - b.HasOne("Webshop.Domain.Entities.Address", "Address") - .WithMany() - .HasForeignKey("AddressId"); - - b.Navigation("Address"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Category", b => - { - b.Navigation("CategoryDiscounts"); - - b.Navigation("ProductCategories"); - - b.Navigation("SubCategories"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Customer", b => - { - b.Navigation("Addresses"); - - b.Navigation("Orders"); - - b.Navigation("Reviews"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Discount", b => - { - b.Navigation("CategoryDiscounts"); - - b.Navigation("ProductDiscounts"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Order", b => - { - b.Navigation("OrderItems"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Product", b => - { - b.Navigation("ProductCategories"); - - b.Navigation("ProductDiscounts"); - - b.Navigation("Reviews"); - - b.Navigation("Variants"); - }); - - modelBuilder.Entity("Webshop.Domain.Entities.Supplier", b => - { - b.Navigation("Products"); - }); - - modelBuilder.Entity("Webshop.Domain.Identity.ApplicationUser", b => - { - b.Navigation("Customer"); - }); -#pragma warning restore 612, 618 - } - } -} diff --git a/Webshop.Infrastructure/Repositories/ShippingMethodRepository.cs b/Webshop.Infrastructure/Repositories/ShippingMethodRepository.cs index b7ac008..9b9f1d1 100644 --- a/Webshop.Infrastructure/Repositories/ShippingMethodRepository.cs +++ b/Webshop.Infrastructure/Repositories/ShippingMethodRepository.cs @@ -1,11 +1,11 @@ -// Auto-generiert von CreateWebshopFiles.ps1 +// src/Webshop.Infrastructure/Repositories/ShippingMethodRepository.cs using Microsoft.EntityFrameworkCore; -using Webshop.Domain.Entities; -using Webshop.Domain.Interfaces; -using Webshop.Infrastructure.Data; using System; using System.Collections.Generic; using System.Threading.Tasks; +using Webshop.Domain.Entities; +using Webshop.Domain.Interfaces; +using Webshop.Infrastructure.Data; namespace Webshop.Infrastructure.Repositories { @@ -18,12 +18,15 @@ namespace Webshop.Infrastructure.Repositories _context = context; } - // Fügen Sie hier Repository-Methoden hinzu - // Beispiel: - // public async Task> GetAllAsync() { return await _context.Set().ToListAsync(); } - // public async Task GetByIdAsync(Guid id) { return await _context.Set().FindAsync(id); } - // public async Task AddAsync(T entity) { _context.Set().Add(entity); await _context.SaveChangesAsync(); } - // public async Task UpdateAsync(T entity) { _context.Set().Update(entity); await _context.SaveChangesAsync(); } - // public async Task DeleteAsync(Guid id) { var entity = await _context.Set().FindAsync(id); if (entity != null) { _context.Set().Remove(entity); await _context.SaveChangesAsync(); } } + public async Task> GetAllAsync() => await _context.ShippingMethods.ToListAsync(); + + public async Task GetByIdAsync(Guid id) // << HINZUFÜGEN >> + { + return await _context.ShippingMethods.FindAsync(id); + } + + public async Task AddAsync(ShippingMethod shippingMethod) { _context.ShippingMethods.Add(shippingMethod); await _context.SaveChangesAsync(); } + public async Task UpdateAsync(ShippingMethod shippingMethod) { _context.ShippingMethods.Update(shippingMethod); await _context.SaveChangesAsync(); } + public async Task DeleteAsync(Guid id) { var entity = await _context.ShippingMethods.FindAsync(id); if (entity != null) { _context.ShippingMethods.Remove(entity); await _context.SaveChangesAsync(); } } } -} +} \ No newline at end of file