From 3ea18ae25e98527aa85835c9221ea01b36560b33 Mon Sep 17 00:00:00 2001 From: Sergey Chebotar Date: Mon, 29 Nov 2021 21:24:44 +0300 Subject: Add Uri Converter --- Rehau.Sku.Assist.csproj | 18 +++++++--- Source/Assistant/IProduct.cs | 9 +++++ Source/Assistant/Product.cs | 21 ++++++++++++ Source/Assistant/SkuAssist.cs | 80 +++++++++++++++++++++++++++++++++++++++++++ Source/ExcelDNA/AddIn.cs | 24 +++++++++++++ Source/ExcelDNA/Functions.cs | 19 ++++++++++ Tests/SkuAssistTests.cs | 15 ++++++++ packages.config | 2 ++ src/Assistant/IProduct.cs | 9 ----- src/Assistant/Product.cs | 21 ------------ src/Assistant/SkuAssist.cs | 45 ------------------------ src/ExcelDNA/AddIn.cs | 24 ------------- src/ExcelDNA/Functions.cs | 21 ------------ 13 files changed, 183 insertions(+), 125 deletions(-) create mode 100644 Source/Assistant/IProduct.cs create mode 100644 Source/Assistant/Product.cs create mode 100644 Source/Assistant/SkuAssist.cs create mode 100644 Source/ExcelDNA/AddIn.cs create mode 100644 Source/ExcelDNA/Functions.cs create mode 100644 Tests/SkuAssistTests.cs delete mode 100644 src/Assistant/IProduct.cs delete mode 100644 src/Assistant/Product.cs delete mode 100644 src/Assistant/SkuAssist.cs delete mode 100644 src/ExcelDNA/AddIn.cs delete mode 100644 src/ExcelDNA/Functions.cs diff --git a/Rehau.Sku.Assist.csproj b/Rehau.Sku.Assist.csproj index 5b7438a..6667639 100644 --- a/Rehau.Sku.Assist.csproj +++ b/Rehau.Sku.Assist.csproj @@ -1,5 +1,7 @@  + + Debug @@ -46,6 +48,9 @@ packages\ExcelDna.Registration.1.5.0\lib\net452\ExcelDna.Registration.dll True + + packages\NUnit.3.13.2\lib\net45\nunit.framework.dll + packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll @@ -80,12 +85,13 @@ - - - - + + + + - + + @@ -100,5 +106,7 @@ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + \ No newline at end of file diff --git a/Source/Assistant/IProduct.cs b/Source/Assistant/IProduct.cs new file mode 100644 index 0000000..aca3ff5 --- /dev/null +++ b/Source/Assistant/IProduct.cs @@ -0,0 +1,9 @@ +namespace Rehau.Sku.Assist +{ + interface IProduct + { + string Sku { get; } + string Name { get; } + string Uri { get; } + } +} diff --git a/Source/Assistant/Product.cs b/Source/Assistant/Product.cs new file mode 100644 index 0000000..17a7065 --- /dev/null +++ b/Source/Assistant/Product.cs @@ -0,0 +1,21 @@ +namespace Rehau.Sku.Assist +{ + public class Product : IProduct + { + public string Sku { get; } + public string Name { get; } + + public string Uri => throw new System.NotImplementedException(); + + public Product(string sku, string name) + { + Sku = sku; + Name = name; + } + + public override string ToString() + { + return $"{this.Name} ({this.Sku})"; + } + } +} \ No newline at end of file diff --git a/Source/Assistant/SkuAssist.cs b/Source/Assistant/SkuAssist.cs new file mode 100644 index 0000000..152dbbb --- /dev/null +++ b/Source/Assistant/SkuAssist.cs @@ -0,0 +1,80 @@ +using AngleSharp; +using AngleSharp.Dom; +using System; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; + +namespace Rehau.Sku.Assist +{ + static class SkuAssist + { + private static HttpClient _httpClient; + private enum ResponseOrder + { + NoSettings, + Relevance, + Name, + Price, + Series + } + private static void _EnsureHttpClientRunning() + { + if (_httpClient == null) + _httpClient = new HttpClient(); + } + + public async static Task GetContent(string request) + { + Uri uri = _ConvertToUri(request, ResponseOrder.NoSettings); + _EnsureHttpClientRunning(); + ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; + + return await _httpClient.GetStringAsync(uri); + } + + public async static Task GetDocument(Task source) + { + IConfiguration config = Configuration.Default; + IBrowsingContext context = BrowsingContext.New(config); + + return await context.OpenAsync(req => req.Content(source.Result)); + } + + public static IProduct GetProductFromDocument(IDocument document) + { + return document + .All + .Where(e => e.ClassName == "product-item__desc-top") + .Select(e => new Product(e.Children[0].TextContent, e.Children[1].TextContent.Trim(new[] { '\n', ' ' }))) + .FirstOrDefault(); + } + + private static Uri _ConvertToUri(this string request, ResponseOrder order) + { + string cleanedRequest = request._CleanRequest(); + switch (order) + { + case ResponseOrder.Relevance: + return new Uri("https://shop-rehau.ru/catalogsearch/result/index/?dir=asc&order=relevance&q=" + cleanedRequest); + case ResponseOrder.Name: + return new Uri("https://shop-rehau.ru/catalogsearch/result/index/?dir=asc&order=name&q=" + cleanedRequest); + case ResponseOrder.Price: + return new Uri("https://shop-rehau.ru/catalogsearch/result/index/?dir=asc&order=price&q=" + cleanedRequest); + case ResponseOrder.Series: + return new Uri("https://shop-rehau.ru/catalogsearch/result/index/?dir=asc&order=sch_product_series&q=" + cleanedRequest); + case ResponseOrder.NoSettings: + return new Uri("https://shop-rehau.ru/catalogsearch/result/?q=" + cleanedRequest); + default: + throw new ArgumentException(); + } + } + private static string _CleanRequest(this string input) + { + return input.Replace("+", " plus "); + } + } +} + + diff --git a/Source/ExcelDNA/AddIn.cs b/Source/ExcelDNA/AddIn.cs new file mode 100644 index 0000000..dd99667 --- /dev/null +++ b/Source/ExcelDNA/AddIn.cs @@ -0,0 +1,24 @@ +using ExcelDna.Integration; +using ExcelDna.Registration; + +namespace Rehau.Sku.Assist +{ + public class AddIn : IExcelAddIn + { + public void AutoOpen() + { + RegisterFunctions(); + } + + public void AutoClose() + { + } + + void RegisterFunctions() + { + ExcelRegistration.GetExcelFunctions() + .ProcessAsyncRegistrations(nativeAsyncIfAvailable: false) + .RegisterFunctions(); + } + } +} diff --git a/Source/ExcelDNA/Functions.cs b/Source/ExcelDNA/Functions.cs new file mode 100644 index 0000000..a282e3e --- /dev/null +++ b/Source/ExcelDNA/Functions.cs @@ -0,0 +1,19 @@ +using AngleSharp.Dom; +using ExcelDna.Integration; +using System.Net.Http; +using System.Threading.Tasks; + +namespace Rehau.Sku.Assist +{ + public class Functions + { + [ExcelFunction] + public static async Task RAUNAME(string request) + { + Task contentTask = Task.Run(() => SkuAssist.GetContent(request)); + Task documentTask = await contentTask.ContinueWith(content => SkuAssist.GetDocument(content)); + IProduct product = await documentTask.ContinueWith(doc => SkuAssist.GetProductFromDocument(doc.Result)); + return product != null ? product.ToString() : "Не найдено"; + } + } +} \ No newline at end of file diff --git a/Tests/SkuAssistTests.cs b/Tests/SkuAssistTests.cs new file mode 100644 index 0000000..fc47c41 --- /dev/null +++ b/Tests/SkuAssistTests.cs @@ -0,0 +1,15 @@ +using NUnit.Framework; + +namespace Rehau.Sku.Assist.Tests +{ + [TestFixture] + public class SkuAssistTests + { + [Test] + public async void BaseTest() + { + var result = await Functions.RAUNAME("160001"); + Assert.AreEqual("Надвижная гильза REHAU RAUTITAN РХ (11600011001)", result); + } + } +} diff --git a/packages.config b/packages.config index cc383d8..96d00fe 100644 --- a/packages.config +++ b/packages.config @@ -4,6 +4,8 @@ + + diff --git a/src/Assistant/IProduct.cs b/src/Assistant/IProduct.cs deleted file mode 100644 index aca3ff5..0000000 --- a/src/Assistant/IProduct.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Rehau.Sku.Assist -{ - interface IProduct - { - string Sku { get; } - string Name { get; } - string Uri { get; } - } -} diff --git a/src/Assistant/Product.cs b/src/Assistant/Product.cs deleted file mode 100644 index 17a7065..0000000 --- a/src/Assistant/Product.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace Rehau.Sku.Assist -{ - public class Product : IProduct - { - public string Sku { get; } - public string Name { get; } - - public string Uri => throw new System.NotImplementedException(); - - public Product(string sku, string name) - { - Sku = sku; - Name = name; - } - - public override string ToString() - { - return $"{this.Name} ({this.Sku})"; - } - } -} \ No newline at end of file diff --git a/src/Assistant/SkuAssist.cs b/src/Assistant/SkuAssist.cs deleted file mode 100644 index dc36dc0..0000000 --- a/src/Assistant/SkuAssist.cs +++ /dev/null @@ -1,45 +0,0 @@ -using AngleSharp; -using AngleSharp.Dom; -using System.Linq; -using System.Net; -using System.Net.Http; -using System.Text.RegularExpressions; -using System.Threading.Tasks; - -namespace Rehau.Sku.Assist -{ - static class SkuAssist - { - public async static Task GetContent(string request, HttpClient httpClient) - { - string uri = "https://shop-rehau.ru/catalogsearch/result/?q=" + request._CleanRequest(); - ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls; - - return await httpClient.GetStringAsync(uri); - } - - public async static Task GetDocument(Task source) - { - IConfiguration config = Configuration.Default; - IBrowsingContext context = BrowsingContext.New(config); - - return await context.OpenAsync(req => req.Content(source.Result)); - } - - public static IProduct GetProductFromDocument(IDocument document) - { - return document - .All - .Where(e => e.ClassName == "product-item__desc-top") - .Select(e => new Product(e.Children[0].TextContent, e.Children[1].TextContent.Trim(new[] { '\n', ' ' }))) - .FirstOrDefault(); - } - - private static string _CleanRequest(this string input) - { - return input.Replace("+", " plus "); - } - } -} - - diff --git a/src/ExcelDNA/AddIn.cs b/src/ExcelDNA/AddIn.cs deleted file mode 100644 index dd99667..0000000 --- a/src/ExcelDNA/AddIn.cs +++ /dev/null @@ -1,24 +0,0 @@ -using ExcelDna.Integration; -using ExcelDna.Registration; - -namespace Rehau.Sku.Assist -{ - public class AddIn : IExcelAddIn - { - public void AutoOpen() - { - RegisterFunctions(); - } - - public void AutoClose() - { - } - - void RegisterFunctions() - { - ExcelRegistration.GetExcelFunctions() - .ProcessAsyncRegistrations(nativeAsyncIfAvailable: false) - .RegisterFunctions(); - } - } -} diff --git a/src/ExcelDNA/Functions.cs b/src/ExcelDNA/Functions.cs deleted file mode 100644 index ec9c607..0000000 --- a/src/ExcelDNA/Functions.cs +++ /dev/null @@ -1,21 +0,0 @@ -using AngleSharp.Dom; -using ExcelDna.Integration; -using System.Net.Http; -using System.Threading.Tasks; - -namespace Rehau.Sku.Assist -{ - public class Functions - { - private static HttpClient _httpClient = new HttpClient(); - - [ExcelFunction] - public static async Task RAUNAME(string request) - { - Task contentTask = Task.Run(() => SkuAssist.GetContent(request, _httpClient)); - Task documentTask = await contentTask.ContinueWith(content => SkuAssist.GetDocument(content)); - IProduct product = await documentTask.ContinueWith(doc => SkuAssist.GetProductFromDocument(doc.Result)); - return product == null ? ExcelError.ExcelErrorNull.ToString() : product.ToString(); - } - } -} \ No newline at end of file -- cgit v1.2.3