Add Get queries for variants and categories

This commit is contained in:
lumijiez
2025-05-27 13:26:38 +03:00
parent 6e59f46cf0
commit a30ada5061
8 changed files with 276 additions and 12 deletions

View File

@@ -0,0 +1,40 @@
using MediatR;
using Printbase.Application.Products.Dtos;
using Printbase.Application.Products.Queries;
namespace Printbase.Application.Products.Handlers;
public class GetCategoriesHandler(IUnitOfWork unitOfWork)
: IRequestHandler<GetCategoriesQuery, IEnumerable<CategoryDto>>
{
public async Task<IEnumerable<CategoryDto>> Handle(GetCategoriesQuery request, CancellationToken cancellationToken)
{
IEnumerable<Domain.Entities.Product.Category> categories;
if (request.RootCategoriesOnly)
{
categories = await unitOfWork.CategoryRepository.GetRootCategoriesAsync(cancellationToken);
}
else if (request.IsActive.HasValue && request.IsActive.Value)
{
categories = await unitOfWork.CategoryRepository.GetActiveAsync(cancellationToken);
}
else
{
categories = await unitOfWork.CategoryRepository.GetAllAsync(cancellationToken);
}
return categories.Select(c => new CategoryDto
{
Id = c.Id,
Name = c.Name,
Description = c.Description,
ImageUrl = c.ImageUrl,
SortOrder = c.SortOrder,
IsActive = c.IsActive,
ParentCategoryId = c.ParentCategoryId,
CreatedAt = c.CreatedAt,
ModifiedAt = c.ModifiedAt
});
}
}

View File

@@ -0,0 +1,62 @@
using MediatR;
using Printbase.Application.Products.Dtos;
using Printbase.Application.Products.Queries;
namespace Printbase.Application.Products.Handlers;
public class GetProductVariantsHandler(IUnitOfWork unitOfWork)
: IRequestHandler<GetProductVariantsQuery, IEnumerable<ProductVariantDto>>
{
public async Task<IEnumerable<ProductVariantDto>> Handle(GetProductVariantsQuery request, CancellationToken cancellationToken)
{
IEnumerable<Domain.Entities.Product.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<Domain.Entities.Product.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
});
}
}

View File

@@ -0,0 +1,10 @@
using MediatR;
using Printbase.Application.Products.Dtos;
namespace Printbase.Application.Products.Queries;
public class GetCategoriesQuery : IRequest<IEnumerable<CategoryDto>>
{
public bool? IsActive { get; set; }
public bool RootCategoriesOnly { get; set; } = false;
}

View File

@@ -0,0 +1,11 @@
using MediatR;
using Printbase.Application.Products.Dtos;
namespace Printbase.Application.Products.Queries;
public class GetProductVariantsQuery : IRequest<IEnumerable<ProductVariantDto>>
{
public Guid? ProductId { get; set; }
public bool? IsActive { get; set; }
public bool InStockOnly { get; set; } = false;
}