public async Task Update(Guid paymentFormId, PaymentFormUpdateDto paymentFormUpdateDto) { var spec = new PaymentFormIdSpecification(paymentFormId); var paymentForm = await paymentFormDataService.Get(spec); var existedFiles = paymentForm.Items .SelectMany(i => i.Files) .ToDictionary(f => f.Id); var files = paymentFormUpdateDto.Items .SelectMany(i => i.Files, (pfDto, f) => new { Item = pfDto, FileDto = f }) .Select(f => new { f.Item, f.FileDto, File = f.FileDto.Id.HasValue ? existedFiles[f.FileDto.Id.Value] : fileBuilder.Build(f.FileDto.File) }) .ToArray(); var newFilesToSave = files.Where(f => !f.FileDto.Id.HasValue) .Select(f => new { Bytes = Convert.FromBase64String(f.FileDto.File.FileInBase64), f.File.WayToFile }); await Task.WhenAll(newFilesToSave.Select(f => fileStorageService.Save( new MemoryStream(f.Bytes), f.WayToFile))); var existedItems = paymentForm.Items.ToDictionary(i => i.Id); var items = paymentFormUpdateDto.Items .GroupJoin(files, p => p, p => p.Item, (dto, fs) => dto.Id.HasValue ? paymentPositionUpdateBuilder.Map(dto, fs.Select(f => f.File).ToArray(), existedItems[dto.Id.Value]) : paymentPositionUpdateBuilder.Build(dto, fs.Select(f => f.File).ToArray())) .ToArray(); paymentFormUpdateBuilder.Map(paymentFormUpdateDto, items, paymentForm); await paymentFormDataService.Update(paymentForm); var resultFileIds = new HashSet <Guid>(paymentForm.Items.SelectMany(i => i.Files, (position, file) => file.Id)); foreach (var file in existedFiles.Values.Where(f => !resultFileIds.Contains(f.Id))) { await fileStorageService.Delete(file.WayToFile); } }
public async Task Update(Guid id, [FromBody] PaymentFormUpdateDto paymentFormUpdateDto) { await paymentFormAppService.Update(id, paymentFormUpdateDto); }