< Summary

Class:WinSolutions.Sveta.Server.Services.Implements.BrandService
Assembly:WinSolutions.Sveta.Server
File(s):/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/BrandService.cs
Covered lines:74
Uncovered lines:33
Coverable lines:107
Total lines:185
Line coverage:69.1% (74 of 107)
Covered branches:25
Total branches:48
Branch coverage:52% (25 of 48)

Metrics

MethodLine coverage Branch coverage
.ctor(...)100%100%
GetBrands()0%100%
GetBrand()100%100%
GetBrandByName()100%100%
PrepareBrandsQuery(...)61.9%37.5%
CheckParentIds()0%100%
CheckCollision()0%100%
GetBrandsCount()100%100%
GetBrands()90.9%83.33%
CreateBrand()66.66%40%
UpdateBrand()60%37.5%
DeleteBrand()76.92%50%
BrandExists()100%100%

File(s)

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

#LineLine coverage
 1using System.Collections.Generic;
 2using System.Linq;
 3using System;
 4using System.Threading.Tasks;
 5using System.Linq.Expressions;
 6using Microsoft.EntityFrameworkCore;
 7using Microsoft.EntityFrameworkCore.Internal;
 8using Microsoft.Extensions.Logging;
 9using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 10using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 11using WinSolutions.Sveta.Server.Services.Interfaces;
 12using WinSolutions.Sveta.Common;
 13using WinSolutions.Sveta.Common.Extensions;
 14
 15namespace WinSolutions.Sveta.Server.Services.Implements
 16{
 17    public class BrandService : SvetaServiceBase, IBrandService
 18    {
 19        private readonly SvetaDbContext _db;
 20        private readonly ILogger<BrandService> _logger;
 21
 22        public BrandService(SvetaDbContext db, ILogger<BrandService> logger, IAuthenticationService authenticationServic
 723            : base(authenticationService)
 724        {
 725            _db = db;
 726            _logger = logger;
 727        }
 28
 029        public IQueryable<Brand> GetBrands() => _db.Brands.Where(d => !d.IsDeleted).AsQueryable();
 30
 331        public async Task<Brand> GetBrand(long brandId) => await _db.Brands.Include(x => x.Parent).Where(d => !d.IsDelet
 32
 333        public async Task<Brand> GetBrandByName(string name) => await _db.Brands
 334            .Include(x => x.Parent)
 335            .Include(d => d.RecState)
 336            .Where(e => !e.IsDeleted)
 337            .FirstOrDefaultAsync(d => d.Name.Contains(name.NormalizeName()));
 38
 39        IQueryable<Brand> PrepareBrandsQuery(string filter = null, long? parentId = null)
 7340        {
 7341            var result = _db.Brands
 7342                .Include(x => x.Parent)
 7343                .Include(d => d.RecState)
 7344                .AsNoTracking()
 7345                .Where(e => !e.IsDeleted);
 7346            if (!string.IsNullOrWhiteSpace(filter))
 547            {
 548                result = result.Where(x => x.Name.ToUpper().Contains(filter.ToUpper()));
 549            }
 7350            if (parentId.HasValue)
 051            {
 052                result = parentId.Value switch
 053                {
 054                    -1 => result,
 055                    0 => result.Where(x => x.Parent == null),
 056                    _ => result.Where(x => x.Parent != null && x.Parent.Id == parentId.Value)
 057                };
 058            }
 7359            return result;
 7360        }
 61        /// <summary>
 62        /// Проверяем являются ли родителем текущие элементы
 63        /// </summary>
 64        /// <param name="parentIds">Список проверяемых элементов</param>
 65        /// <returns>Отправляем обратно список всех тех кто является родителем</returns>
 066        public async Task<List<long>> CheckParentIds(long[] parentIds) => await _db.Brands
 067            .Include(p => p.Parent)
 068            .Where(x => parentIds.Contains(x.Parent.Id)) //проверив кто является родителем, отправим обратно список id э
 069            .Select(x => x.Parent.Id)
 070            .ToListAsync();
 71
 72        /// <summary>
 73        /// Проверяем на колизии
 74        /// </summary>
 75        /// <param name="id"></param>
 76        /// <param name="parentId"></param>
 77        /// <returns></returns>
 78        public async Task<bool> CheckCollision(long id, long parentId)
 079        {
 80            //Проверка прямой колизии
 081            var items = await _db.Brands
 082                .Include(p => p.Parent)
 083                .Where(x => x.Id == parentId && x.Parent.Id == id)
 084                .AnyAsync();
 85
 086            return items;
 087        }
 88
 89
 90        public async Task<long> GetBrandsCount(string filter, long? parentId)
 491        {
 492            return await PrepareBrandsQuery(filter, parentId).CountAsync();
 493        }
 94        public async Task<List<Brand>> GetBrands(string sort, string filter, int page, int limit, long? parentId)
 895        {
 896            string[] sortItems = sort.Split('|');
 897            string sortColumn = string.Empty;
 898            string sortOrder = string.Empty;
 899            if(sortItems.Length == 2)
 7100            {
 7101                sortColumn = sortItems[0].ToLower();
 7102                sortOrder = sortItems[1].ToLower();
 7103            }
 104
 105            //filtering
 8106            IQueryable<Brand> brands = PrepareBrandsQuery(filter, parentId);
 107
 108            //sorting
 109            Expression<Func<Brand, object>> sortingExpression;
 110
 8111            switch (sortColumn)
 112            {
 113                case "name":
 7114                    sortingExpression = e => e.Name;
 7115                    break;
 116                case "modificationdatetime":
 0117                    sortingExpression = e => e.ModificationDateTime;
 0118                    break;
 119                default:
 1120                    sortingExpression = e => e.Name;
 1121                    break;
 122            }
 123
 8124            if(sortOrder == "desc")
 4125                brands = brands.OrderByDescending(sortingExpression);
 126            else
 4127                brands = brands.OrderBy(sortingExpression);
 128
 129
 8130            return await brands.Skip((page < 2 ? 0 : page-1)*limit).Take(limit).ToListAsync();
 8131        }
 132        public async Task CreateBrand(Brand brandIn)
 60133        {
 60134            if(PrepareBrandsQuery().Where(x => x.Name.ToLower() == brandIn.Name.NormalizeName().ToLower()).Any())
 0135            {
 0136                throw new Exception("Такой бренд уже существует");
 137            }
 138
 60139            if (brandIn.RecState != null)
 0140                _db.Entry(brandIn.RecState).State = brandIn.RecState.Id == 0 ? EntityState.Detached : EntityState.Unchan
 60141            await _db.Brands.AddAsync(brandIn);
 60142            await _db.SaveChangesAsync(CurrentUserId);
 60143        }
 144
 145        public async Task UpdateBrand(Brand data)
 1146        {
 1147            if (!(await BrandExists(data.Id)))
 0148            {
 0149                throw new ArgumentException($"Запись #{data?.Name} не найдена");
 150            }
 151
 1152            if (PrepareBrandsQuery().Where(x => x.Name.ToLower() == data.Name.NormalizeName().ToLower() && x.Id != data.
 0153            {
 0154                throw new Exception("Такой бренд уже существует");
 155            }
 156
 1157            _db.Brands.Update(data);
 1158            await _db.SaveChangesAsync(CurrentUserId);
 1159        }
 160
 161        public async Task DeleteBrand(long brandId)
 1162        {
 1163            Brand rec = await _db.Brands.FindAsync(brandId);
 1164            if (rec == null)
 0165                throw new KeyNotFoundException($"Запись #{brandId} не найдена ");
 1166            if (_db.Brands.Include(d => d.Parent).Any(d => !d.IsDeleted && d.Parent.Id == brandId))
 0167                throw new ArgumentException($"Брэнд #{brandId} имеет дочерние брэнды и не может быть удалён");
 1168            if (_db
 1169                .Goods.Include(good => good.Brand)
 1170                .Any(d => !d.IsDeleted && d.Brand.Id == brandId))
 0171                throw new ArgumentException($"Невозможно удалить бренд с товарами");
 172
 173
 1174            rec.IsDeleted = true;
 1175            await _db.SaveChangesAsync(CurrentUserId);
 1176        }
 177
 1178        public async Task<bool> BrandExists(long brandId) => await _db.Brands
 1179            .Include(x => x.Parent)
 1180            .AsNoTracking()
 1181            .Where(d => !d.IsDeleted)
 1182            .Where(e => e.Id == brandId).AnyAsync();
 183    }
 184
 185}