From 4aaac31c431f20f77308b746413ecb7d9d8ac304 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Fri, 3 Dec 2021 09:44:10 +0500 Subject: [PATCH] nit refacroring before merge --- AsbCloudApp/Services/IPermissionService.cs | 6 +- AsbCloudInfrastructure/DependencyInjection.cs | 36 +++--- .../Services/PermissionService.cs | 38 +++--- .../Services/UserRoleService.cs | 95 ++++++++------- .../Controllers/AdminPermissionController.cs | 108 +++--------------- .../AdminPermissionInfoController.cs | 18 +++ .../Controllers/AdminUserRoleController.cs | 2 +- AsbCloudWebApi/Controllers/CrudController.cs | 17 ++- 8 files changed, 142 insertions(+), 178 deletions(-) create mode 100644 AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs diff --git a/AsbCloudApp/Services/IPermissionService.cs b/AsbCloudApp/Services/IPermissionService.cs index c3bdf2c9..e5b9101e 100644 --- a/AsbCloudApp/Services/IPermissionService.cs +++ b/AsbCloudApp/Services/IPermissionService.cs @@ -7,10 +7,10 @@ namespace AsbCloudApp.Services { public interface IPermissionService { - Task> GetallAsync(int idRole, CancellationToken token); + Task> GetByIdRoleAsync(int idRole, CancellationToken token); Task InsertRangeAsync(IEnumerable dtos, CancellationToken token); - Task UpdateAsync(int id, PermissionDto dto, CancellationToken token); - Task DeleteAsync(int idRole, int idPermission, CancellationToken token); + Task UpdateAsync(PermissionDto dto, CancellationToken token); + Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token); } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index e1900270..87728603 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -30,36 +30,36 @@ namespace AsbCloudInfrastructure services.AddSingleton(); services.AddTransient(); - services.AddTransient(); services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); + services.AddTransient(); // admin crud services: - services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); - services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, DrillParamsService>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); services.AddTransient, CrudServiceBase>(); services.AddTransient, UserRoleService>(); - services.AddTransient, CrudServiceBase>(); - services.AddTransient, DrillParamsService>(); - services.AddTransient(); - services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); // TelemetryData services services.AddTransient, TelemetryDataSaubService>(); diff --git a/AsbCloudInfrastructure/Services/PermissionService.cs b/AsbCloudInfrastructure/Services/PermissionService.cs index b79824ae..0bd178b2 100644 --- a/AsbCloudInfrastructure/Services/PermissionService.cs +++ b/AsbCloudInfrastructure/Services/PermissionService.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services { - public class PermissionService : IPermissionService + public class PermissionService : IPermissionService, IConverter { private readonly IAsbCloudDbContext db; @@ -18,42 +18,52 @@ namespace AsbCloudInfrastructure.Services { this.db = db; } - - public async Task> GetallAsync(int idRole, CancellationToken token) + public async Task> GetByIdRoleAsync(int idRole, CancellationToken token) { - var entities = await (from p in db.Permissions - where p.IdUserRole == idRole - select p) - .ToListAsync(token).ConfigureAwait(false); - var dto = entities.Adapt(); + var entities = await db.Permissions + .Where(p => p.IdUserRole == idRole) + .ToListAsync(token) + .ConfigureAwait(false); + var dto = entities.Select(Convert); return dto; } public Task InsertRangeAsync(IEnumerable dtos, CancellationToken token) { - var entities = dtos.Adapt(); - + var entities = dtos.Select(Convert); db.Permissions.AddRange(entities); return db.SaveChangesAsync(token); } - public Task UpdateAsync(int id, PermissionDto dto, CancellationToken token) + public Task UpdateAsync(PermissionDto dto, CancellationToken token) { - var entity = dto.Adapt(); + var entity = Convert(dto); db.Permissions.Update(entity); return db.SaveChangesAsync(token); } - public Task DeleteAsync(int idRole, int idPermission, CancellationToken token) + public Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token) { var entities = db.Permissions.AsNoTracking() - .Where(e => e.IdUserRole == idRole && e.IdPermission == idPermission) + .Where(e => e.IdUserRole == idUserRole && e.IdPermission == idPermission) .ToList(); if (!entities.Any()) return Task.FromResult(0); db.Permissions.RemoveRange(entities); return db.SaveChangesAsync(token); } + + public Permission Convert(PermissionDto src) + { + var entity = src.Adapt(); + return entity; + } + + public PermissionDto Convert(Permission src) + { + var dto = src.Adapt(); + return dto; + } } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs index 0deb7e14..f5a154f1 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -7,31 +7,25 @@ using AsbCloudApp.Data; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.Cache; using Mapster; +using AsbCloudApp.Services; namespace AsbCloudInfrastructure.Services { public class UserRoleService : CrudServiceBase { private readonly CacheTable cacheUserRoles; - private readonly CacheTable cachePermissionsInfo; - private readonly CacheTable cachePermissions; - private int counter = 0; + private readonly IPermissionService permissionService; - public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb) : base(context) + public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb, IPermissionService permissionService) : base(context) { cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)context); - cachePermissionsInfo = cacheDb.GetCachedTable((AsbCloudDbContext)context); - cachePermissions = - cacheDb.GetCachedTable((AsbCloudDbContext)context); + this.permissionService = permissionService; } public override async Task> GetPageAsync(int skip = 0, int take = 32, CancellationToken token = default) { - var rolesDtos = await base.GetPageAsync(skip, take,token); - - rolesDtos.Items = rolesDtos.Items.Select(FillUserRoleWithPermissions).ToList(); - + var rolesDtos = await base.GetPageAsync(skip, take, token); return rolesDtos; } @@ -39,19 +33,19 @@ namespace AsbCloudInfrastructure.Services { var roleDto = await base.GetAsync(id,token); - return roleDto is null - ? null - : FillUserRoleWithPermissions(roleDto); + return roleDto; } public override async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) { - var newRoleId = await base.InsertAsync(dto, token); - - var newRolePermissions = GetAncestorsPermissions(newRoleId, - dto.Permissions.Adapt(), dto.IdParent, ref counter); - - return await cachePermissions.InsertAsync(newRolePermissions, token); + var id = await base.InsertAsync(dto, token).ConfigureAwait(false); + if (dto.Permissions is not null && dto.Permissions.Any()) + { + foreach (var permission in dto.Permissions) + permission.IdUserRole = id; + await permissionService.InsertRangeAsync(dto.Permissions, token).ConfigureAwait(false); + } + return id; } public override async Task UpdateAsync(int id, UserRoleDto item, CancellationToken token = default) @@ -61,45 +55,48 @@ namespace AsbCloudInfrastructure.Services var result = await base.UpdateAsync(id, item, token); - await cachePermissions.RemoveAsync(r => r.IdUserRole == item.Id, token) - .ConfigureAwait(false); - - var newPermissions = item.Permissions.Adapt(); - - await cachePermissions.InsertAsync(newPermissions, token); - return result; } - private UserRoleDto FillUserRoleWithPermissions(UserRoleDto roleDto) + private IEnumerable GetNestedPermissions(UserRole role, int counter = 10) { - roleDto.Permissions = cachePermissions.Where(c => - c.IdUserRole == roleDto.Id).Adapt(); + List permissions = role.Permissions.ToList(); + if (role.IdParent is not null) + { + if(counter == 0) + { + Trace.WriteLine($"User role with id: {role.Id} has more than 10 nested childs"); + return permissions; + } + var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == role.IdParent); + + if(parentRole is null) + return permissions; - return roleDto; + var parentPermissions = GetNestedPermissions(parentRole, counter--); + Merge(ref permissions, parentPermissions); + } + return permissions; } - private IEnumerable GetAncestorsPermissions(int idRole, IEnumerable currentPermissions, - int? idParent, ref int counter) + private static void Merge(ref List permissions, IEnumerable newPermissions) { - if (idParent == null) - return currentPermissions; - - if (counter > 10) + foreach (var newPermission in newPermissions) { - Trace.WriteLine($"User role with id: {idRole} has more than 10 nested parents"); - return currentPermissions; + var permissionIndex = permissions.FindIndex(p => p.IdPermission == newPermission.IdPermission); + if (permissionIndex == -1) + permissions.Add(newPermission); + else + { + var permission = permissions[permissionIndex]; + permissions[permissionIndex] = new Permission + { + IdPermission = permission.IdPermission, + IdUserRole = permission.IdUserRole, + PermissionValue = permission.PermissionValue | newPermission.PermissionValue, + }; + } } - - var parentRole = cacheUserRoles.FirstOrDefault(r => r.Id == idParent); - var parentRolePermissions = cachePermissions.Where(p => - p.IdUserRole == parentRole.Id); - var resultPermissions = currentPermissions.Union(parentRolePermissions); - - counter++; - - return GetAncestorsPermissions(parentRole.Id, resultPermissions, - parentRole.IdParent, ref counter); } } } \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/AdminPermissionController.cs b/AsbCloudWebApi/Controllers/AdminPermissionController.cs index b7e6c2a4..aa6a77b3 100644 --- a/AsbCloudWebApi/Controllers/AdminPermissionController.cs +++ b/AsbCloudWebApi/Controllers/AdminPermissionController.cs @@ -8,91 +8,16 @@ using Microsoft.AspNetCore.Mvc; namespace AsbCloudWebApi.Controllers { - [Route("api/admin/user")] + [Route("api/admin/permission")] [ApiController] [Authorize] public class AdminPermissionController : ControllerBase { private readonly IPermissionService permissionService; - private readonly ICrudService permissionInfoService; - public AdminPermissionController(IPermissionService permissionService, - ICrudService permissionInfoService) + public AdminPermissionController(IPermissionService permissionService) { this.permissionService = permissionService; - this.permissionInfoService = permissionInfoService; - } - - /// - /// Получает список доступных в справочнике разрешений - /// - /// Токен отмены задачи - /// - [HttpGet("permissionInfo")] - [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAllAsync(CancellationToken token = default) - { - var result = await permissionInfoService.GetAllAsync(token); - return Ok(result); - } - - /// - /// Получает запрашиваемое из справочника разрешение - /// - /// id запрашиваемого разрешения из справочника - /// Токен отмены задачи - /// - [HttpGet("permissionInfo/{id}")] - [ProducesResponseType(typeof(PermissionInfoDto), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAsync(int id, CancellationToken token = default) - { - var result = await permissionInfoService.GetAsync(id, token); - return Ok(result); - } - - /// - /// Добавляет разрешения для роли - /// - /// Объекты новых разрешений для справочника - /// Токен отмены задачи - /// - [HttpPost("permissionInfo")] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task InsertRangeAsync(IEnumerable dtos, - CancellationToken token = default) - { - var result = await permissionInfoService.InsertRangeAsync(dtos, token); - return Ok(result); - } - - /// - /// Обновляет разрешение для роли - /// - /// id объекта разрешения - /// Объект разрешения - /// Токен отмены задачи - /// - [HttpPut("permissionInfo")] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task UpdateAsync(int id, PermissionInfoDto dto, - CancellationToken token = default) - { - var result = await permissionInfoService.UpdateAsync(id, dto, token); - return Ok(result); - } - - /// - /// Удаляет разрешение для роли - /// - /// id объекта разрешения из справочника - /// Токен отмены задачи - /// - [HttpDelete("permissionInfo")] - [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task DeleteAsync(int id, CancellationToken token = default) - { - var result = await permissionInfoService.DeleteAsync(id, token); - return Ok(result); } /// @@ -101,11 +26,11 @@ namespace AsbCloudWebApi.Controllers /// id роли /// Токен отмены задачи /// - [HttpGet("permission")] + [HttpGet] [ProducesResponseType(typeof(IEnumerable), (int)System.Net.HttpStatusCode.OK)] - public async Task GetAllAsync(int idRole, CancellationToken token = default) + public async Task GetByIdRoleAsync(int idRole, CancellationToken token = default) { - var result = await permissionService.GetallAsync(idRole, token); + var result = await permissionService.GetByIdRoleAsync(idRole, token); return Ok(result); } @@ -115,7 +40,7 @@ namespace AsbCloudWebApi.Controllers /// Объекты новых разрешений для справочника /// Токен отмены задачи /// - [HttpPost("permission")] + [HttpPost] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task InsertRangeAsync(IEnumerable dtos, CancellationToken token = default) @@ -123,36 +48,35 @@ namespace AsbCloudWebApi.Controllers var result = await permissionService.InsertRangeAsync(dtos, token); return Ok(result); } - + /// - /// Обновляет разрешение в правочник + /// Обновляет разрешение для роли /// - /// id объекта разрешения для справочника /// Объект разрешения для справочника /// Токен отмены задачи /// - [HttpPut("permission")] + [HttpPut] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task UpdateAsync(int id, PermissionDto dto, + public async Task UpdateAsync(PermissionDto dto, CancellationToken token = default) { - var result = await permissionService.UpdateAsync(id, dto, token); + var result = await permissionService.UpdateAsync(dto, token); return Ok(result); } - + /// /// Удаляет разрешение для роли /// - /// id роли для удаления разрешения /// id разрешения + /// id роли для удаления разрешения /// Токен отмены задачи /// - [HttpDelete("permission")] + [HttpDelete("{idPermission}/{idRole}")] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] - public async Task DeleteAsync(int idRole, int idPermission, + public async Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token = default) { - var result = await permissionService.DeleteAsync(idRole, idPermission, token); + var result = await permissionService.DeleteAsync(idUserRole, idPermission, token); return Ok(result); } } diff --git a/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs b/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs new file mode 100644 index 00000000..99a0a673 --- /dev/null +++ b/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs @@ -0,0 +1,18 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace AsbCloudWebApi.Controllers +{ + [Route("api/admin/permissionInfo")] + [ApiController] + [Authorize] + public class AdminPermissionInfoController : CrudController> + { + public AdminPermissionInfoController(ICrudService permissionInfoService) + :base(permissionInfoService) + {} + + } +} \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/AdminUserRoleController.cs b/AsbCloudWebApi/Controllers/AdminUserRoleController.cs index c0325326..7a2a0067 100644 --- a/AsbCloudWebApi/Controllers/AdminUserRoleController.cs +++ b/AsbCloudWebApi/Controllers/AdminUserRoleController.cs @@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc; namespace AsbCloudWebApi.Controllers { - [Route("api/admin/user/role")] + [Route("api/admin/role")] [ApiController] [Authorize] public class AdminUserRoleController : CrudController> diff --git a/AsbCloudWebApi/Controllers/CrudController.cs b/AsbCloudWebApi/Controllers/CrudController.cs index 20cf2c4e..c990da79 100644 --- a/AsbCloudWebApi/Controllers/CrudController.cs +++ b/AsbCloudWebApi/Controllers/CrudController.cs @@ -48,6 +48,21 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } + /// + /// Получить все записи + /// + /// CancellationToken + /// все записи + [HttpGet("all")] + public virtual async Task>> GetAll(CancellationToken token = default) + { + if (!Roles.Any(role => User.IsInRole(role))) + return Forbid(); + + var result = await service.GetAllAsync(token).ConfigureAwait(false); + return Ok(result); + } + /// /// Получить одну запись по Id /// @@ -69,7 +84,7 @@ namespace AsbCloudWebApi.Controllers /// /// запись /// - /// 1 - добавлено, 0 - нет + /// id [HttpPost] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public virtual async Task Insert([FromBody] T value, CancellationToken token = default)