using AsbCloudApp.Data; using AsbCloudApp.Services; using AsbCloudDb.Model; using AsbCloudInfrastructure.Services.Cache; using Mapster; using System; using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services { public class PermissionService : IPermissionService { private readonly CacheTable cacheUserRolePermission; private readonly CacheTable cachePermission; public PermissionService(IAsbCloudDbContext db, CacheDb cacheDb) { cacheUserRolePermission = cacheDb.GetCachedTable( (AsbCloudDbContext)db, new string[] { nameof(RelationUserRolePermission.Permission) }); cachePermission = cacheDb.GetCachedTable( (AsbCloudDbContext)db); } public async Task> GetByIdRoleAsync(int idRole, CancellationToken token) { var entities = await cacheUserRolePermission .WhereAsync(p => p.IdUserRole == idRole, token) .ConfigureAwait(false); var dto = entities.Select(e => e.Permission).Adapt(); return dto; } public async Task InsertRangeAsync(IEnumerable dtos, CancellationToken token) { var entities = dtos.Select(Convert); return (await cachePermission.InsertAsync(entities, token))?.Count()??0; } public async Task UpdateAsync(PermissionDto dto, CancellationToken token) { var entity = Convert(dto); await cachePermission.UpsertAsync(entity, token) .ConfigureAwait(false); return 1; } public Task DeleteAsync(int idUserRole, int idPermission, CancellationToken token) { bool predicate(RelationUserRolePermission p) => p.IdUserRole == idUserRole && p.IdPermission == idPermission; return DeleteAsync(predicate, token); } public Task DeleteAllByRoleAsync(int idUserRole, CancellationToken token) { bool predicate(RelationUserRolePermission p) => p.IdUserRole == idUserRole; return DeleteAsync(predicate, token); } private async Task DeleteAsync(Func predicate, CancellationToken token) { var count = (await cacheUserRolePermission.WhereAsync(predicate, token).ConfigureAwait(false)).Count(); if (count > 0) await cacheUserRolePermission.RemoveAsync(predicate, token) .ConfigureAwait(false); return count; } public Permission Convert(PermissionDto src) { var entity = src.Adapt(); return entity; } } }