From 3f374ac5bd32bcb6d030f6ceb3e592b99828ba39 Mon Sep 17 00:00:00 2001 From: DilmurodDeveloper Date: Wed, 23 Jul 2025 17:27:28 +0500 Subject: [PATCH] BROKERS: Implement Sheet --- .../ISheetBroker.ExternalPersonPetInput.cs | 12 +++++ .../Sheets/ISheetBroker.ExternalPersonPets.cs | 14 +++++ .../Brokers/Sheets/ISheetBroker.PersonXML.cs | 18 +++++++ xChanger.Api/Brokers/Sheets/ISheetBroker.cs | 10 ++++ .../SheetBroker.ExternalPersonPetInput.cs | 20 ++++++++ .../Sheets/SheetBroker.ExternalPersonPets.cs | 51 +++++++++++++++++++ .../Brokers/Sheets/SheetBroker.PersonXML.cs | 28 ++++++++++ xChanger.Api/Brokers/Sheets/SheetBroker.cs | 23 +++++++++ xChanger.Api/xChanger.Api.csproj | 1 + 9 files changed, 177 insertions(+) create mode 100644 xChanger.Api/Brokers/Sheets/ISheetBroker.ExternalPersonPetInput.cs create mode 100644 xChanger.Api/Brokers/Sheets/ISheetBroker.ExternalPersonPets.cs create mode 100644 xChanger.Api/Brokers/Sheets/ISheetBroker.PersonXML.cs create mode 100644 xChanger.Api/Brokers/Sheets/ISheetBroker.cs create mode 100644 xChanger.Api/Brokers/Sheets/SheetBroker.ExternalPersonPetInput.cs create mode 100644 xChanger.Api/Brokers/Sheets/SheetBroker.ExternalPersonPets.cs create mode 100644 xChanger.Api/Brokers/Sheets/SheetBroker.PersonXML.cs create mode 100644 xChanger.Api/Brokers/Sheets/SheetBroker.cs diff --git a/xChanger.Api/Brokers/Sheets/ISheetBroker.ExternalPersonPetInput.cs b/xChanger.Api/Brokers/Sheets/ISheetBroker.ExternalPersonPetInput.cs new file mode 100644 index 0000000..aec5a73 --- /dev/null +++ b/xChanger.Api/Brokers/Sheets/ISheetBroker.ExternalPersonPetInput.cs @@ -0,0 +1,12 @@ +//- - - - - - - - - - - - - - - - - - - - - - - - - - +// Copyright (c) Coalition of Good-Hearted Engineers +// Free to Use for Precise File Conversion +//- - - - - - - - - - - - - - - - - - - - - - - - - - + +namespace xChanger.Api.Brokers.Sheets +{ + public partial interface ISheetBroker + { + ValueTask UploadExternalPersonPetsFileAsync(IFormFile file); + } +} diff --git a/xChanger.Api/Brokers/Sheets/ISheetBroker.ExternalPersonPets.cs b/xChanger.Api/Brokers/Sheets/ISheetBroker.ExternalPersonPets.cs new file mode 100644 index 0000000..c46108d --- /dev/null +++ b/xChanger.Api/Brokers/Sheets/ISheetBroker.ExternalPersonPets.cs @@ -0,0 +1,14 @@ +//- - - - - - - - - - - - - - - - - - - - - - - - - - +// Copyright (c) Coalition of Good-Hearted Engineers +// Free to Use for Precise File Conversion +//- - - - - - - - - - - - - - - - - - - - - - - - - - + +using xChanger.Api.Models.Foundations.ExternalPersons; + +namespace xChanger.Api.Brokers.Sheets +{ + public partial interface ISheetBroker + { + ValueTask> ReadAllExternalPersonPetsAsync(); + } +} diff --git a/xChanger.Api/Brokers/Sheets/ISheetBroker.PersonXML.cs b/xChanger.Api/Brokers/Sheets/ISheetBroker.PersonXML.cs new file mode 100644 index 0000000..1e8abb6 --- /dev/null +++ b/xChanger.Api/Brokers/Sheets/ISheetBroker.PersonXML.cs @@ -0,0 +1,18 @@ +//- - - - - - - - - - - - - - - - - - - - - - - - - - +// Copyright (c) Coalition of Good-Hearted Engineers +// Free to Use for Precise File Conversion +//- - - - - - - - - - - - - - - - - - - - - - - - - - + +using xChanger.Api.Models.Foundations.Persons; + +namespace xChanger.Api.Brokers.Sheets +{ + public partial interface ISheetBroker + { + ValueTask SavePeopleWithPetsToXmlFile( + IEnumerable peopleWithPets, + string filePath); + + ValueTask RetrievePeopleWithPetsXmlFile(string filePath); + } +} diff --git a/xChanger.Api/Brokers/Sheets/ISheetBroker.cs b/xChanger.Api/Brokers/Sheets/ISheetBroker.cs new file mode 100644 index 0000000..0f31db4 --- /dev/null +++ b/xChanger.Api/Brokers/Sheets/ISheetBroker.cs @@ -0,0 +1,10 @@ +//- - - - - - - - - - - - - - - - - - - - - - - - - - +// Copyright (c) Coalition of Good-Hearted Engineers +// Free to Use for Precise File Conversion +//- - - - - - - - - - - - - - - - - - - - - - - - - - + +namespace xChanger.Api.Brokers.Sheets +{ + public partial interface ISheetBroker + { } +} diff --git a/xChanger.Api/Brokers/Sheets/SheetBroker.ExternalPersonPetInput.cs b/xChanger.Api/Brokers/Sheets/SheetBroker.ExternalPersonPetInput.cs new file mode 100644 index 0000000..a734ee1 --- /dev/null +++ b/xChanger.Api/Brokers/Sheets/SheetBroker.ExternalPersonPetInput.cs @@ -0,0 +1,20 @@ +//- - - - - - - - - - - - - - - - - - - - - - - - - - +// Copyright (c) Coalition of Good-Hearted Engineers +// Free to Use for Precise File Conversion +//- - - - - - - - - - - - - - - - - - - - - - - - - - + +namespace xChanger.Api.Brokers.Sheets +{ + public partial class SheetBroker + { + public async ValueTask UploadExternalPersonPetsFileAsync(IFormFile file) + { + string filePath = GetSheetLocationWithName(); + + using (var fileStream = new FileStream(filePath, FileMode.Create)) + { + await file.CopyToAsync(fileStream); + } + } + } +} diff --git a/xChanger.Api/Brokers/Sheets/SheetBroker.ExternalPersonPets.cs b/xChanger.Api/Brokers/Sheets/SheetBroker.ExternalPersonPets.cs new file mode 100644 index 0000000..a205889 --- /dev/null +++ b/xChanger.Api/Brokers/Sheets/SheetBroker.ExternalPersonPets.cs @@ -0,0 +1,51 @@ +//- - - - - - - - - - - - - - - - - - - - - - - - - - +// Copyright (c) Coalition of Good-Hearted Engineers +// Free to Use for Precise File Conversion +//- - - - - - - - - - - - - - - - - - - - - - - - - - + +using OfficeOpenXml; +using xChanger.Api.Models.Foundations.ExternalPersons; + +namespace xChanger.Api.Brokers.Sheets +{ + public partial class SheetBroker + { + public async ValueTask> ReadAllExternalPersonPetsAsync() + { + ExcelPackage.LicenseContext = LicenseContext.NonCommercial; + var externalPersons = new List(); + using var sheetBroker = new SheetBroker(this.configuration); + FileInfo file = sheetBroker.GetFileInfo(); + int row = 2, column = 1; + + using var excelPackage = + new ExcelPackage(file); + + ExcelWorksheet workSheet = + excelPackage.Workbook.Worksheets[PositionID: 0]; + + await excelPackage.LoadAsync(file); + + while (!IsTrailingFinalRow(row, column, workSheet)) + { + ExternalPerson externalPerson = new ExternalPerson(); + + externalPerson.PersonName = workSheet.Cells[row, column].Value.ToString(); + externalPerson.Age = int.Parse(workSheet.Cells[row, column + 1].Value.ToString()); + externalPerson.PetOne = workSheet.Cells[row, column + 2].Value.ToString(); + externalPerson.PetOneType = workSheet.Cells[row, column + 3].Value.ToString(); + externalPerson.PetTwo = workSheet.Cells[row, column + 4].Value.ToString(); + externalPerson.PetTwoType = workSheet.Cells[row, column + 5].Value.ToString(); + externalPerson.PetThree = workSheet.Cells[row, column + 6].Value.ToString(); + externalPerson.PetThreeType = workSheet.Cells[row, column + 7].Value.ToString(); + externalPersons.Add(externalPerson); + row++; + } + + return externalPersons; + + static bool IsTrailingFinalRow(int row, int column, ExcelWorksheet workSheet) => + String.IsNullOrEmpty(workSheet.Cells[row, column].Value?.ToString()); + } + } +} diff --git a/xChanger.Api/Brokers/Sheets/SheetBroker.PersonXML.cs b/xChanger.Api/Brokers/Sheets/SheetBroker.PersonXML.cs new file mode 100644 index 0000000..2d6067b --- /dev/null +++ b/xChanger.Api/Brokers/Sheets/SheetBroker.PersonXML.cs @@ -0,0 +1,28 @@ +//- - - - - - - - - - - - - - - - - - - - - - - - - - +// Copyright (c) Coalition of Good-Hearted Engineers +// Free to Use for Precise File Conversion +//- - - - - - - - - - - - - - - - - - - - - - - - - - + +using System.Xml.Serialization; +using xChanger.Api.Models.Foundations.Persons; + +namespace xChanger.Api.Brokers.Sheets +{ + public partial class SheetBroker + { + public async ValueTask SavePeopleWithPetsToXmlFile( + IEnumerable peopleWithPets, + string filePath) + { + XmlSerializer xmlSerializer = new XmlSerializer(typeof(List)); + await using FileStream fileStream = new FileStream(filePath, FileMode.Create); + xmlSerializer.Serialize(fileStream, peopleWithPets); + } + + public async ValueTask RetrievePeopleWithPetsXmlFile(string filePath) + { + byte[] fileBytes = await File.ReadAllBytesAsync(filePath); + return new MemoryStream(fileBytes); + } + } +} diff --git a/xChanger.Api/Brokers/Sheets/SheetBroker.cs b/xChanger.Api/Brokers/Sheets/SheetBroker.cs new file mode 100644 index 0000000..549a426 --- /dev/null +++ b/xChanger.Api/Brokers/Sheets/SheetBroker.cs @@ -0,0 +1,23 @@ +//- - - - - - - - - - - - - - - - - - - - - - - - - - +// Copyright (c) Coalition of Good-Hearted Engineers +// Free to Use for Precise File Conversion +//- - - - - - - - - - - - - - - - - - - - - - - - - - + +namespace xChanger.Api.Brokers.Sheets +{ + public partial class SheetBroker : ISheetBroker, IDisposable + { + private readonly IConfiguration configuration; + + public SheetBroker(IConfiguration configuration) => + this.configuration = configuration; + + public void Dispose() { } + + private string GetSheetLocationWithName() => + this.configuration.GetConnectionString("SheetConnection"); + + private FileInfo GetFileInfo() => + new FileInfo(fileName: GetSheetLocationWithName()); + } +} diff --git a/xChanger.Api/xChanger.Api.csproj b/xChanger.Api/xChanger.Api.csproj index d94ab25..bab977d 100644 --- a/xChanger.Api/xChanger.Api.csproj +++ b/xChanger.Api/xChanger.Api.csproj @@ -8,6 +8,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive