Exemple #1
0
        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
        }
Exemple #3
0
 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);
     }));
 }
Exemple #5
0
 public TryAsync <List <CsvTransactionModel> > GetCsvTransactionModel(SaveCsvCommand command)
 {
     return(command.GetCsvTransactionModel());
 }