< Summary

Class:WinSolutions.Sveta.Server.Services.Implements.ControlsAccessService
Assembly:WinSolutions.Sveta.Server
File(s):/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/ControlsAccessService.cs
Covered lines:68
Uncovered lines:12
Coverable lines:80
Total lines:191
Line coverage:85% (68 of 80)
Covered branches:20
Total branches:42
Branch coverage:47.6% (20 of 42)

Metrics

MethodLine coverage Branch coverage
.ctor(...)100%100%
GetAccesses()100%66.66%
GetAccess()100%100%
PrepareAccesses()100%100%
GetAccess()100%100%
GetAvailableAccesses()0%0%
Create()100%50%
AccessExists()100%100%
Update()71.42%50%
Delete()85.71%50%
Sort(...)100%64.28%
GetActions()100%100%
GetAction()100%100%

File(s)

/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/ControlsAccessService.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 ControlsAccessService : SvetaServiceBase, IControlsAccessService
 18    {
 19        private readonly SvetaDbContext _db;
 20        private readonly ILogger<ControlsAccessService> _logger;
 21        private readonly IDepartmentService _departService;
 22        private readonly IMovementService _movementService;
 23        private readonly IAuthenticationService _authenticationService;
 24        private readonly IAnonymousMovementService _anonymousMovementService;
 25        public ControlsAccessService(SvetaDbContext db, ILogger<ControlsAccessService> logger, IAuthenticationService au
 26            IMovementService movementService, IAnonymousMovementService anonymousMovementService)
 427            : base(authenticationService)
 428        {
 429            _authenticationService = authenticationService;
 430            _movementService = movementService;
 431            _departService = departService;
 432            _db = db;
 433            _logger = logger;
 434            _anonymousMovementService = anonymousMovementService;
 435        }
 36
 37        /// <summary>
 38        /// получить список доступов с пагинацией
 39        /// </summary>
 40        /// <param name="page">номер страницы</param>
 41        /// <param name="limit">размер страницы</param>
 42        /// <param name="sort">сортировка</param>
 43        /// <param name="filter">фильтр по названию действия, роли</param>
 44        /// <returns></returns>
 45        public async Task<PaginatedData<List<ControlAccess>>> GetAccesses(int page, int limit, string sort, string filte
 346        {
 347            var accesses = PrepareAccesses().AsNoTracking();
 348            int total = await accesses?.CountAsync();
 349            accesses = accesses.Where(x => string.IsNullOrWhiteSpace(filter) || x.Action.Name.ToLower().Contains(filter.
 350            accesses = Sort(accesses, sort?.ToLower());
 351            int filtered = await accesses?.CountAsync();
 352            return new PaginatedData<List<ControlAccess>>
 353            {
 354                Result = await accesses.Skip(page * limit).Take(limit).ToListAsync(),
 355                TotalCount = total,
 356                TotalFilteredCount = filtered
 357            };
 358        }
 59
 60        /// <summary>
 61        /// получить доступ по id роли и id действия
 62        /// </summary>
 63        /// <param name="roleId">id роли</param>
 64        /// <param name="actionId">id действия</param>
 65        /// <returns></returns>
 166        public async Task<ControlAccess> GetAccess(long roleId, long actionId) => await PrepareAccesses()
 167            .FirstOrDefaultAsync(d => d.RoleId == roleId && d.ActionId == actionId);
 68
 69        /// <summary>
 70        /// предварительаня выборка доступов
 71        /// </summary>
 72        /// <returns></returns>
 973        private IQueryable<ControlAccess> PrepareAccesses() => _db.ControlsAccess
 974           .Include(e=>e.Role)
 975           .Include(e => e.Action)
 976           .Where(e => !e.IsDeleted)
 977           .AsQueryable();
 78
 79        /// <summary>
 80        /// получить доступ по id
 81        /// </summary>
 82        /// <param name="id">id доступа</param>
 83        /// <returns></returns>
 384        public async Task<ControlAccess> GetAccess(long id) => await PrepareAccesses().FirstOrDefaultAsync(e => e.Id == 
 85
 86        /// <summary>
 87        /// Возвращает список доступных действий для текущей роли пользователя
 88        /// </summary>
 89        /// <returns></returns>
 90        public async Task<List<ControlAccess>> GetAvailableAccesses()
 091        {
 092            var accesses = PrepareAccesses().AsNoTracking().Where(e => e.Available == true);
 093            if (!(await _departService.GetDeparmentsList()).Any()) //если нет привязанных подразделений, то исключаем ча
 094                accesses = accesses.Where(x => x.Action.Name != "viewOrders" && x.Action.Name != "viewShipments" && x.Ac
 095            if (_authenticationService.ContragentKindId == (long)ContragentKind.Wholesaler &&
 096                !(_movementService.GetFilterMovementsWithoutPagination(0, 0, _authenticationService.ContragentId)).Any()
 097                accesses = accesses.Where(x => x.Action.Name != "viewShipments");
 098            return await accesses.ToListAsync();
 099        }
 100
 101        /// <summary>
 102        /// создать доступ
 103        /// </summary>
 104        /// <param name="data">доступ</param>
 105        /// <returns></returns>
 106        public async Task Create(ControlAccess data)
 1107        {
 1108            _db.Entry(data.RecState).State = EntityState.Unchanged;
 1109            _db.Entry(data.Role).State = EntityState.Unchanged;
 1110            _db.Entry(data.Action).State = EntityState.Unchanged;
 1111            await _db.ControlsAccess.AddAsync(data);
 1112            await _db.SaveChangesAsync(CurrentUserId);
 1113        }
 114
 115        /// <summary>
 116        /// проверяет существование доступа
 117        /// </summary>
 118        /// <param name="id">id доступа</param>
 119        /// <returns></returns>
 2120        public async Task<bool> AccessExists(long id) => await PrepareAccesses().AsNoTracking().Where(e => e.Id == id).A
 121
 122        /// <summary>
 123        /// обновляет доступ
 124        /// </summary>
 125        /// <param name="data">доступ</param>
 126        /// <returns></returns>
 127        public async Task Update(ControlAccess data)
 1128        {
 1129            if (!(await AccessExists(data.Id)))
 0130            {
 0131                throw new ArgumentException($"Запись с id={data.Id} не найдена");
 132            }
 1133            _db.ControlsAccess.Update(data);
 1134            await _db.SaveChangesAsync(CurrentUserId);
 1135        }
 136
 137        /// <summary>
 138        /// удалить доступ
 139        /// </summary>
 140        /// <param name="id">id доступа</param>
 141        /// <returns></returns>
 142        public async Task Delete(long id)
 1143        {
 1144            ControlAccess rec = await _db.ControlsAccess.FindAsync(id);
 1145            if (rec == null)
 0146                throw new KeyNotFoundException($"Запись с id={id} не найдена");
 1147            rec.IsDeleted = true;
 1148            await _db.SaveChangesAsync(CurrentUserId);
 1149        }
 150
 151        /// <summary>
 152        /// сортировка
 153        /// </summary>
 154        /// <param name="items">выборка доступов</param>
 155        /// <param name="sort">тип сортировки</param>
 156        /// <returns></returns>
 3157        private IQueryable<ControlAccess> Sort(IQueryable<ControlAccess> items, string sort = default) => (sort ?? "").T
 3158        {
 3159            "roleid" => items.OrderBy(d => d.RoleId),
 3160            "roleid|desc" => items.OrderByDescending(d => d.RoleId),
 3161            "available" => items.OrderBy(d => d.Available),
 3162            "available|desc" => items.OrderByDescending(d => d.Available),
 3163            "action|desc" => items.OrderByDescending(d => d.Action.Name),
 3164            _ => items.OrderBy(d => d.Action.Name)
 3165        };
 166
 167        /// <summary>
 168        /// получить список действий
 169        /// </summary>
 170        /// <param name="typeId">id действия. Если 0, то все выводить</param>
 171        /// <param name="filter">фильтр по названию действия</param>
 172        /// <returns></returns>
 173        public async Task<List<FrontAction>> GetActions(long typeId, string filter = null)
 3174        {
 3175            var data = _db.FrontActions
 3176             .AsNoTracking()
 3177             .Where(x => typeId == 0 || x.Id == typeId)
 3178             .Where(x => string.IsNullOrWhiteSpace(filter) || x.Name.ToLower().Contains(filter.ToLower()))
 3179             .Where(d => !d.IsDeleted);
 3180            return await data.ToListAsync();
 3181        }
 182
 183        /// <summary>
 184        /// получить действие по id
 185        /// </summary>
 186        /// <param name="id">id действия</param>
 187        /// <returns></returns>
 1188        public async Task<FrontAction> GetAction(long id) => await _db.FrontActions
 1189             .Where(d => !d.IsDeleted && d.Id == id).FirstOrDefaultAsync();
 190    }
 191}