public static TryAsync <List <CsvTransactionModel> > GetCsvTransactionModel(this SaveCsvCommand command) { return(TryAsync(() => { using TextReader reader = new StreamReader(command.Stream); using var csv = new CsvReader(reader, CultureInfo.CurrentCulture); var goodRows = new List <CsvTransactionModel>(); var badRows = new List <string>(); csv.Configuration.RegisterClassMap <CsvTransactionMap>(); while (csv.Read()) { try { var record = csv.GetRecord <CsvTransactionModel>(); goodRows.Add(record); } catch (Exception e) { badRows.Add($"{e.InnerException?.Message ?? e.Message}\nBroken row:\n{csv.Context.RawRecord}"); } } if (badRows.Any()) { throw new ArgumentException(badRows.Aggregate("CSV import failed with message:\n", (first, second) => $"{first}{second}\n")); } return goodRows.AsTask(); })); }
public async Task Handle_WithValidParams_ShouldReturnSuccess() { #region Arrange var transactionRepositoryMock = new Mock <ITransactionRepository>(); var csvTransactionDxoMock = new Mock <CsvTransactionDxo>(); var mediatorMock = new Mock <IMediator>(); var csvTransactionServiceMock = new Mock <ICsvTransactionService>(); await using var stream = new MemoryStream(); var saveCsvCommand = new SaveCsvCommand(stream); #endregion #region Act var sut = new SaveCsvCommandHandler(transactionRepositoryMock.Object, csvTransactionDxoMock.Object, mediatorMock.Object, csvTransactionServiceMock.Object); var Result = await sut.Handle(saveCsvCommand, CancellationToken.None); #endregion #region Assert Assert.False(Result.IsDefault()); #endregion }
public Task <IActionResult> SaveCsv(IFormFile formFile) { return(TryOptionAsync(formFile .ToSome() .Filter(file => file.ContentType != "application/vnd.ms-excel") .Reduce((file, file1) => file) .Apply(file => CommandAsync(SaveCsvCommand.CreateInstance(file.OpenReadStream())) .MapT(unit1 => Ok()))) .Match(Some: (some) => { return some.Match(unit1 => unit1, error => (IActionResult)BadRequest(error)); }, None: () => ((IActionResult)UnprocessableEntity("Unknown format")).AsTask(), Fail: (error) => ((IActionResult)BadRequest(error.Message)).AsTask()) .Bind(task => task)); }
public Task <EitherAsync <Error, Unit> > Handle(SaveCsvCommand request, CancellationToken cancellationToken) { return(_csvTransactionService.GetCsvTransactionModel(request) .Bind(csvTransactionModel => _csvTransactionDxo.MapTransaction(csvTransactionModel)) .Bind(transactions => _transactionRepository.CreateAsync(transactions)) .Bind(transactions => _transactionRepository.SaveAsync()) .Match(unit1 => unit1, error => { _mediator.Publish(SaveCsvFailedEvent.CreateInstance(error.Message), cancellationToken).ToUnit(); return EitherAsync <Error, Unit> .Left(error); })); }
public TryAsync <List <CsvTransactionModel> > GetCsvTransactionModel(SaveCsvCommand command) { return(command.GetCsvTransactionModel()); }