< Summary

Class:WinSolutions.Sveta.Server.Services.Implements.GoodLabelService
Assembly:WinSolutions.Sveta.Server
File(s):/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/GoodLabelService.cs
Covered lines:47
Uncovered lines:4
Coverable lines:51
Total lines:140
Line coverage:92.1% (47 of 51)
Covered branches:17
Total branches:30
Branch coverage:56.6% (17 of 30)

Metrics

MethodLine coverage Branch coverage
.ctor(...)100%100%
GetGoodLabels()100%50%
PrepareGoodLabels()100%100%
GetGoodLabel()100%100%
Create()100%50%
GoodLabelExists()100%100%
Update()71.42%50%
Delete()85.71%50%
GetGoodLabelByName()0%100%
Sort(...)100%70%

File(s)

/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/GoodLabelService.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;
 14using WinSolutions.Sveta.Common.Extensions;
 15
 16namespace WinSolutions.Sveta.Server.Services.Implements
 17{
 18    public class GoodLabelService : SvetaServiceBase, IGoodLabelService
 19    {
 20        private readonly SvetaDbContext _db;
 21        private readonly ILogger<GoodLabelService> _logger;
 22        private readonly IAuthenticationService _authenticationService;
 23        public GoodLabelService(SvetaDbContext db, ILogger<GoodLabelService> logger, IAuthenticationService authenticati
 224            : base(authenticationService)
 225        {
 226            _authenticationService = authenticationService;
 227            _db = db;
 228            _logger = logger;
 229        }
 30
 31        /// <summary>
 32        /// получает список ярлыков товаров
 33        /// </summary>
 34        /// <param name="page">номер страницы, начинается с 0</param>
 35        /// <param name="limit">Кол-во записей</param>
 36        /// <param name="filter">фильтр по названию ярлыка</param>
 37        /// <param name="sort">сортировка</param>
 38        /// <param name="showcaseVisible">видимость на витрине</param>
 39        /// <returns></returns>
 40        public async Task<PaginatedData<List<GoodLabel>>> GetGoodLabels(int page, int limit, string sort, string filter,
 641        {
 642            var labels = PrepareGoodLabels().AsNoTracking();
 643            int total = await labels?.CountAsync();
 644            labels = labels.Where(x => string.IsNullOrWhiteSpace(filter) || x.Name.ToLower().Contains(filter.ToLower()))
 645                .Where(x=> !showcaseVisible.HasValue || (showcaseVisible.Value ? x.ShowcaseVisible : !x.ShowcaseVisible)
 646            int filtered = await labels?.CountAsync();
 647            labels = Sort(labels, sort?.ToLower());
 648            return new PaginatedData<List<GoodLabel>>
 649            {
 650                Result = await labels.Skip(page * limit).Take(limit).ToListAsync(),
 651                TotalCount = total,
 652                TotalFilteredCount = filtered
 653            };
 654        }
 55
 56        /// <summary>
 57        /// Подготовительный метод, выбирает все записи из GoodLabels
 58        /// </summary>
 59        /// <returns></returns>
 960        private IQueryable<GoodLabel> PrepareGoodLabels() => _db.GoodLabels
 961           .Where(e => !e.IsDeleted)
 962           .AsQueryable();
 63
 64        /// <summary>
 65        /// Получает запись по id
 66        /// </summary>
 67        /// <param name="id">id записи</param>
 68        /// <returns></returns>
 169        public async Task<GoodLabel> GetGoodLabel(long id) => await PrepareGoodLabels().FirstOrDefaultAsync(e => e.Id ==
 70
 71        /// <summary>
 72        /// Создает запись
 73        /// </summary>
 74        /// <param name="data">объект GoodLabel</param>
 75        /// <returns></returns>
 76        public async Task Create(GoodLabel data)
 177        {
 178            await _db.GoodLabels.AddAsync(data);
 179            await _db.SaveChangesAsync(CurrentUserId);
 180        }
 81
 82        /// <summary>
 83        /// Проверяет существует ли запись
 84        /// </summary>
 85        /// <param name="id">id записи</param>
 86        /// <returns></returns>
 287        public async Task<bool> GoodLabelExists(long id) => await PrepareGoodLabels().AsNoTracking().AnyAsync(e => e.Id 
 88
 89        /// <summary>
 90        /// Обновляет запись
 91        /// </summary>
 92        /// <param name="data">объект GoodLabel</param>
 93        /// <returns></returns>
 94        public async Task Update(GoodLabel data)
 195        {
 196            if (!(await GoodLabelExists(data.Id)))
 097            {
 098                throw new ArgumentException($"Ярлык с id={data.Id} не найден");
 99            }
 1100            _db.GoodLabels.Update(data);
 1101            await _db.SaveChangesAsync(CurrentUserId);
 1102        }
 103
 104        /// <summary>
 105        /// Удаляет запись
 106        /// </summary>
 107        /// <param name="id">id записи</param>
 108        /// <returns></returns>
 109        public async Task Delete(long id)
 1110        {
 1111            var rec = await _db.GoodLabels.FindAsync(id);
 1112            if (rec == null)
 0113                throw new KeyNotFoundException($"Ярлык с id={id} не найден");
 1114            rec.IsDeleted = true;
 1115            await _db.SaveChangesAsync(CurrentUserId);
 1116        }
 117
 118        /// <summary>
 119        /// Получить запись
 120        /// </summary>
 121        /// <param name="name">имя ярлыка</param>
 122        /// <returns></returns>
 123        public async Task<GoodLabel> GetGoodLabelByName(string name)
 0124            => await PrepareGoodLabels().FirstOrDefaultAsync(x => x.Name.ToLower() == name.NormalizeName().ToLower());
 125
 126        /// <summary>
 127        /// сортировка по имени и id
 128        /// </summary>
 129        /// <param name="items">выборка ярлыков</param>
 130        /// <param name="sort">тип сортировки</param>
 131        /// <returns></returns>
 6132        private IQueryable<GoodLabel> Sort(IQueryable<GoodLabel> items, string sort = default) => (sort ?? "").ToLower()
 6133        {
 6134            "name|desc" => items.OrderByDescending(d => d.Name),
 6135            "id|desc" => items.OrderByDescending(d => d.Id),
 6136            "id" => items.OrderBy(d => d.Id),
 6137            _ => items.OrderBy(d => d.Name)
 6138        };
 139    }
 140}