diff --git a/AsbCloudApp/Services/ICrudService.cs b/AsbCloudApp/Services/ICrudService.cs index e80c1a16..99f42035 100644 --- a/AsbCloudApp/Services/ICrudService.cs +++ b/AsbCloudApp/Services/ICrudService.cs @@ -8,13 +8,12 @@ namespace AsbCloudApp.Services where Tdto : Data.IId { List Incledes { get; } - Task DeleteAsync(int id, CancellationToken token = default); - Task DeleteAsync(IEnumerable ids, CancellationToken token = default); - Task> GetAllAsync(CancellationToken token = default); - Task GetAsync(int id, CancellationToken token = default); - Task> GetPageAsync(int skip = 0, int take = 32, CancellationToken token = default); Task InsertAsync(Tdto newItem, CancellationToken token = default); Task InsertRangeAsync(IEnumerable newItems, CancellationToken token = default); + Task> GetAllAsync(CancellationToken token = default); + Task GetAsync(int id, CancellationToken token = default); Task UpdateAsync(int id, Tdto item, CancellationToken token = default); + Task DeleteAsync(int id, CancellationToken token = default); + Task DeleteAsync(IEnumerable ids, CancellationToken token = default); } } \ No newline at end of file diff --git a/AsbCloudApp/Services/IPaginationService.cs b/AsbCloudApp/Services/IPaginationService.cs new file mode 100644 index 00000000..57195edb --- /dev/null +++ b/AsbCloudApp/Services/IPaginationService.cs @@ -0,0 +1,10 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudApp.Services +{ + public interface IPaginationService + { + Task> GetPageAsync(int skip = 0, int take = 32, CancellationToken token = default); + } +} \ No newline at end of file diff --git a/AsbCloudApp/Services/IPermissionService.cs b/AsbCloudApp/Services/IPermissionService.cs index e5b9101e..a4c6cb66 100644 --- a/AsbCloudApp/Services/IPermissionService.cs +++ b/AsbCloudApp/Services/IPermissionService.cs @@ -11,6 +11,6 @@ namespace AsbCloudApp.Services Task InsertRangeAsync(IEnumerable dtos, CancellationToken token); Task UpdateAsync(PermissionDto dto, CancellationToken token); Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token); - + Task DeleteAllByRoleAsync(int idUserRole, CancellationToken token); } } \ No newline at end of file diff --git a/AsbCloudApp/Services/IUserRoleService.cs b/AsbCloudApp/Services/IUserRoleService.cs new file mode 100644 index 00000000..1cf59eb5 --- /dev/null +++ b/AsbCloudApp/Services/IUserRoleService.cs @@ -0,0 +1,8 @@ +using AsbCloudApp.Data; + +namespace AsbCloudApp.Services +{ + public interface IUserRoleService: ICrudService + { + } +} \ No newline at end of file diff --git a/AsbCloudApp/Services/IWellCompositeService.cs b/AsbCloudApp/Services/IWellCompositeService.cs index 16132642..0e0be853 100644 --- a/AsbCloudApp/Services/IWellCompositeService.cs +++ b/AsbCloudApp/Services/IWellCompositeService.cs @@ -1,8 +1,5 @@ using AsbCloudApp.Data; -using System; using System.Collections.Generic; -using System.Linq; -using System.Text; using System.Threading; using System.Threading.Tasks; diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 78b7635f..84267023 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -42,41 +42,35 @@ namespace AsbCloudInfrastructure 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, DrillParamsService>(); - services.AddTransient, CrudServiceBase>(); - services.AddTransient, CrudServiceBase>(); - services.AddTransient, CrudServiceBase>(); - services.AddTransient, UserRoleService>(); services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, DrillParamsService>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); + services.AddTransient, CrudServiceBase>(); // TelemetryData services services.AddTransient, TelemetryDataSaubService>(); diff --git a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs index b68637fa..ebee1683 100644 --- a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs +++ b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs @@ -14,7 +14,7 @@ namespace AsbCloudInfrastructure.Services.Cache { private const int semaphoreTimeout = 5_000; private static readonly SemaphoreSlim semaphore = new(1); - private static readonly TimeSpan minPeriodRefresh = TimeSpan.FromSeconds(5); + private static readonly TimeSpan minPeriodRefresh = TimeSpan.FromSeconds(5); private static readonly string nameOfTEntity = typeof(TEntity).Name; private readonly CacheTableDataStore data; @@ -37,7 +37,7 @@ namespace AsbCloudInfrastructure.Services.Cache result = result.Include(include); return result; }; - + cached = (List)data.Entities; if ((cached.Count == 0) || data.IsObsolete) @@ -47,7 +47,7 @@ namespace AsbCloudInfrastructure.Services.Cache internal CacheTable(DbContext context, CacheTableDataStore data, Func, IQueryable> configureDbSet = null) { this.context = context; - this.data = data; + this.data = data; this.configureDbSet = configureDbSet; dbSet = context.Set(); @@ -65,15 +65,17 @@ namespace AsbCloudInfrastructure.Services.Cache /// It may be needed to avoid multiple operations like Refresh(). /// /// (wasFree) => {...} - /// false - semaphore.Wait returned by timeout - private static bool Sync(Action action) + /// default if semaphoreTimeout. Or result of func(..) + private static T Sync(Func func) { var wasFree = semaphore.CurrentCount > 0; - if (!semaphore.Wait(semaphoreTimeout)) - return false; + T result = default; + if (func is null || !semaphore.Wait(semaphoreTimeout)) + return result; + try { - action?.Invoke(wasFree); + result = func.Invoke(wasFree); } catch (Exception ex) { @@ -85,7 +87,7 @@ namespace AsbCloudInfrastructure.Services.Cache { semaphore.Release(); } - return true; + return result; } /// @@ -94,15 +96,18 @@ namespace AsbCloudInfrastructure.Services.Cache /// It may be needed to avoid multiple operations like Refresh(). /// /// (wasFree) => {...} - /// false - semaphore.Wait returned by timeout - private static async Task SyncAsync(Func task, CancellationToken token = default) + /// default if semaphoreTimeout. Or result of func(..) + private static async Task SyncAsync(Func> funcAsync, CancellationToken token = default) { var wasFree = semaphore.CurrentCount > 0; - if (!await semaphore.WaitAsync(semaphoreTimeout, token).ConfigureAwait(false)) - return false; + T result = default; + + if (funcAsync is null || !await semaphore.WaitAsync(semaphoreTimeout, token).ConfigureAwait(false)) + return result; + try { - await task?.Invoke(wasFree, token); + result = await funcAsync.Invoke(wasFree, token); } catch (Exception ex) { @@ -114,10 +119,10 @@ namespace AsbCloudInfrastructure.Services.Cache { semaphore.Release(); } - return true; + return result; } - private void InternalRefresh(bool force) + private int InternalRefresh(bool force) { if (force || data.LastResreshDate + minPeriodRefresh < DateTime.Now) { @@ -126,11 +131,12 @@ namespace AsbCloudInfrastructure.Services.Cache var entities = query.AsNoTracking().ToList(); //Trace.WriteLine($"CacheTable<{nameOfTEntity}> refresh"); cached.AddRange(entities); - data.LastResreshDate = DateTime.Now; + data.LastResreshDate = DateTime.Now; } + return cached.Count; } - private async Task InternalRefreshAsync(bool force, CancellationToken token = default) + private async Task InternalRefreshAsync(bool force, CancellationToken token = default) { if (force || data.LastResreshDate + minPeriodRefresh < DateTime.Now) { @@ -142,24 +148,18 @@ namespace AsbCloudInfrastructure.Services.Cache cached.AddRange(entities); data.LastResreshDate = DateTime.Now; } + return cached.Count; } public int Refresh(bool force) - { - Sync((wasFree) => { - if (wasFree) - InternalRefresh(force); - }); - return cached.Count; - } + => Sync((wasFree) => wasFree ? InternalRefresh(force) : 0); - public async Task RefreshAsync(bool force, CancellationToken token = default) + public Task RefreshAsync(bool force, CancellationToken token = default) { - await SyncAsync(async (wasFree, token) => { - if (wasFree) - await InternalRefreshAsync(force, token).ConfigureAwait(false); - }, token).ConfigureAwait(false); - return cached.Count; + return SyncAsync(async (wasFree, token) => + { + return wasFree ? await InternalRefreshAsync(force, token).ConfigureAwait(false) : 0; + }, token); } public bool Contains(Func predicate) @@ -169,25 +169,22 @@ namespace AsbCloudInfrastructure.Services.Cache => await FirstOrDefaultAsync(predicate, token) != default; public TEntity GetOrCreate(Func predicate, Func makeNew) + => Sync(wasFree => { - TEntity result = default; - Sync(wasFree => { - result = cached.FirstOrDefault(predicate); - if (result != default) - return; + var result = cached.FirstOrDefault(predicate); + if (result != default) + return result; - InternalRefresh(true); - result = cached.FirstOrDefault(predicate); - if (result != default) - return; + InternalRefresh(true); + result = cached.FirstOrDefault(predicate); + if (result != default) + return result; - var entry = dbSet.Add(makeNew()); - context.SaveChanges(); - InternalRefresh(true); - result = entry.Entity; - }); - return result; - } + var entry = dbSet.Add(makeNew()); + context.SaveChanges(); + InternalRefresh(true); + return entry.Entity; + }); public TEntity FirstOrDefault() { @@ -206,7 +203,7 @@ namespace AsbCloudInfrastructure.Services.Cache return result; await RefreshAsync(false, token); - return cached.FirstOrDefault(); + return cached.FirstOrDefault(); } public TEntity FirstOrDefault(Func predicate) @@ -263,11 +260,11 @@ namespace AsbCloudInfrastructure.Services.Cache return result; } - public void Upsert(TEntity entity) + public int Upsert(TEntity entity) { if (entity == default) - return; - Sync((wasFree) => + return 0; + return Sync((wasFree) => { if (dbSet.Contains(entity)) dbSet.Update(entity); @@ -276,46 +273,51 @@ namespace AsbCloudInfrastructure.Services.Cache var affected = context.SaveChanges(); if (affected > 0) InternalRefresh(true); - }); + return affected; + }); } - public Task UpsertAsync(TEntity entity, CancellationToken token = default) - => SyncAsync(async (wasFree, token) => { - if (dbSet.Contains(entity)) - dbSet.Update(entity); - else - dbSet.Add(entity); - var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); - if(affected > 0) - await InternalRefreshAsync(true, token).ConfigureAwait(false); - }, token); + public Task UpsertAsync(TEntity entity, CancellationToken token = default) + => SyncAsync(async (wasFree, token) => + { + if (dbSet.Contains(entity)) + dbSet.Update(entity); + else + dbSet.Add(entity); + var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); + if (affected > 0) + await InternalRefreshAsync(true, token).ConfigureAwait(false); + return affected; + }, token); - public void Upsert(IEnumerable entities) + public int Upsert(IEnumerable entities) { if (!entities.Any()) - return; + return 0; - Sync((wasFree) => + return Sync((wasFree) => { foreach (var entity in entities) { if (dbSet.Contains(entity)) // TODO: это очень ммедленно dbSet.Update(entity); else - dbSet.Add(entity); + dbSet.Add(entity); } var affected = context.SaveChanges(); if (affected > 0) InternalRefresh(true); + return affected; }); } - public async Task UpsertAsync(IEnumerable entities, CancellationToken token = default) + public Task UpsertAsync(IEnumerable entities, CancellationToken token = default) { if (!entities.Any()) - return; + return Task.FromResult(0); - await SyncAsync(async (wasFree, token) => { + return SyncAsync(async (wasFree, token) => + { var upsertedEntries = new List(entities.Count()); foreach (var entity in entities) { @@ -327,76 +329,76 @@ namespace AsbCloudInfrastructure.Services.Cache var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); if (affected > 0) await InternalRefreshAsync(true, token).ConfigureAwait(false); + return affected; }, token); } - public void Remove(Func predicate) + public int Remove(Func predicate) => Sync(_ => { dbSet.RemoveRange(dbSet.Where(predicate)); var affected = context.SaveChanges(); if (affected > 0) InternalRefresh(true); + return affected; }); - - public Task RemoveAsync(Func predicate, CancellationToken token = default) - => SyncAsync(async (wasFree, token) => { + + public Task RemoveAsync(Func predicate, CancellationToken token = default) + => SyncAsync(async (wasFree, token) => + { dbSet.RemoveRange(dbSet.Where(predicate)); var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); if (affected > 0) await InternalRefreshAsync(true, token).ConfigureAwait(false); + return affected; }, token); public TEntity Insert(TEntity entity) { - TEntity result = default; - Sync(_ => + return Sync(_ => { var entry = dbSet.Add(entity); var affected = context.SaveChanges(); if (affected > 0) InternalRefresh(true); - result = entry.Entity; + return entry.Entity; }); - return result; } - public async Task InsertAsync(TEntity entity, CancellationToken token = default) + public Task InsertAsync(TEntity entity, CancellationToken token = default) { - TEntity result = default; - await SyncAsync(async (wasFree, token) => - { - var entry = dbSet.Add(entity); - var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); - if (affected > 0) - await InternalRefreshAsync(true, token).ConfigureAwait(false); - result = entry.Entity; - }, token); - return result; + return SyncAsync(async (wasFree, token) => + { + var entry = dbSet.Add(entity); + var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); + if (affected > 0) + await InternalRefreshAsync(true, token).ConfigureAwait(false); + return entry.Entity; + }, token); } public int Insert(IEnumerable newEntities) { - int result = 0; - Sync(_ => { - dbSet.AddRange(newEntities); - result = context.SaveChanges(); - if (result > 0) - InternalRefresh(true); - }); - return result; + return Sync(_ => + { + dbSet.AddRange(newEntities); + var affected = context.SaveChanges(); + if (affected > 0) + InternalRefresh(true); + return affected; + }); } - public async Task InsertAsync(IEnumerable newEntities, CancellationToken token = default) + public Task InsertAsync(IEnumerable newEntities, CancellationToken token = default) { - int result = 0; - await SyncAsync(async (wasFree, token) => { + return SyncAsync(async (wasFree, token) => + { dbSet.AddRange(newEntities); - result = await context.SaveChangesAsync(token).ConfigureAwait(false); - if (result > 0) + var affected = await context.SaveChangesAsync(token).ConfigureAwait(false); + if (affected > 0) await InternalRefreshAsync(true, token).ConfigureAwait(false); + return affected; }, token); - return result; } public IEnumerator GetEnumerator() => Where().GetEnumerator(); diff --git a/AsbCloudInfrastructure/Services/CrudServiceBase.cs b/AsbCloudInfrastructure/Services/CrudServiceBase.cs index e0a49083..1dc6d100 100644 --- a/AsbCloudInfrastructure/Services/CrudServiceBase.cs +++ b/AsbCloudInfrastructure/Services/CrudServiceBase.cs @@ -102,11 +102,15 @@ namespace AsbCloudInfrastructure.Services return context.SaveChangesAsync(token); } - public virtual Task UpdateAsync(int id, TDto item, CancellationToken token = default) + public virtual async Task UpdateAsync(int id, TDto item, CancellationToken token = default) { + var existingEntity = await dbSet.AsNoTracking().FirstOrDefaultAsync(e => e.Id == id).ConfigureAwait(false); + if (existingEntity is null) + return 0; var entity = Convert(item); + entity.Id = id; dbSet.Update(entity); - return context.SaveChangesAsync(token); + return await context.SaveChangesAsync(token); } public virtual Task DeleteAsync(int id, CancellationToken token = default) diff --git a/AsbCloudInfrastructure/Services/PermissionService.cs b/AsbCloudInfrastructure/Services/PermissionService.cs index 0bd178b2..33ded1b5 100644 --- a/AsbCloudInfrastructure/Services/PermissionService.cs +++ b/AsbCloudInfrastructure/Services/PermissionService.cs @@ -1,8 +1,9 @@ using AsbCloudApp.Data; using AsbCloudApp.Services; using AsbCloudDb.Model; +using AsbCloudInfrastructure.Services.Cache; using Mapster; -using Microsoft.EntityFrameworkCore; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -12,18 +13,19 @@ namespace AsbCloudInfrastructure.Services { public class PermissionService : IPermissionService, IConverter { - private readonly IAsbCloudDbContext db; - - public PermissionService(IAsbCloudDbContext db) + private readonly CacheTable cachePermission; + + public PermissionService(IAsbCloudDbContext db, CacheDb cacheDb) { - this.db = db; + cachePermission = cacheDb.GetCachedTable( + (AsbCloudDbContext)db, + new string[] { nameof(Permission.PermissionInfo) }); } public async Task> GetByIdRoleAsync(int idRole, CancellationToken token) { - var entities = await db.Permissions - .Where(p => p.IdUserRole == idRole) - .ToListAsync(token) + var entities = await cachePermission + .WhereAsync(p => p.IdUserRole == idRole, token) .ConfigureAwait(false); var dto = entities.Select(Convert); return dto; @@ -32,26 +34,36 @@ namespace AsbCloudInfrastructure.Services public Task InsertRangeAsync(IEnumerable dtos, CancellationToken token) { var entities = dtos.Select(Convert); - db.Permissions.AddRange(entities); - return db.SaveChangesAsync(token); + return cachePermission.InsertAsync(entities, token); } - public Task UpdateAsync(PermissionDto dto, CancellationToken token) + public async Task UpdateAsync(PermissionDto dto, CancellationToken token) { var entity = Convert(dto); - db.Permissions.Update(entity); - return db.SaveChangesAsync(token); + await cachePermission.UpsertAsync(entity, token) + .ConfigureAwait(false); + return 1; } public Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token) { - var entities = db.Permissions.AsNoTracking() - .Where(e => e.IdUserRole == idUserRole && e.IdPermission == idPermission) - .ToList(); - if (!entities.Any()) - return Task.FromResult(0); - db.Permissions.RemoveRange(entities); - return db.SaveChangesAsync(token); + bool predicate(Permission p) => p.IdUserRole == idUserRole && p.IdPermission == idPermission; + return DeleteAsync(predicate, token); + } + + public Task DeleteAllByRoleAsync(int idUserRole, CancellationToken token) + { + bool predicate(Permission p) => p.IdUserRole == idUserRole; + return DeleteAsync(predicate, token); + } + + private async Task DeleteAsync(Func predicate, CancellationToken token) + { + var count = (await cachePermission.WhereAsync(predicate, token).ConfigureAwait(false)).Count(); + if (count > 0) + await cachePermission.RemoveAsync(predicate, token) + .ConfigureAwait(false); + return count; } public Permission Convert(PermissionDto src) diff --git a/AsbCloudInfrastructure/Services/UserRoleService.cs b/AsbCloudInfrastructure/Services/UserRoleService.cs index f5a154f1..85adf9ff 100644 --- a/AsbCloudInfrastructure/Services/UserRoleService.cs +++ b/AsbCloudInfrastructure/Services/UserRoleService.cs @@ -11,51 +11,82 @@ using AsbCloudApp.Services; namespace AsbCloudInfrastructure.Services { - public class UserRoleService : CrudServiceBase + public class UserRoleService : IUserRoleService { private readonly CacheTable cacheUserRoles; private readonly IPermissionService permissionService; - public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb, IPermissionService permissionService) : base(context) + public List Incledes { get; } = new(); + + public UserRoleService(IAsbCloudDbContext context, CacheDb cacheDb, IPermissionService permissionService) { - cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)context); + cacheUserRoles = cacheDb.GetCachedTable((AsbCloudDbContext)context, new string[] { nameof(UserRole.Permissions) }); this.permissionService = permissionService; } - public override async Task> GetPageAsync(int skip = 0, - int take = 32, CancellationToken token = default) + public async Task> GetAllAsync(CancellationToken token = default) { - var rolesDtos = await base.GetPageAsync(skip, take, token); - return rolesDtos; + var entities = await cacheUserRoles.WhereAsync(token) + .ConfigureAwait(false); + var dtos = entities.Adapt(); + return dtos; } - public override async Task GetAsync(int id, CancellationToken token = default) + public async Task GetAsync(int id, CancellationToken token = default) { - var roleDto = await base.GetAsync(id,token); - - return roleDto; + var entity = await cacheUserRoles.FirstOrDefaultAsync(r=>r.Id == id, token) + .ConfigureAwait(false); + var dto = entity?.Adapt(); + return dto; } - public override async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) + public async Task InsertAsync(UserRoleDto dto, CancellationToken token = default) { - var id = await base.InsertAsync(dto, token).ConfigureAwait(false); - if (dto.Permissions is not null && dto.Permissions.Any()) + var entity = dto.Adapt(); + var updatedEntity = await cacheUserRoles.InsertAsync(entity, token).ConfigureAwait(false); + if (dto.Permissions?.Any() == true) { foreach (var permission in dto.Permissions) - permission.IdUserRole = id; + permission.IdUserRole = updatedEntity.Id; await permissionService.InsertRangeAsync(dto.Permissions, token).ConfigureAwait(false); + await cacheUserRoles.RefreshAsync(true, token) + .ConfigureAwait(false); } - return id; + return updatedEntity?.Id ?? 0; } - public override async Task UpdateAsync(int id, UserRoleDto item, CancellationToken token = default) + public async Task InsertRangeAsync(IEnumerable dtos, CancellationToken token = default) { - foreach (var p in item.Permissions) - p.IdUserRole = item.Id; - - var result = await base.UpdateAsync(id, item, token); + var entities = dtos.Adapt(); + return await cacheUserRoles.InsertAsync(entities, token).ConfigureAwait(false); + } - return result; + public async Task UpdateAsync(int id, UserRoleDto dto, CancellationToken token = default) + { + var entity = dto.Adapt(); + entity.Id = id; + await cacheUserRoles.UpsertAsync(entity, token) + .ConfigureAwait(false); + + if(dto.Permissions is not null) + { + await permissionService.DeleteAllByRoleAsync(id, token) + .ConfigureAwait(false); + + if (dto.Permissions.Any()) + { + foreach (var permission in dto.Permissions) + permission.IdUserRole = id; + + await permissionService.InsertRangeAsync(dto.Permissions, token) + .ConfigureAwait(false); + } + + await cacheUserRoles.RefreshAsync(true, token) + .ConfigureAwait(false); + } + + return id; } private IEnumerable GetNestedPermissions(UserRole role, int counter = 10) @@ -63,14 +94,14 @@ namespace AsbCloudInfrastructure.Services List permissions = role.Permissions.ToList(); if (role.IdParent is not null) { - if(counter == 0) + 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) + + if (parentRole is null) return permissions; var parentPermissions = GetNestedPermissions(parentRole, counter--); @@ -98,5 +129,11 @@ namespace AsbCloudInfrastructure.Services } } } + + public Task DeleteAsync(int id, CancellationToken token = default) + => cacheUserRoles.RemoveAsync(r => r.Id == id, token); + + public Task DeleteAsync(IEnumerable ids, CancellationToken token = default) + => cacheUserRoles.RemoveAsync(r => ids.Contains(r.Id), token); } } \ No newline at end of file diff --git a/AsbCloudWebApi/Controllers/AdminPermissionController.cs b/AsbCloudWebApi/Controllers/AdminPermissionController.cs index aa6a77b3..f525fc07 100644 --- a/AsbCloudWebApi/Controllers/AdminPermissionController.cs +++ b/AsbCloudWebApi/Controllers/AdminPermissionController.cs @@ -71,7 +71,7 @@ namespace AsbCloudWebApi.Controllers /// id роли для удаления разрешения /// Токен отмены задачи /// - [HttpDelete("{idPermission}/{idRole}")] + [HttpDelete("{idPermission}/{idUserRole}")] [ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)] public async Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token = default) diff --git a/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs b/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs index 99a0a673..1950e362 100644 --- a/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs +++ b/AsbCloudWebApi/Controllers/AdminPermissionInfoController.cs @@ -12,7 +12,6 @@ namespace AsbCloudWebApi.Controllers { 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 7a2a0067..5876ece4 100644 --- a/AsbCloudWebApi/Controllers/AdminUserRoleController.cs +++ b/AsbCloudWebApi/Controllers/AdminUserRoleController.cs @@ -8,10 +8,11 @@ namespace AsbCloudWebApi.Controllers [Route("api/admin/role")] [ApiController] [Authorize] - public class AdminUserRoleController : CrudController> + public class AdminUserRoleController : CrudController> { - public AdminUserRoleController(ICrudService service) - : base(service) - { } + public AdminUserRoleController(IUserRoleService service) + :base(service) + { + } } } diff --git a/AsbCloudWebApi/Controllers/CrudController.cs b/AsbCloudWebApi/Controllers/CrudController.cs index c990da79..c5d4d926 100644 --- a/AsbCloudWebApi/Controllers/CrudController.cs +++ b/AsbCloudWebApi/Controllers/CrudController.cs @@ -30,24 +30,6 @@ namespace AsbCloudWebApi.Controllers this.service = service; } - /// - /// Получить страницу с записями в PaginationContainer - /// - /// пропустить skip записей - /// получить take записей - /// CancellationToken - /// страница с записями в PaginationContainer - [HttpGet()] - public virtual async Task>> GetPage(int skip = 0, int take = 32, - CancellationToken token = default) - { - if (!Roles.Any(role => User.IsInRole(role))) - return Forbid(); - - var result = await service.GetPageAsync(skip, take, token).ConfigureAwait(false); - return Ok(result); - } - /// /// Получить все записи /// @@ -111,6 +93,8 @@ namespace AsbCloudWebApi.Controllers return Forbid(); var result = await service.UpdateAsync(id, value, token).ConfigureAwait(false); + if (result == 0) + return BadRequest($"id:{id} does not exist in the db"); return Ok(result); } @@ -131,4 +115,6 @@ namespace AsbCloudWebApi.Controllers return Ok(result); } } + + }