namespace NetinaShop.Repository.Handlers.Discounts; public class UpdateDiscountCommandHandler : IRequestHandler { private readonly IRepositoryWrapper _repositoryWrapper; public UpdateDiscountCommandHandler(IRepositoryWrapper repositoryWrapper) { _repositoryWrapper = repositoryWrapper; } public async Task Handle(UpdateDiscountCommand request, CancellationToken cancellationToken) { switch (request.Type) { case DiscountType.All: var ent = await _repositoryWrapper.SetRepository().TableNoTracking.FirstOrDefaultAsync(d=>d.Id==request.Id,cancellationToken); if (ent == null) throw new AppException("Discount not found", ApiResultStatusCode.NotFound); var newEnt = Discount.Create(request.Code, request.DiscountPercent, request.DiscountAmount, request.HasCode, request.AmountType, request.Type, request.Count, request.StartDate, request.ExpireDate, request.PriceFloor, request.HasPriceFloor, request.PriceCeiling, request.HasPriceCeiling, request.IsInfinity, request.UseCount, request.IsForInvitation); newEnt.Id = ent.Id; _repositoryWrapper.SetRepository().Update(newEnt); break; case DiscountType.Category: var catEnt = await _repositoryWrapper.SetRepository().TableNoTracking.FirstOrDefaultAsync(d => d.Id == request.Id, cancellationToken); if (catEnt == null) throw new AppException("Discount not found", ApiResultStatusCode.NotFound); var catDis = CategoryDiscount.Create(request.Code, request.DiscountPercent, request.DiscountAmount, request.HasCode, request.AmountType, request.Type, request.Count, request.StartDate, request.ExpireDate, request.PriceFloor, request.HasPriceFloor, request.PriceCeiling, request.HasPriceCeiling, request.IsInfinity, request.UseCount, request.IsForInvitation, request.CategoryId); catDis.Id = catEnt.Id; _repositoryWrapper.SetRepository().Update(catDis); break; case DiscountType.Product: var productEnt = await _repositoryWrapper.SetRepository().TableNoTracking.FirstOrDefaultAsync(d => d.Id == request.Id, cancellationToken); if (productEnt == null) throw new AppException("Discount not found", ApiResultStatusCode.NotFound); var productDis = ProductDiscount.Create(request.Code, request.DiscountPercent, request.DiscountAmount, request.HasCode, request.AmountType, request.Type, request.Count, request.StartDate, request.ExpireDate, request.PriceFloor, request.HasPriceFloor, request.PriceCeiling, request.HasPriceCeiling, request.IsInfinity, request.UseCount, request.IsForInvitation, request.ProductId); productDis.Id = productEnt.Id; _repositoryWrapper.SetRepository().Update(productDis); break; } await _repositoryWrapper.SaveChangesAsync(cancellationToken); return true; } }