< Summary

Class:WinSolutions.Sveta.Server.Services.Implements.DiscountColorService
Assembly:WinSolutions.Sveta.Server
File(s):/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/DiscountColorService.cs
Covered lines:30
Uncovered lines:21
Coverable lines:51
Total lines:138
Line coverage:58.8% (30 of 51)
Covered branches:10
Total branches:30
Branch coverage:33.3% (10 of 30)

Metrics

MethodLine coverage Branch coverage
.ctor(...)100%100%
GetDiscountColors()100%50%
PrepareDiscountColors()100%100%
GetDiscountColor()0%100%
Create()0%0%
DiscountExists()0%100%
Update()0%0%
Delete()0%0%
GetColor()0%100%
Sort(...)100%70%

File(s)

/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/DiscountColorService.cs

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using Microsoft.Extensions.Logging;
 3using System;
 4using System.Collections.Generic;
 5using System.Linq;
 6using System.Text.Json;
 7using System.Threading.Tasks;
 8using WinSolutions.Sveta.Server.Domain;
 9using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 10using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 11using WinSolutions.Sveta.Server.Data.DataModel.Kinds;
 12using WinSolutions.Sveta.Server.Services.Interfaces;
 13using WinSolutions.Sveta.Common;
 14
 15namespace WinSolutions.Sveta.Server.Services.Implements
 16{
 17    public class DiscountColorService : SvetaServiceBase, IDiscountColorService
 18    {
 19        private readonly SvetaDbContext _db;
 20        private readonly ILogger<DiscountColorService> _logger;
 21        private readonly IAuthenticationService _authenticationService;
 22        public DiscountColorService(SvetaDbContext db, ILogger<DiscountColorService> logger, IAuthenticationService auth
 11223            : base(authenticationService)
 11224        {
 11225            _authenticationService = authenticationService;
 11226            _db = db;
 11227            _logger = logger;
 11228        }
 29
 30        /// <summary>
 31        /// Получить список цветов ярлыков скидки
 32        /// </summary>
 33        /// <param name="page">пагинация - номер страницы</param>
 34        /// <param name="limit">пагинация - размер страницы</param>
 35        /// <param name="sort">сортировка</param>
 36        /// <param name="filter">фильтр по цвету ярылка, текста, прозрачности и уровню скидки</param>
 37        /// <returns></returns>
 38        public async Task<PaginatedData<List<DiscountColor>>> GetDiscountColors(int page, int limit, string sort, string
 11239        {
 11240            var colors = PrepareDiscountColors().AsNoTracking();
 11241            int total = await colors?.CountAsync();
 11242            colors = colors.Where(x => string.IsNullOrWhiteSpace(filter) || x.LabelColor.ToUpper().Contains(filter.ToUpp
 11243            || x.DiscountLevel.ToString() == filter || x.Transparency.ToString() == filter);
 11244            colors = Sort(colors, sort?.ToLower());
 11245            int filtered = await colors?.CountAsync();
 11246            return new PaginatedData<List<DiscountColor>>
 11247            {
 11248                Result = await colors.Skip(page * limit).Take(limit).ToListAsync(),
 11249                TotalCount = total,
 11250                TotalFilteredCount = filtered
 11251            };
 11252        }
 53
 54        /// <summary>
 55        /// предварительная выборка
 56        /// </summary>
 57        /// <returns></returns>
 11258        private IQueryable<DiscountColor> PrepareDiscountColors() => _db.DiscountColors
 11259           .Where(e => !e.IsDeleted)
 11260           .AsQueryable();
 61
 62        /// <summary>
 63        /// получить цвет ярылка
 64        /// </summary>
 65        /// <param name="id">id записи</param>
 66        /// <returns></returns>
 067        public async Task<DiscountColor> GetDiscountColor(long id) => await PrepareDiscountColors().FirstOrDefaultAsync(
 68
 69        /// <summary>
 70        /// создать цвет ярлыка
 71        /// </summary>
 72        /// <param name="data"> ярлык</param>
 73        /// <returns></returns>
 74        public async Task Create(DiscountColor data)
 075        {
 076            await _db.DiscountColors.AddAsync(data);
 077            await _db.SaveChangesAsync(CurrentUserId);
 078        }
 79
 80        /// <summary>
 81        /// проверить существование цвета ярлыка
 82        /// </summary>
 83        /// <param name="id">id записи</param>
 84        /// <returns></returns>
 085        public async Task<bool> DiscountExists(long id) => await PrepareDiscountColors().AsNoTracking().Where(e => e.Id 
 86
 87        /// <summary>
 88        /// обновить цвет ярлыка
 89        /// </summary>
 90        /// <param name="data"> ярлык</param>
 91        /// <returns></returns>
 92        public async Task Update(DiscountColor data)
 093        {
 094            if (!(await DiscountExists(data.Id)))
 095            {
 096                throw new ArgumentException($"Скидка с id={data.Id} не найдена");
 97            }
 098            _db.DiscountColors.Update(data);
 099            await _db.SaveChangesAsync(CurrentUserId);
 0100        }
 101
 102        /// <summary>
 103        /// Удалить цвет ярлыка
 104        /// </summary>
 105        /// <param name="id">id записи</param>
 106        /// <returns></returns>
 107        public async Task Delete(long id)
 0108        {
 0109            var rec = await _db.DiscountColors.FindAsync(id);
 0110            if (rec == null)
 0111                throw new KeyNotFoundException($"Скидка с id={id} не найдена");
 0112            rec.IsDeleted = true;
 0113            await _db.SaveChangesAsync(CurrentUserId);
 0114        }
 115
 116        /// <summary>
 117        /// Возвращает цвет максимальной скидки, которая меньше или равна переданной
 118        /// </summary>
 119        /// <param name="discountLevel"></param>
 120        /// <returns></returns>
 121        public async Task<DiscountColor> GetColor(int discountLevel)
 0122            => await PrepareDiscountColors().AsNoTracking().OrderBy(x => x.DiscountLevel).Where(x => x.DiscountLevel <= 
 123
 124        /// <summary>
 125        /// сортировка по цвету ярлыка и уровню скидки
 126        /// </summary>
 127        /// <param name="items">выборка ярлыков</param>
 128        /// <param name="sort">тип сортировки</param>
 129        /// <returns></returns>
 112130        private IQueryable<DiscountColor> Sort(IQueryable<DiscountColor> items, string sort = default) => (sort ?? "").T
 112131        {
 112132            "color" => items.OrderBy(d => d.LabelColor),
 112133            "color|desc" => items.OrderByDescending(d => d.LabelColor),
 112134            "discount|desc" => items.OrderByDescending(d => d.DiscountLevel),
 112135            _ => items.OrderBy(d => d.DiscountLevel)
 112136        };
 137    }
 138}