using System.Text.RegularExpressions; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.Extensions; namespace RhSolutions.QueryModifiers; public class PipeQueryModifier : IProductQueryModifier { protected virtual string diameterPattern { get; } = @"([\b\D]|^)(?16|20|25|32|40|50|63)([\b\D]|$)"; protected virtual string typePattern { get; } = @"бухт|отр|штанг"; protected virtual string pipeName { get; } = "Flex"; protected virtual Dictionary diameterNames { get; } = new() { ["16"] = "16x2,2", ["20"] = "20x2,8", ["25"] = "25x3,5", ["32"] = "32x4,4", ["40"] = "40x5,5", ["50"] = "50x6,9", ["63"] = "63x8,6" }; protected virtual Dictionary makeUpNames { get; } = new() { ["бухт"] = "бухта", ["штанг"] = "прям.отрезки", ["отр"] = "прям.отрезки" }; public bool TryQueryModify(IQueryCollection collection, out QueryString queryString) { queryString = QueryString.Empty; string query = collection["query"].ToString(); if (string.IsNullOrEmpty(query)) { return false; } var diameterMatches = Regex.Matches(query, diameterPattern); if (diameterMatches.Count == 0) { return false; } var typeMatches = Regex.Matches(query, typePattern); var diameter = diameterMatches.First().Groups["Diameter"].Value; string? type = typeMatches.FirstOrDefault()?.Value; string result = $"Труба {pipeName} {diameterNames[diameter]} {(type != null ? makeUpNames[type] : int.Parse(diameter) < 32 ? makeUpNames["бухт"] : makeUpNames["отр"])}"; QueryBuilder qb = new() { { "query", result } }; queryString = qb.ToQueryString(); return true; } }