< Summary

Class:SVETA.Api.Controllers.CatalogFiltersController
Assembly:SVETA.Api
File(s):/opt/dev/sveta_api_build/SVETA.Api/Controllers/CatalogFiltersController.cs
Covered lines:0
Uncovered lines:27
Coverable lines:27
Total lines:171
Line coverage:0% (0 of 27)
Covered branches:0
Total branches:4
Branch coverage:0% (0 of 4)

Metrics

MethodLine coverage Branch coverage
.ctor(...)0%100%
CreateCatalogFilters(...)0%100%

File(s)

/opt/dev/sveta_api_build/SVETA.Api/Controllers/CatalogFiltersController.cs

#LineLine coverage
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Threading.Tasks;
 5using Microsoft.AspNetCore.Authorization;
 6using Microsoft.AspNetCore.Http;
 7using Microsoft.AspNetCore.Mvc;
 8using Microsoft.EntityFrameworkCore;
 9using Microsoft.Extensions.Logging;
 10using SVETA.Api.Data.DTO;
 11using SVETA.Api.Services.Interfaces;
 12using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 13using WinSolutions.Sveta.Server.Data.DataModel.Extensions;
 14using WinSolutions.Sveta.Server.Services.Interfaces;
 15
 16namespace SVETA.Api.Controllers
 17{
 18    [Route("api/v1/CatalogFilters")]
 19    [ApiController]
 20    [Authorize]
 21    public class CatalogFiltersController : SvetaController
 22    {
 23        private readonly IDepartmentService _departmentService;
 24        private readonly IShowcaseWorker _goodWorker;
 25        private readonly ILogger<CatalogFiltersController> _logger;
 26
 27        public CatalogFiltersController(
 28            IShowcaseWorker worker,
 29            IDepartmentService departmentService,
 030            ILogger<CatalogFiltersController> logger): base(logger)
 031        {
 032            _departmentService = departmentService;
 033            _goodWorker = worker;
 034            _logger = logger;
 035        }
 36
 37        /// <summary>
 38        /// Возвращает объект для построения sidebar
 39        /// </summary>
 40        /// <remarks>author: aabelentsov</remarks>
 41        /// <param name="categoryId">Категория для построения фильтра.await 0 - по всем категориям</param>
 42        /// <param name="departmentId">Магазин</param>
 43        /// <returns></returns>
 44        [AllowAnonymous]
 45        [HttpGet("Category/{categoryId}/Department/{departmentId}")]
 46        [ProducesResponseType(typeof(IEnumerable<CatalogFiltersDTO>), 200)]
 47        public async Task<IActionResult> GetCatalogFilter(long categoryId, long departmentId)
 48        {
 49            List<CatalogFiltersDTO> cFilters = new List<CatalogFiltersDTO>();
 50            var shopDep = await _departmentService.GetDepartment(departmentId) ??
 51                               throw new KeyNotFoundException($"Не найден магазин");
 52            if (shopDep.Cluster == null)
 53                throw new ArgumentException($"Не найден кластер для магазина {shopDep.Name}");
 54            var goods = await _goodWorker.GetShowcaseGoodsBaseQuery(categoryId > 0 ? categoryId : (long?)null, departmen
 55
 56            if (await goods.CountAsync() == 0)
 57            {
 58                return Ok(cFilters);
 59            }
 60            // бренды
 61            var brands = await goods.Select(d => d.Brand).Distinct().OrderBy(d => d.Name).ToListAsync();
 62            if (brands.Count > 0 && brands.First() != null)
 63            {
 64                var brandFilters = CreateCatalogFilters("brands", "Бренд", GroupType.verticalGroup);
 065                brandFilters.FieldGroup.AddRange(brands.Where(d => d != null).Select(d => new FieldGroupDTO
 066                {
 067                    Type = FieldType.checkbox,
 068                    Key = d.Id.ToString(),
 069                    TemplateOptions = new FieldGroupTemplateOptions
 070                    {
 071                        Label = d.Name
 072                    }
 073                }).ToList());
 74                if (brandFilters != null && brandFilters?.FieldGroup.Count > 1)
 75                    cFilters.Add(brandFilters);
 76            }
 77
 78            // страны
 79            /*var countries = await goods.Select(d => d.Country).Distinct().ToListAsync();
 80            if (countries.Count > 0 && countries.First() != null)
 81            {
 82                var countryFilters = CreateCatalogFilters("country", "Страна", GroupType.verticalGroup);
 83                countryFilters.FieldGroup.AddRange(countries.Where(d => d != null).Select(d => new FieldGroupDTO
 84                {
 85                    Type = FieldType.checkbox,
 86                    Key = d.Id.ToString(),
 87                    TemplateOptions = new FieldGroupTemplateOptions
 88                    {
 89                        Label = d.Name
 90                    }
 91                }).ToList());
 92                cFilters.Add(countryFilters);
 93            }*/
 94
 95            // цены
 96            var priceFilter = CreateCatalogFilters("price", "цена", GroupType.horizontalGroup);
 97            var goodsPrices = goods.Select(d => d.Prices.Where(x =>
 98                    !x.IsDeleted
 99                    && x.PriceTrend.SupplierDepartment.Id == shopDep.Cluster.WarehouseId
 100                    && x.PriceTrend.BeginDate <= DateTime.Now)
 101                .OrderByDescending(x => x.PriceTrend.BeginDate).FirstOrDefault())
 102                .Where(d => d != null)
 103                .Select(d => d.PriceNew)
 104                .ToList()
 0105                .Select(x => (int)Math.Ceiling(x));
 106            var field = new FieldGroupDTO
 107            {
 108                Type = FieldType.input,
 109                Key = "price_from",
 110                TemplateOptions = new FieldPriceGroupTemplateOptions
 111                {
 112                    Label = "",
 113                    Placeholder = "от",
 114                    PriceCount = goodsPrices.Min()
 115                }
 116            };
 117            priceFilter.FieldGroup.Add(field);
 118            priceFilter.FieldGroup.Add(new FieldGroupDTO
 119            {
 120                Type = FieldType.input,
 121                Key = "price_to",
 122                TemplateOptions = new FieldPriceGroupTemplateOptions
 123                {
 124                    Label = "",
 125                    Placeholder = "до",
 126                    PriceCount = goodsPrices.Max()
 127                }
 128            });
 129            if (priceFilter != null && priceFilter?.FieldGroup.Count > 1)
 130                cFilters.Add(priceFilter);
 131
 132            // минимальная партия
 133            // var distinctMinDelivery = await goods
 134            //     .Select(d => d.DepartmentGoodSettings.FirstOrDefault(setting => !setting.IsDeleted && setting.Departm
 135            //     .Select(d => d.MinQuantity)
 136            //     .Distinct()
 137            //     .OrderBy(d => d)
 138            //     .ToListAsync();
 139            // if (distinctMinDelivery.Count > 0)
 140            // {
 141            //     var quantityFilter = CreateCatalogFilters("minQuantity", "Мин. партия", GroupType.verticalGroup);
 142            //
 143            //     quantityFilter.FieldGroup.AddRange(distinctMinDelivery.Where(d => d != 0).Select(d => new FieldGroupD
 144            //     {
 145            //         Type = FieldType.checkbox,
 146            //         Key = d.ToString(),
 147            //         TemplateOptions = new FieldGroupTemplateOptions
 148            //         {
 149            //             Label = d.ToString()
 150            //         }
 151            //     }).ToList());
 152            //     if (quantityFilter != null && quantityFilter?.FieldGroup.Count > 1)
 153            //         cFilters.Add(quantityFilter);
 154            // }
 155            //var volumeFilter = CreateCatalogFilters("volume", "Объем", GroupType.verticalGroup);
 156
 157            return Ok(cFilters);
 158        }
 0159        private CatalogFiltersDTO CreateCatalogFilters(string key, string label, string groupType) => new CatalogFilters
 0160        {
 0161            Key = key,
 0162            Wrappers = new string[] { "form-group-collapse-title" },
 0163            TemplateOptions = new TemplateOptionDTO
 0164            {
 0165                Label = label
 0166            },
 0167            FieldGroupClassName = groupType,
 0168            FieldGroup = new List<FieldGroupDTO>()
 0169        };
 170    }
 171}