diff --git a/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Csv/ICsvReader.cs b/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Csv/ICsvReader.cs index e498900ca..c3e51237e 100644 --- a/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Csv/ICsvReader.cs +++ b/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Csv/ICsvReader.cs @@ -1,9 +1,14 @@ -using System.Collections.Generic; -using System.IO; +using System.IO; +using System.Threading.Tasks; namespace ClassifiedAds.CrossCuttingConcerns.Csv; public interface ICsvReader + where T : ICsvResponse { - IEnumerable Read(Stream stream); + Task ReadAsync(Stream stream); } + +public interface ICsvResponse +{ +} \ No newline at end of file diff --git a/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Csv/ICsvWriter.cs b/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Csv/ICsvWriter.cs index f726a82e4..078ea0dcd 100644 --- a/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Csv/ICsvWriter.cs +++ b/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Csv/ICsvWriter.cs @@ -1,9 +1,14 @@ -using System.Collections.Generic; -using System.IO; +using System.IO; +using System.Threading.Tasks; namespace ClassifiedAds.CrossCuttingConcerns.Csv; public interface ICsvWriter + where T : ICsvRequest { - void Write(IEnumerable collection, Stream stream); + Task WriteAsync(T data, Stream stream); } + +public interface ICsvRequest +{ +} \ No newline at end of file diff --git a/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Excel/IExcelReader.cs b/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Excel/IExcelReader.cs index ee57a30df..71c0934cf 100644 --- a/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Excel/IExcelReader.cs +++ b/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Excel/IExcelReader.cs @@ -1,8 +1,14 @@ using System.IO; +using System.Threading.Tasks; namespace ClassifiedAds.CrossCuttingConcerns.Excel; public interface IExcelReader + where T : IExcelResponse +{ + Task ReadAsync(Stream stream); +} + +public interface IExcelResponse { - T Read(Stream stream); } diff --git a/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Excel/IExcelWriter.cs b/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Excel/IExcelWriter.cs index a42031f4b..536e8ca14 100644 --- a/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Excel/IExcelWriter.cs +++ b/src/ModularMonolith/ClassifiedAds.CrossCuttingConcerns/Excel/IExcelWriter.cs @@ -1,8 +1,14 @@ using System.IO; +using System.Threading.Tasks; namespace ClassifiedAds.CrossCuttingConcerns.Excel; public interface IExcelWriter + where T : IExcelRequest { - void Write(T data, Stream stream); + Task WriteAsync(T data, Stream stream); } + +public interface IExcelRequest +{ +} \ No newline at end of file diff --git a/src/ModularMonolith/ClassifiedAds.Infrastructure/Csv/CsvReader.cs b/src/ModularMonolith/ClassifiedAds.Infrastructure/Csv/CsvReader.cs deleted file mode 100644 index fac48811c..000000000 --- a/src/ModularMonolith/ClassifiedAds.Infrastructure/Csv/CsvReader.cs +++ /dev/null @@ -1,17 +0,0 @@ -using ClassifiedAds.CrossCuttingConcerns.Csv; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; - -namespace ClassifiedAds.Infrastructure.Csv; - -public class CsvReader : ICsvReader -{ - public IEnumerable Read(Stream stream) - { - using var reader = new StreamReader(stream); - using var csv = new CsvHelper.CsvReader(reader, CultureInfo.InvariantCulture); - return csv.GetRecords().ToList(); - } -} diff --git a/src/ModularMonolith/ClassifiedAds.Infrastructure/Csv/CsvWriter.cs b/src/ModularMonolith/ClassifiedAds.Infrastructure/Csv/CsvWriter.cs deleted file mode 100644 index ca1e0a8c6..000000000 --- a/src/ModularMonolith/ClassifiedAds.Infrastructure/Csv/CsvWriter.cs +++ /dev/null @@ -1,16 +0,0 @@ -using ClassifiedAds.CrossCuttingConcerns.Csv; -using System.Collections.Generic; -using System.Globalization; -using System.IO; - -namespace ClassifiedAds.Infrastructure.Csv; - -public class CsvWriter : ICsvWriter -{ - public void Write(IEnumerable collection, Stream stream) - { - using var writer = new StreamWriter(stream); - using var csv = new CsvHelper.CsvWriter(writer, CultureInfo.InvariantCulture); - csv.WriteRecords(collection); - } -} diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/ConfigurationModuleServiceCollectionExtensions.cs b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/ConfigurationModuleServiceCollectionExtensions.cs index 54090af77..0ed9be659 100644 --- a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/ConfigurationModuleServiceCollectionExtensions.cs +++ b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/ConfigurationModuleServiceCollectionExtensions.cs @@ -3,12 +3,12 @@ using ClassifiedAds.Modules.Configuration.Authorization; using ClassifiedAds.Modules.Configuration.ConfigurationOptions; using ClassifiedAds.Modules.Configuration.Entities; +using ClassifiedAds.Modules.Configuration.Excel; using ClassifiedAds.Modules.Configuration.Excel.ClosedXML; using ClassifiedAds.Modules.Configuration.Repositories; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using System; -using System.Collections.Generic; using System.Reflection; namespace Microsoft.Extensions.DependencyInjection; @@ -35,8 +35,8 @@ public static IServiceCollection AddConfigurationModule(this IServiceCollection services.AddAuthorizationPolicies(Assembly.GetExecutingAssembly(), AuthorizationPolicyNames.GetPolicyNames()); - services.AddScoped>, ConfigurationEntryExcelReader>(); - services.AddScoped>, ConfigurationEntryExcelWriter>(); + services.AddScoped, ImportConfigurationEntriesFromExcelHandler>(); + services.AddScoped, ExportConfigurationEntriesToExcelHandler>(); return services; } diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Controllers/ConfigurationEntriesController.cs b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Controllers/ConfigurationEntriesController.cs index bd148d974..9d1d4281b 100644 --- a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Controllers/ConfigurationEntriesController.cs +++ b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Controllers/ConfigurationEntriesController.cs @@ -3,6 +3,7 @@ using ClassifiedAds.Modules.Configuration.Authorization; using ClassifiedAds.Modules.Configuration.ConfigurationOptions; using ClassifiedAds.Modules.Configuration.Entities; +using ClassifiedAds.Modules.Configuration.Excel; using ClassifiedAds.Modules.Configuration.Models; using CryptographyHelper; using CryptographyHelper.AsymmetricAlgorithms; @@ -29,14 +30,14 @@ public class ConfigurationEntriesController : ControllerBase private readonly Dispatcher _dispatcher; private readonly ILogger _logger; private readonly ConfigurationModuleOptions _moduleOptions; - private readonly IExcelWriter> _configurationEntriesExcelWriter; - private readonly IExcelReader> _configurationEntriesExcelReader; + private readonly IExcelWriter _configurationEntriesExcelWriter; + private readonly IExcelReader _configurationEntriesExcelReader; public ConfigurationEntriesController(Dispatcher dispatcher, ILogger logger, IOptionsSnapshot moduleOptions, - IExcelWriter> configurationEntriesExcelWriter, - IExcelReader> configurationEntriesExcelReader) + IExcelWriter configurationEntriesExcelWriter, + IExcelReader configurationEntriesExcelReader) { _dispatcher = dispatcher; _logger = logger; @@ -131,17 +132,17 @@ public async Task ExportAsExcel() { var entries = await _dispatcher.DispatchAsync(new GetEntititesQuery()); using var stream = new MemoryStream(); - _configurationEntriesExcelWriter.Write(entries, stream); + await _configurationEntriesExcelWriter.WriteAsync(new ExportConfigurationEntriesToExcel { ConfigurationEntries = entries }, stream); return File(stream.ToArray(), MediaTypeNames.Application.Octet, "ConfigurationEntries.xlsx"); } [HttpPost("ImportExcel")] - public IActionResult ImportExcel([FromForm] UploadFileModel model) + public async Task ImportExcel([FromForm] UploadFileModel model) { using var stream = model.FormFile.OpenReadStream(); - var entries = _configurationEntriesExcelReader.Read(stream); + var entries = await _configurationEntriesExcelReader.ReadAsync(stream); // TODO: import to database - return Ok(entries); + return Ok(entries.ConfigurationEntries); } } diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ClosedXML/ConfigurationEntryExcelWriter.cs b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ClosedXML/ExportConfigurationEntriesToExcelHandler.cs similarity index 67% rename from src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ClosedXML/ConfigurationEntryExcelWriter.cs rename to src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ClosedXML/ExportConfigurationEntriesToExcelHandler.cs index 4d56d39fd..0e644c16a 100644 --- a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ClosedXML/ConfigurationEntryExcelWriter.cs +++ b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ClosedXML/ExportConfigurationEntriesToExcelHandler.cs @@ -1,14 +1,13 @@ using ClassifiedAds.CrossCuttingConcerns.Excel; -using ClassifiedAds.Modules.Configuration.Entities; using ClosedXML.Excel; -using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; namespace ClassifiedAds.Modules.Configuration.Excel.ClosedXML; -public class ConfigurationEntryExcelWriter : IExcelWriter> +public class ExportConfigurationEntriesToExcelHandler : IExcelWriter { - public void Write(List data, Stream stream) + public Task WriteAsync(ExportConfigurationEntriesToExcel data, Stream stream) { using var workbook = new XLWorkbook(); var worksheet = workbook.Worksheets.Add("Sheet1"); @@ -18,7 +17,7 @@ public void Write(List data, Stream stream) worksheet.Range("A1:B1").Style.Font.Bold = true; int i = 2; - foreach (var row in data) + foreach (var row in data.ConfigurationEntries) { worksheet.Cell("A" + i).Value = row.Key; worksheet.Cell("B" + i).Value = row.Value; @@ -26,5 +25,7 @@ public void Write(List data, Stream stream) } workbook.SaveAs(stream); + + return Task.CompletedTask; } } diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ClosedXML/ConfigurationEntryExcelReader.cs b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ClosedXML/ImportConfigurationEntriesFromExcelHandler.cs similarity index 76% rename from src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ClosedXML/ConfigurationEntryExcelReader.cs rename to src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ClosedXML/ImportConfigurationEntriesFromExcelHandler.cs index ec800a433..16c0db6a5 100644 --- a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ClosedXML/ConfigurationEntryExcelReader.cs +++ b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ClosedXML/ImportConfigurationEntriesFromExcelHandler.cs @@ -1,16 +1,27 @@ using ClassifiedAds.CrossCuttingConcerns.Excel; using ClassifiedAds.CrossCuttingConcerns.Exceptions; using ClassifiedAds.Modules.Configuration.Entities; +using ClassifiedAds.Modules.Configuration.Excel; using ClosedXML.Excel; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace ClassifiedAds.Modules.Configuration.Excel.ClosedXML; -public class ConfigurationEntryExcelReader : IExcelReader> +public class ImportConfigurationEntriesFromExcelHandler : IExcelReader { - public List Read(Stream stream) + private static Dictionary GetCorrectHeaders() + { + return new Dictionary + { + { "A", "Key" }, + { "B", "Value" }, + }; + } + + public Task ReadAsync(Stream stream) { using var workbook = new XLWorkbook(stream); var worksheet = workbook.Worksheets.First(); @@ -34,15 +45,6 @@ public List Read(Stream stream) rows.Add(row); } - return rows; - } - - private static Dictionary GetCorrectHeaders() - { - return new Dictionary - { - { "A", "Key" }, - { "B", "Value" }, - }; + return Task.FromResult(new ImportConfigurationEntriesFromExcel { ConfigurationEntries = rows }); } } diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/EPPlus/ConfigurationEntryExcelWriter.cs b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/EPPlus/ExportConfigurationEntriesToExcelHandler.cs similarity index 66% rename from src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/EPPlus/ConfigurationEntryExcelWriter.cs rename to src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/EPPlus/ExportConfigurationEntriesToExcelHandler.cs index c7afc47e9..edaafab17 100644 --- a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/EPPlus/ConfigurationEntryExcelWriter.cs +++ b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/EPPlus/ExportConfigurationEntriesToExcelHandler.cs @@ -1,14 +1,13 @@ using ClassifiedAds.CrossCuttingConcerns.Excel; -using ClassifiedAds.Modules.Configuration.Entities; using OfficeOpenXml; -using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; namespace ClassifiedAds.Modules.Configuration.Excel.EPPlus; -public class ConfigurationEntryExcelWriter : IExcelWriter> +public class ExportConfigurationEntriesToExcelHandler : IExcelWriter { - public void Write(List data, Stream stream) + public Task WriteAsync(ExportConfigurationEntriesToExcel data, Stream stream) { using var pck = new ExcelPackage(); var worksheet = pck.Workbook.Worksheets.Add("Sheet1"); @@ -18,7 +17,7 @@ public void Write(List data, Stream stream) worksheet.Cells["A1:B1"].Style.Font.Bold = true; int i = 2; - foreach (var row in data) + foreach (var row in data.ConfigurationEntries) { worksheet.Cells["A" + i].Value = row.Key; worksheet.Cells["B" + i].Value = row.Value; @@ -26,5 +25,7 @@ public void Write(List data, Stream stream) } pck.SaveAs(stream); + + return Task.CompletedTask; } } diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/EPPlus/ConfigurationEntryExcelReader.cs b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/EPPlus/ImportConfigurationEntriesFromExcelHandler.cs similarity index 78% rename from src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/EPPlus/ConfigurationEntryExcelReader.cs rename to src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/EPPlus/ImportConfigurationEntriesFromExcelHandler.cs index 36e3fa946..1b74a64f6 100644 --- a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/EPPlus/ConfigurationEntryExcelReader.cs +++ b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/EPPlus/ImportConfigurationEntriesFromExcelHandler.cs @@ -5,12 +5,22 @@ using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading.Tasks; namespace ClassifiedAds.Modules.Configuration.Excel.EPPlus; -public class ConfigurationEntryExcelReader : IExcelReader> +public class ImportConfigurationEntriesFromExcelHandler : IExcelReader { - public List Read(Stream stream) + private static Dictionary GetCorrectHeaders() + { + return new Dictionary + { + { "A", "Key" }, + { "B", "Value" }, + }; + } + + public Task ReadAsync(Stream stream) { using var pck = new ExcelPackage(stream); var worksheet = pck.Workbook.Worksheets.First(); @@ -34,15 +44,6 @@ public List Read(Stream stream) rows.Add(row); } - return rows; - } - - private static Dictionary GetCorrectHeaders() - { - return new Dictionary - { - { "A", "Key" }, - { "B", "Value" }, - }; + return Task.FromResult(new ImportConfigurationEntriesFromExcel { ConfigurationEntries = rows }); } } diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ExcelDataReader/ConfigurationEntryExcelReader.cs b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ExcelDataReader/ImportConfigurationEntriesFromExcelHandler.cs similarity index 86% rename from src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ExcelDataReader/ConfigurationEntryExcelReader.cs rename to src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ExcelDataReader/ImportConfigurationEntriesFromExcelHandler.cs index c556d95fd..ebb780527 100644 --- a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ExcelDataReader/ConfigurationEntryExcelReader.cs +++ b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ExcelDataReader/ImportConfigurationEntriesFromExcelHandler.cs @@ -5,12 +5,22 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; namespace ClassifiedAds.Modules.Configuration.Excel.ExcelDataReader; -public class ConfigurationEntryExcelReader : IExcelReader> +public class ImportConfigurationEntriesFromExcelHandler : IExcelReader { - public List Read(Stream stream) + private static Dictionary GetCorrectHeaders() + { + return new Dictionary + { + { 0, "Key" }, + { 1, "Value" }, + }; + } + + public Task ReadAsync(Stream stream) { var rows = new List(); int headerIndex = 0; @@ -63,15 +73,6 @@ public List Read(Stream stream) while (reader.NextResult()); } - return rows; - } - - private static Dictionary GetCorrectHeaders() - { - return new Dictionary - { - { 0, "Key" }, - { 1, "Value" }, - }; + return Task.FromResult(new ImportConfigurationEntriesFromExcel { ConfigurationEntries = rows }); } } diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ExportConfigurationEntriesToExcel.cs b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ExportConfigurationEntriesToExcel.cs new file mode 100644 index 000000000..a0c5d363c --- /dev/null +++ b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ExportConfigurationEntriesToExcel.cs @@ -0,0 +1,10 @@ +using ClassifiedAds.CrossCuttingConcerns.Excel; +using ClassifiedAds.Modules.Configuration.Entities; +using System.Collections.Generic; + +namespace ClassifiedAds.Modules.Configuration.Excel; + +public class ExportConfigurationEntriesToExcel : IExcelRequest +{ + public List ConfigurationEntries { get; set; } +} diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ImportConfigurationEntriesFromExcel.cs b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ImportConfigurationEntriesFromExcel.cs new file mode 100644 index 000000000..f0e65c0e5 --- /dev/null +++ b/src/ModularMonolith/ClassifiedAds.Modules.Configuration/Excel/ImportConfigurationEntriesFromExcel.cs @@ -0,0 +1,10 @@ +using ClassifiedAds.CrossCuttingConcerns.Excel; +using ClassifiedAds.Modules.Configuration.Entities; +using System.Collections.Generic; + +namespace ClassifiedAds.Modules.Configuration.Excel; + +public class ImportConfigurationEntriesFromExcel : IExcelResponse +{ + public List ConfigurationEntries { get; set; } +} diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Product/Controllers/ProductsController.cs b/src/ModularMonolith/ClassifiedAds.Modules.Product/Controllers/ProductsController.cs index a10d5e74d..d2e075394 100644 --- a/src/ModularMonolith/ClassifiedAds.Modules.Product/Controllers/ProductsController.cs +++ b/src/ModularMonolith/ClassifiedAds.Modules.Product/Controllers/ProductsController.cs @@ -5,6 +5,7 @@ using ClassifiedAds.CrossCuttingConcerns.PdfConverter; using ClassifiedAds.Modules.Product.Authorization; using ClassifiedAds.Modules.Product.Commands; +using ClassifiedAds.Modules.Product.Csv; using ClassifiedAds.Modules.Product.Models; using ClassifiedAds.Modules.Product.Queries; using ClassifiedAds.Modules.Product.RateLimiterPolicies; @@ -34,15 +35,15 @@ public class ProductsController : ControllerBase private readonly ILogger _logger; private readonly IHtmlGenerator _htmlGenerator; private readonly IPdfConverter _pdfConverter; - private readonly ICsvWriter _productCsvWriter; - private readonly ICsvReader _productCsvReader; + private readonly ICsvWriter _productCsvWriter; + private readonly ICsvReader _productCsvReader; public ProductsController(Dispatcher dispatcher, ILogger logger, IHtmlGenerator htmlGenerator, IPdfConverter pdfConverter, - ICsvWriter productCsvWriter, - ICsvReader productCsvReader) + ICsvWriter productCsvWriter, + ICsvReader productCsvReader) { _dispatcher = dispatcher; _logger = logger; @@ -170,19 +171,18 @@ public async Task ExportAsPdf() public async Task ExportAsCsv() { var products = await _dispatcher.DispatchAsync(new GetProductsQuery()); - var model = products.ToModels(); using var stream = new MemoryStream(); - _productCsvWriter.Write(model, stream); + await _productCsvWriter.WriteAsync(new ExportProductsToCsv { Products = products }, stream); return File(stream.ToArray(), MediaTypeNames.Application.Octet, "Products.csv"); } [HttpPost("importcsv")] - public IActionResult ImportCsv([FromForm] UploadFileModel model) + public async Task ImportCsv([FromForm] UploadFileModel model) { using var stream = model.FormFile.OpenReadStream(); - var products = _productCsvReader.Read(stream); + var result = await _productCsvReader.ReadAsync(stream); // TODO: import to database - return Ok(products); + return Ok(result.Products); } } \ No newline at end of file diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Product/Csv/ExportProductsToCsv.cs b/src/ModularMonolith/ClassifiedAds.Modules.Product/Csv/ExportProductsToCsv.cs new file mode 100644 index 000000000..ba476b6b1 --- /dev/null +++ b/src/ModularMonolith/ClassifiedAds.Modules.Product/Csv/ExportProductsToCsv.cs @@ -0,0 +1,9 @@ +using ClassifiedAds.CrossCuttingConcerns.Csv; +using System.Collections.Generic; + +namespace ClassifiedAds.Modules.Product.Csv; + +public record ExportProductsToCsv : ICsvRequest +{ + public List Products { get; set; } +} diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Product/Csv/ExportProductsToCsvHandler.cs b/src/ModularMonolith/ClassifiedAds.Modules.Product/Csv/ExportProductsToCsvHandler.cs new file mode 100644 index 000000000..780340569 --- /dev/null +++ b/src/ModularMonolith/ClassifiedAds.Modules.Product/Csv/ExportProductsToCsvHandler.cs @@ -0,0 +1,18 @@ +using ClassifiedAds.CrossCuttingConcerns.Csv; +using System.Globalization; +using System.IO; +using System.Threading.Tasks; + +namespace ClassifiedAds.Modules.Product.Csv; + +public class ExportProductsToCsvHandler : ICsvWriter +{ + public Task WriteAsync(ExportProductsToCsv data, Stream stream) + { + using var writer = new StreamWriter(stream); + using var csv = new CsvHelper.CsvWriter(writer, CultureInfo.InvariantCulture); + csv.WriteRecords(data.Products); + + return Task.CompletedTask; + } +} diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Product/Csv/ImportProductsFromCsv.cs b/src/ModularMonolith/ClassifiedAds.Modules.Product/Csv/ImportProductsFromCsv.cs new file mode 100644 index 000000000..ba4654960 --- /dev/null +++ b/src/ModularMonolith/ClassifiedAds.Modules.Product/Csv/ImportProductsFromCsv.cs @@ -0,0 +1,9 @@ +using ClassifiedAds.CrossCuttingConcerns.Csv; +using System.Collections.Generic; + +namespace ClassifiedAds.Modules.Product.Csv; + +public record ImportProductsFromCsv : ICsvResponse +{ + public List Products { get; set; } +} diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Product/Csv/ImportProductsFromCsvHandler.cs b/src/ModularMonolith/ClassifiedAds.Modules.Product/Csv/ImportProductsFromCsvHandler.cs new file mode 100644 index 000000000..ae61ecb8a --- /dev/null +++ b/src/ModularMonolith/ClassifiedAds.Modules.Product/Csv/ImportProductsFromCsvHandler.cs @@ -0,0 +1,31 @@ +using ClassifiedAds.CrossCuttingConcerns.Csv; +using CsvHelper.Configuration; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Threading.Tasks; + +namespace ClassifiedAds.Modules.Product.Csv; + +public class ImportProductsFromCsvHandler : ICsvReader +{ + public Task ReadAsync(Stream stream) + { + using var reader = new StreamReader(stream); + + var config = new CsvConfiguration(CultureInfo.InvariantCulture) + { + HeaderValidated = null, + MissingFieldFound = null, + }; + + using var csv = new CsvHelper.CsvReader(reader, config); + + var response = new ImportProductsFromCsv + { + Products = csv.GetRecords().ToList(), + }; + + return Task.FromResult(response); + } +} diff --git a/src/ModularMonolith/ClassifiedAds.Modules.Product/ProductModuleServiceCollectionExtensions.cs b/src/ModularMonolith/ClassifiedAds.Modules.Product/ProductModuleServiceCollectionExtensions.cs index 6dfc9e306..be212749d 100644 --- a/src/ModularMonolith/ClassifiedAds.Modules.Product/ProductModuleServiceCollectionExtensions.cs +++ b/src/ModularMonolith/ClassifiedAds.Modules.Product/ProductModuleServiceCollectionExtensions.cs @@ -1,9 +1,9 @@ using ClassifiedAds.CrossCuttingConcerns.Csv; using ClassifiedAds.Domain.Infrastructure.MessageBrokers; using ClassifiedAds.Domain.Repositories; -using ClassifiedAds.Infrastructure.Csv; using ClassifiedAds.Modules.Product.Authorization; using ClassifiedAds.Modules.Product.ConfigurationOptions; +using ClassifiedAds.Modules.Product.Csv; using ClassifiedAds.Modules.Product.Entities; using ClassifiedAds.Modules.Product.HostedServices; using ClassifiedAds.Modules.Product.RateLimiterPolicies; @@ -47,8 +47,8 @@ public static IServiceCollection AddProductModule(this IServiceCollection servic options.AddPolicy(RateLimiterPolicyNames.DefaultPolicy); }); - services.AddScoped(typeof(ICsvReader<>), typeof(CsvReader<>)); - services.AddScoped(typeof(ICsvWriter<>), typeof(CsvWriter<>)); + services.AddScoped, ImportProductsFromCsvHandler>(); + services.AddScoped, ExportProductsToCsvHandler>(); return services; }