< Summary

Class:WinSolutions.Sveta.Server.Services.Implements.UserService
Assembly:WinSolutions.Sveta.Server
File(s):/opt/dev/sveta_api_build/WinSolutions.Sveta.Server/Services/Implements/UserService.cs
Covered lines:30
Uncovered lines:72
Coverable lines:102
Total lines:232
Line coverage:29.4% (30 of 102)
Covered branches:2
Total branches:28
Branch coverage:7.1% (2 of 28)

Metrics

MethodLine coverage Branch coverage
.ctor(...)100%100%
GetUsers()0%0%
GetUsers()0%100%
GetDepartmentUsers()0%100%
GetUserDepartments()100%100%
PrepareUsers()0%100%
Create()100%100%
Delete()0%0%
GetUser()100%100%
GetContragentOwner()100%100%
WhoAmI()0%100%
GetAllUsers()0%100%
UserExists()0%100%
Update()0%100%
GetRoles()0%100%
GetRole()0%100%

File(s)

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

#LineLine coverage
 1using Microsoft.EntityFrameworkCore;
 2using Microsoft.Extensions.Logging;
 3using System;
 4using System.Collections.Generic;
 5using System.Linq;
 6using System.Text;
 7using System.Threading.Tasks;
 8using WinSolutions.Sveta.Server.Data.DataModel.Contexts;
 9using WinSolutions.Sveta.Server.Data.DataModel.Entities;
 10using WinSolutions.Sveta.Server.Services.Interfaces;
 11using WinSolutions.Sveta.Server.Domain;
 12using WinSolutions.Sveta.Common;
 13
 14namespace WinSolutions.Sveta.Server.Services.Implements
 15{
 16    public class UserService : SvetaServiceBase, IUserService
 17    {
 18        private readonly SvetaDbContext _db;
 19        private readonly ILogger<UserService> _logger;
 20        private readonly ICommonUserService _commonUserService;
 21        private readonly IAuthenticationService _authenticationService;
 22
 23        public UserService(SvetaDbContext db, ILogger<UserService> logger, ICommonUserService commonUserService, IAuthen
 18624            : base(authenticationService)
 18625        {
 18626            _authenticationService = authenticationService;
 18627            _commonUserService = commonUserService;
 18628            _db = db;
 18629            _logger = logger;
 18630        }
 31
 32        /// <summary>
 33        /// получает список записей с пагинацией, фильтрацией и сортировкой
 34        /// </summary>
 35        /// <param name="page">номер страницы</param>
 36        /// <param name="limit">размер страницы</param>
 37        /// <param name="filter">фильтр по фамилии, телефону и емейлу</param>
 38        /// <param name="sort">сортировка по логину, фамилии или имени</param>
 39        /// <param name="contragentId">id контрагента</param>
 40        /// <returns></returns>
 41        public async Task<PaginatedData<List<User>>> GetUsers(int page, int? limit, string filter, string sort, long con
 042        {
 043            var users = PrepareUsers().AsNoTracking().Where(x => x.Id != -1); //исключаем уз без КА
 44            //Тотал записей для смертных считаем после прмиенения ограничения роли
 045            int total = await users?.CountAsync(x => _authenticationService.IsUserPlatform() || x.Contragent.Id == contr
 046            users = users.Where(x => contragentId == 0 || x.Contragent.Id == contragentId)
 047            .Where(x => string.IsNullOrWhiteSpace(filter) || x.LastName.ToUpper().Contains(filter.ToUpper()) || x.Phone.
 048            switch ((sort ?? "").ToLower())
 49            {
 050                case "firstName": users = users.OrderBy(x => x.FirstName); break;
 051                case "firstName|desc": users = users.OrderByDescending(x => x.FirstName); break;
 052                case "lastName": users = users.OrderBy(x => x.LastName); break;
 053                case "lastName|desc": users = users.OrderByDescending(x => x.LastName); break;
 054                case "login": users = users.OrderBy(x => x.Login); break;
 055                case "login|desc": users = users.OrderByDescending(x => x.Login); break;
 056                default: users = users.OrderBy(x => x.Id); break;
 57            }
 058            int filtered = await users?.CountAsync();
 059            if (limit != null)
 060                users = users.Skip(page * (int)limit).Take((int)limit);
 061            return new PaginatedData<List<User>>
 062            {
 063                Result = await users.ToListAsync(),
 064                TotalCount = total,
 065                TotalFilteredCount = filtered
 066            };
 067        }
 68
 69        /// <summary>
 70        /// получить список записей
 71        /// </summary>
 72        /// <param name="contragentId">id контрагента</param>
 73        /// <returns></returns>
 074        public async Task<List<User>> GetUsers(long contragentId) => await PrepareUsers()
 075                .Where(x => contragentId <= 0 || x.Contragent.Id == contragentId).ToListAsync();
 76
 77        /// <summary>
 78        /// получает список пользователей, привязанных к указанному подразделению
 79        /// </summary>
 80        /// <param name="departmentId">id подразделения</param>
 81        /// <returns></returns>
 082        public async Task<List<User>> GetDepartmentUsers(long departmentId) => await PrepareUsers()
 083            .Where(x => x.UsersDepartments.Select(d => d.DepartmentId).Contains(departmentId))
 084            .ToListAsync();
 85
 86        /// <summary>
 87        /// Получает список подразделений, привязанных к переданному юзеру
 88        /// </summary>
 89        /// <param name="userId">id юзера</param>
 90        /// <returns></returns>
 91        public async Task<List<Department>> GetUserDepartments(long userId) =>
 13192            (await GetUser(userId))
 13193            .UsersDepartments
 26294            .Select(d => d.Department).ToList();
 95
 96        /// <summary>
 97        /// предварительная выборка записей
 98        /// </summary>
 99        /// <returns></returns>
 0100        private IQueryable<User> PrepareUsers() => _db.Users
 0101            .Include(d => d.Contragent)
 0102            .ThenInclude(Contragent => Contragent.ContragentsKind)
 0103            .Include(d => d.Contragent)
 0104            .ThenInclude(Contragent => Contragent.Owner)
 0105            .Include(d => d.RecState)
 0106            .Include(d => d.UsersDepartments)
 0107            .ThenInclude(UsersDepartments => UsersDepartments.Department)
 0108            .Where(d => !d.IsDeleted)
 0109            .AsQueryable();
 110
 111        /// <summary>
 112        /// создает запись
 113        /// </summary>
 114        /// <param name="data">объект User</param>
 115        /// <returns></returns>
 116        public async Task Create(User data)
 570117        {
 570118            await _commonUserService.Create(data, CurrentUserId);
 570119        }
 120
 121        /// <summary>
 122        /// удаляет запись
 123        /// </summary>
 124        /// <param name="id">id записи</param>
 125        /// <returns></returns>
 126        public async Task Delete(long id)
 0127        {
 0128            var data = await _db.Users
 0129                .Where(d => !d.IsDeleted)
 0130                .FirstAsync(u=>u.Id == id);
 0131            if (data == null)
 0132            {
 0133                throw new KeyNotFoundException($"Пользователь с id={id} не найден");
 134            }
 0135            data.IsDeleted = true;
 0136            await _db.SaveChangesAsync(CurrentUserId);
 0137        }
 138
 139        /// <summary>
 140        /// получить запись
 141        /// </summary>
 142        /// <param name="id">id юзера</param>
 143        /// <returns></returns>
 1618144        public async Task<User> GetUser(long id) => await _db.Users
 1618145            .Include(d => d.Contragent)
 1618146            .ThenInclude(Contragent => Contragent.ContragentsKind)
 1618147            .Include(d => d.Contragent)
 1618148            .ThenInclude(Contragent => Contragent.Owner)
 1618149            .Include(d => d.RecState)
 1618150            .Include(d => d.UsersDepartments)
 1618151            .ThenInclude(UsersDepartments => UsersDepartments.Department)
 1618152            .ThenInclude(Contragent => Contragent.Contragent)
 1618153            .Where(d => !d.IsDeleted)
 1618154            .FirstOrDefaultAsync(d => d.Id == id);
 155
 156        /// <summary>
 157        /// Возвращает владельца контрагента
 158        /// </summary>
 159        /// <param name="contragentId">Идентификатор контрагента</param>
 160        /// <returns></returns>
 138161        public async Task<User> GetContragentOwner(long contragentId) => await _db.Users
 138162            .Include(d => d.Contragent)
 138163            .Where(d => !d.IsDeleted)
 138164            .Where(d => d.Contragent.Id == contragentId)
 138165            .Select(d => d.Contragent.Owner)
 138166            .FirstOrDefaultAsync();
 167
 168
 169        /// <summary>
 170        /// получает информацию о юзере
 171        /// </summary>
 172        /// <param name="id">id юзера</param>
 173        /// <returns></returns>
 0174        public async Task<User> WhoAmI(long id) => await PrepareUsers()
 0175            .Include(d => d.Contragent)
 0176                .ThenInclude(Contragent => Contragent.JuridicAddress)
 0177            .Include(d => d.Contragent)
 0178                .ThenInclude(Contragent => Contragent.PhysicAddress)
 0179            .FirstOrDefaultAsync(d => d.Id == id);
 180
 181        /// <summary>
 182        /// получить все записи юзеров
 183        /// </summary>
 184        /// <returns></returns>
 0185        public async Task<List<User>> GetAllUsers() => await PrepareUsers()
 0186            .Where(x => x.Id != -1) //исключаем уз без КА
 0187            .AsNoTracking()
 0188            .ToListAsync();
 189
 190        /// <summary>
 191        /// проверяет существование записи
 192        /// </summary>
 193        /// <param name="id">id записи</param>
 194        /// <returns></returns>
 0195        public async Task<bool> UserExists(long id) => await _commonUserService.UserExists(id);
 196
 197        /// <summary>
 198        /// обновляет запись
 199        /// </summary>
 200        /// <param name="data">объект User</param>
 201        /// <returns></returns>
 202        public async Task Update(User data)
 0203        {
 0204            await _commonUserService.Update(data,CurrentUserId);
 0205        }
 206
 207        /// <summary>
 208        /// получить список ролей
 209        /// </summary>
 210        /// <param name="id">id роли</param>
 211        /// <param name="filter">фильтр по названию роли</param>
 212        /// <returns></returns>
 213        public async Task<List<Roles>> GetRoles(long id, string filter = null)
 0214        {
 0215            var data = _db.Roles
 0216             .AsNoTracking()
 0217             .Where(x => id == 0 || x.Id == id)
 0218             .Where(x => string.IsNullOrWhiteSpace(filter) || x.Name.ToLower().Contains(filter.ToLower()))
 0219             .Where(d => !d.IsDeleted);
 0220            return await data.ToListAsync();
 0221        }
 222
 223        /// <summary>
 224        /// получить роль
 225        /// </summary>
 226        /// <param name="id">id роли</param>
 227        /// <returns></returns>
 0228        public async Task<Roles> GetRole(long id) => await _db.Roles
 0229             .Where(d => !d.IsDeleted && d.Id == id).FirstOrDefaultAsync();
 230
 231    }
 232}