public async Task <ValidationResult> ValidateUpdateProductVariant(UpdateProductVariantInput input) { ValidationResult validationResult = new(); foreach (var item in input.Variants) { if (string.IsNullOrWhiteSpace(item.Name)) { validationResult.Messages.Add(new(nameof(UpdateProductVariantInput.Variants), "Debe ingresar un nombre para la variante.")); } else if (item.Name.HasFileInvalidChars()) { validationResult.Messages.Add(new(nameof(UpdateProductVariantInput.Variants), "El nombre no puede contener caracteres invalidos (<, >, :, \", /, \\, |, ?, *).")); } else if (!item.Values.Any()) { validationResult.Messages.Add(new(nameof(UpdateProductVariantInput.Variants), "No se puede crear una variante sin valores.")); } else if (item.Values.GroupBy(x => x).Any(g => g.Count() > 1)) { validationResult.Messages.Add(new(nameof(UpdateProductVariantInput.Variants), "No pueden haber valores de una variante repetidos.")); } else if (SubCategoriesHasInvalidChars()) { validationResult.Messages.Add(new(nameof(UpdateProductVariantInput.Variants), "El nombre de los valores no puede contener caracteres invalidos (<, >, :, \", /, \\, |, ?, *).")); } bool SubCategoriesHasInvalidChars() { foreach (var value in item.Values) { if (value.HasFileInvalidChars()) { return(true); } } return(false); } } var product = await _productRepository.GetAsync(input.ProductId); if (product is null) { validationResult.Messages.Add(new(nameof(UpdateProductVariantInput.ProductId), "El producto no existe.")); } return(validationResult); }
public async Task <OperationResultEnumerable <ProductVariantDto> > UpdateAsync(UpdateProductVariantInput input) { var validationResult = await _productVariantValidator.ValidateUpdateProductVariant(input); if (validationResult.IsSuccess) { var taskGetVariants = _productVariantRepository.GetByProduct(new() { Id = input.ProductId }); foreach (var variant in input.Variants) { var entity = await _productVariantRepository.GetByNameAsync(new() { Id = input.ProductId }, variant.Name); if (entity is null) { await _productVariantRepository.CreateAsync(new() { Name = variant.Name, ProductId = input.ProductId, Values = variant.Values }); } else { await _productVariantRepository.UpdateAsync(new() { Id = entity.Id, Name = variant.Name, ProductId = input.ProductId, Values = variant.Values }); } } var variants = await taskGetVariants; var variantsToDelete = variants.Where(x => !input.Variants.Select(y => y.Name).Contains(x.Name)); foreach (var item in variantsToDelete) { await _productVariantRepository.RemoveAsync(item); } variants = await _productVariantRepository.GetByProduct(new() { Id = input.ProductId }); return(OperationResultEnumerable <ProductVariantDto> .Success(variants.Select(x => x.ConvertToDto()))); } return(OperationResultEnumerable <ProductVariantDto> .Fail(validationResult)); }
public async Task <IActionResult> Update(UpdateProductVariantInput input) { var result = await _service.UpdateAsync(input); return(new OperationActionResult(result)); }