Files
imprink/src/Imprink.Application/Products/Query/GetProductVariantsHandler.cs
2025-06-06 19:43:51 +03:00

69 lines
2.4 KiB
C#

using Imprink.Application.Products.Dtos;
using Imprink.Domain.Entities.Product;
using MediatR;
namespace Imprink.Application.Products.Query;
public class GetProductVariantsQuery : IRequest<IEnumerable<ProductVariantDto>>
{
public Guid? ProductId { get; set; }
public bool? IsActive { get; set; }
public bool InStockOnly { get; set; } = false;
}
public class GetProductVariantsHandler(IUnitOfWork unitOfWork)
: IRequestHandler<GetProductVariantsQuery, IEnumerable<ProductVariantDto>>
{
public async Task<IEnumerable<ProductVariantDto>> Handle(GetProductVariantsQuery request, CancellationToken cancellationToken)
{
IEnumerable<ProductVariant> variants;
if (request.ProductId.HasValue)
{
if (request.InStockOnly)
{
variants = await unitOfWork.ProductVariantRepository.GetInStockByProductIdAsync(request.ProductId.Value, cancellationToken);
}
else if (request.IsActive.HasValue && request.IsActive.Value)
{
variants = await unitOfWork.ProductVariantRepository.GetActiveByProductIdAsync(request.ProductId.Value, cancellationToken);
}
else
{
variants = await unitOfWork.ProductVariantRepository.GetByProductIdAsync(request.ProductId.Value, cancellationToken);
}
}
else
{
variants = new List<ProductVariant>();
}
return variants.Select(pv => new ProductVariantDto
{
Id = pv.Id,
ProductId = pv.ProductId,
Size = pv.Size,
Color = pv.Color,
Price = pv.Price,
ImageUrl = pv.ImageUrl,
Sku = pv.Sku,
StockQuantity = pv.StockQuantity,
IsActive = pv.IsActive,
Product = new ProductDto
{
Id = pv.Product.Id,
Name = pv.Product.Name,
Description = pv.Product.Description,
BasePrice = pv.Product.BasePrice,
IsCustomizable = pv.Product.IsCustomizable,
IsActive = pv.Product.IsActive,
ImageUrl = pv.Product.ImageUrl,
CategoryId = pv.Product.CategoryId,
CreatedAt = pv.Product.CreatedAt,
ModifiedAt = pv.Product.ModifiedAt
},
CreatedAt = pv.CreatedAt,
ModifiedAt = pv.ModifiedAt
});
}
}