From b70fa35ef6795fbdf425143501e45d82919841ae Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 2 Feb 2023 15:21:48 +0500 Subject: [PATCH 01/14] bug fixing in UserRepositoty.UpdateAsync --- .../Repository/UserRepository.cs | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index efc0db16..9a666b68 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -101,13 +101,14 @@ namespace AsbCloudInfrastructure.Repository var userRoles = await userRoleRepository.GetByNamesAsync(dto.RoleNames, token).ConfigureAwait(false); await UpdateRolesCacheForUserAsync(dto.Id, userRoles, token); - - var entity = Convert(dto); - - var result = dbContext.Users.Upsert(entity); - await dbContext.SaveChangesAsync(token); + var userInDb = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); + if (userInDb is not null) + { + userInDb = Convert(dto); + await dbContext.SaveChangesAsync(token); + } DropCacheUsers(); - return result.Entity.Id; + return userInDb!.Id; } public async Task DeleteAsync(int id, CancellationToken token) @@ -213,7 +214,7 @@ namespace AsbCloudInfrastructure.Repository protected virtual User Convert(UserExtendedDto dto) { - var entity = dto.Adapt(userTypeAdapterConfig); + var entity = dto.Adapt(userTypeAdapterConfig); if (string.IsNullOrEmpty(entity.PasswordHash)) entity.PasswordHash = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id)?.PasswordHash; return entity; From ff12c1749656e3ccae8e74f0a32e308abd76eae1 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Sun, 5 Feb 2023 21:53:51 +0500 Subject: [PATCH 02/14] =?UTF-8?q?=D0=BA=D1=8D=D1=88=20=D1=81=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D0=B5=D0=BD=20=D0=BD=D0=B0=20memoryCache=20(=D1=81=D1=82?= =?UTF-8?q?=D0=B0=D1=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AsbCloudInfrastructure.csproj | 1 + .../Repository/UserRepository.cs | 127 ++++++++++++++---- 2 files changed, 104 insertions(+), 24 deletions(-) diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 1a8e2432..84cf9062 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -43,6 +43,7 @@ + diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 9a666b68..0b5a3a58 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -1,9 +1,7 @@ using AsbCloudApp.Data; using AsbCloudApp.Exceptions; using AsbCloudApp.Repositories; -using AsbCloudDb; using AsbCloudDb.Model; -using AsbCloudInfrastructure.EfCache; using Mapster; using Microsoft.EntityFrameworkCore; using System; @@ -11,6 +9,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.Caching.Memory; namespace AsbCloudInfrastructure.Repository { @@ -29,10 +28,12 @@ namespace AsbCloudInfrastructure.Repository dst => dst.Files, dst => dst.RelationUsersUserRoles) .Config; - - public UserRepository(IAsbCloudDbContext dbContext, IUserRoleRepository userRoleRepository) { + private readonly IMemoryCache memoryCache; + public UserRepository(IAsbCloudDbContext dbContext, IUserRoleRepository userRoleRepository, IMemoryCache memoryCache) + { this.dbContext = dbContext; this.userRoleRepository = userRoleRepository; + this.memoryCache = memoryCache; } public async Task InsertAsync(UserExtendedDto dto, CancellationToken token) @@ -58,12 +59,13 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetAllAsync(CancellationToken token) { - var dtos = (await GetCacheUserAsync(token)).ToList(); + var dtos = (await GetCacheUserAsync(token)).ToList(); + var listDtos = dtos.ToList(); if (dtos is null) return Enumerable.Empty(); - for (var i = 0; i < dtos.Count; i++) - dtos[i].RoleNames = GetRolesNamesByIdUser(dtos[i].Id); + for (var i = 0; i < listDtos.Count; i++) + listDtos[i].RoleNames = GetRolesNamesByIdUser(listDtos[i].Id); return dtos; } @@ -170,31 +172,43 @@ namespace AsbCloudInfrastructure.Repository throw new ArgumentInvalidException($"Login {login} is busy by {existingUserDto.MakeDisplayName()}, id{existingUserDto.Id}", nameof(login)); } - private Task> GetCacheUserAsync(CancellationToken token) - => dbContext.Users + private async Task> GetCacheUserAsync(CancellationToken token) + { + var query = dbContext.Users .Include(r => r.Company) - .Include(r => r.RelationUsersUserRoles) - .FromCacheAsync(userCacheTag, cacheObsolence, Convert, token); + .Include(r => r.RelationUsersUserRoles); + return await FromCacheAsync(query, userCacheTag, cacheObsolence, Convert, token); + } private IEnumerable GetCacheUser() - => dbContext.Users + { + var query = dbContext.Users .Include(r => r.Company) - .Include(r => r.RelationUsersUserRoles) - .FromCache(userCacheTag, cacheObsolence, Convert); + .Include(r => r.RelationUsersUserRoles); + return FromCache(query, userCacheTag, cacheObsolence, Convert); + } private void DropCacheUsers() - => dbContext.Users.DropCache(userCacheTag); + { + memoryCache.Remove(userCacheTag); + } - private Task> GetCacheRelationUserUserRoleAsync(CancellationToken token) - => dbContext.RelationUserUserRoles + private async Task> GetCacheRelationUserUserRoleAsync(CancellationToken token) + { + var query = dbContext.RelationUserUserRoles .Include(r => r.UserRole) - .Include(r => r.User) - .FromCacheAsync(relationUserUserRoleCacheTag, cacheObsolence, token); + .Include(r => r.User); + return await FromCacheAsync(query, relationUserUserRoleCacheTag, cacheObsolence, token); + } private IEnumerable GetCachRelationUserUserRoleCacheTag() - => dbContext.RelationUserUserRoles - .Include(r => r.UserRole) - .Include(r => r.User) - .FromCache(relationUserUserRoleCacheTag, cacheObsolence); + { + var query = dbContext.RelationUserUserRoles + .Include(r => r.UserRole) + .Include(r => r.User); + return FromCache(query, relationUserUserRoleCacheTag, cacheObsolence); + } private void DropCacheRelationUserUserRoleCacheTag() - => dbContext.RelationUserUserRoles.DropCache(relationUserUserRoleCacheTag); + { + memoryCache.Remove(relationUserUserRoleCacheTag); + } private async Task UpdateRolesCacheForUserAsync(int idUser, IEnumerable newRoles, CancellationToken token) { @@ -212,6 +226,71 @@ namespace AsbCloudInfrastructure.Repository DropCacheRelationUserUserRoleCacheTag(); } + public async Task> FromCacheAsync(IQueryable query, string tag, TimeSpan obsolescence, Func convert, CancellationToken token) + where TEntity : class + { + async Task factory(CancellationToken token) + => await query.AsNoTracking().ToArrayAsync(token); + var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); + return cache.Select(convert); + } + public async Task> FromCacheAsync(IQueryable query, string tag, TimeSpan obsolescence, CancellationToken token) + where TEntity : class + { + async Task factory(CancellationToken token) + => await query.AsNoTracking().ToArrayAsync(token); + var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); + return cache; + } + public IEnumerable FromCache(IQueryable query, string tag, TimeSpan obsolescence, Func convert) + where TEntity : class + { + TEntity[] factory() + => query.AsNoTracking().ToArray(); + var cache = GetOrAddCache(tag, factory, obsolescence); + return cache.Select(convert); + } + public IEnumerable FromCache(IQueryable query, string tag, TimeSpan obsolescence) + where TEntity : class + { + TEntity[] factory() + => query.AsNoTracking().ToArray(); + var cache = GetOrAddCache(tag, factory, obsolescence); + return cache; + } + private async Task GetOrAddCacheAsync(string tag, Func> valueFactoryAsync, TimeSpan obsolete, CancellationToken token) + + { + memoryCache.TryGetValue(tag, out TEntity[]? cached); + if (cached == null) + { + var values = await valueFactoryAsync(token); + + if (values != null) + { + memoryCache.Set(tag, values, new MemoryCacheEntryOptions().SetAbsoluteExpiration(obsolete)); + } + return values!; + } + return cached; + } + private TEntity[] GetOrAddCache(string tag, Func valueFactory, TimeSpan obsolete) + + { + memoryCache.TryGetValue(tag, out TEntity[]? cached); + if (cached == null) + { + var values = valueFactory(); + + if (values != null) + { + memoryCache.Set(tag, values, new MemoryCacheEntryOptions().SetAbsoluteExpiration(obsolete)); + } + return values!; + } + return cached; + } + protected virtual User Convert(UserExtendedDto dto) { var entity = dto.Adapt(userTypeAdapterConfig); From 973f1afb1b81481dc965445cc2f21c18945ae0cb Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 6 Feb 2023 21:33:53 +0500 Subject: [PATCH 03/14] refact ef update --- AsbCloudDb/Model/IAsbCloudDbContext.cs | 3 +++ .../Repository/UserRepository.cs | 22 +++++++++++++------ 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index 4eac95f9..debd4de6 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -1,8 +1,10 @@ using AsbCloudDb.Model.Subsystems; using AsbCloudDb.Model.WITS; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Infrastructure; using System; +using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Threading.Tasks; @@ -70,6 +72,7 @@ namespace AsbCloudDb.Model Task SaveChangesAsync(CancellationToken cancellationToken); DbSet Set(string name) where TEntity : class; DbSet Set() where TEntity : class; + EntityEntry Entry([NotNull] TEntity entity) where TEntity : class; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 0b5a3a58..9363409e 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -103,16 +103,24 @@ namespace AsbCloudInfrastructure.Repository var userRoles = await userRoleRepository.GetByNamesAsync(dto.RoleNames, token).ConfigureAwait(false); await UpdateRolesCacheForUserAsync(dto.Id, userRoles, token); - var userInDb = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); - if (userInDb is not null) - { - userInDb = Convert(dto); - await dbContext.SaveChangesAsync(token); - } + + var entity = Convert(dto); + + var local = dbContext.Set() + .Local + .FirstOrDefault(entry => entry.Id.Equals(entity.Id)); + if (local != null) + { + dbContext.Entry(local).State = EntityState.Detached; + } + dbContext.Entry(entity).State = EntityState.Modified; + await dbContext.SaveChangesAsync(token); DropCacheUsers(); - return userInDb!.Id; + return entity.Id; } + + public async Task DeleteAsync(int id, CancellationToken token) { var dto = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); From 54178e89232c61001134abf9454d41297f09588f Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 6 Feb 2023 21:56:27 +0500 Subject: [PATCH 04/14] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BE=D0=BF=D0=B5=D1=87=D0=B0=D1=82=D0=BE=D0=BA=20=D0=B8=20"?= =?UTF-8?q?=D0=BC=D1=83=D1=81=D0=BE=D1=80=D0=B0"=20=D0=BF=D0=BE=D1=81?= =?UTF-8?q?=D0=BB=D0=B5=20=D0=B4=D0=B5=D0=B1=D0=B0=D0=B3=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Repository/UserRepository.cs | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 9363409e..9148e87b 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -59,13 +59,11 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetAllAsync(CancellationToken token) { - var dtos = (await GetCacheUserAsync(token)).ToList(); - var listDtos = dtos.ToList(); + var dtos = (await GetCacheUserAsync(token)).ToList(); if (dtos is null) return Enumerable.Empty(); - - for (var i = 0; i < listDtos.Count; i++) - listDtos[i].RoleNames = GetRolesNamesByIdUser(listDtos[i].Id); + for (var i = 0; i < dtos.Count; i++) + dtos[i].RoleNames = GetRolesNamesByIdUser(dtos[i].Id); return dtos; } @@ -301,7 +299,7 @@ namespace AsbCloudInfrastructure.Repository protected virtual User Convert(UserExtendedDto dto) { - var entity = dto.Adapt(userTypeAdapterConfig); + var entity = dto.Adapt(userTypeAdapterConfig); if (string.IsNullOrEmpty(entity.PasswordHash)) entity.PasswordHash = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id)?.PasswordHash; return entity; From d35550380c12ee3cd66dd6089df83a10ae635807 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 8 Feb 2023 15:12:46 +0500 Subject: [PATCH 05/14] refact update role method --- AsbCloudDb/Model/AsbCloudDbContext.cs | 3 +++ AsbCloudDb/Model/IAsbCloudDbContext.cs | 1 + .../Repository/UserRepository.cs | 18 ++++++++++-------- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index afce3792..12805e60 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -1,5 +1,6 @@ using AsbCloudDb.Model.Subsystems; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.ChangeTracking; using System.Threading; using System.Threading.Tasks; @@ -362,5 +363,7 @@ namespace AsbCloudDb.Model var sql = $"REFRESH MATERIALIZED VIEW {materializedViewName};"; return Database.ExecuteSqlRawAsync(sql, token); } + + public ChangeTracker GetChangeTracker() => ChangeTracker; } } diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index debd4de6..c2080c72 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -73,6 +73,7 @@ namespace AsbCloudDb.Model DbSet Set(string name) where TEntity : class; DbSet Set() where TEntity : class; EntityEntry Entry([NotNull] TEntity entity) where TEntity : class; + ChangeTracker GetChangeTracker(); } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 9148e87b..1668fc6a 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -107,7 +107,7 @@ namespace AsbCloudInfrastructure.Repository var local = dbContext.Set() .Local .FirstOrDefault(entry => entry.Id.Equals(entity.Id)); - if (local != null) + if (local is not null) { dbContext.Entry(local).State = EntityState.Detached; } @@ -117,8 +117,6 @@ namespace AsbCloudInfrastructure.Repository return entity.Id; } - - public async Task DeleteAsync(int id, CancellationToken token) { var dto = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); @@ -221,7 +219,7 @@ namespace AsbCloudInfrastructure.Repository var relations = (await GetCacheRelationUserUserRoleAsync(token)).Where(r => r.IdUser == idUser); dbContext.RelationUserUserRoles.RemoveRange(relations); - if (newRoles?.Any() == true) + if (newRoles?.Any() is true) await dbContext.RelationUserUserRoles.AddRangeAsync(newRoles.Select(role => new RelationUserUserRole { IdUser = idUser, @@ -236,7 +234,8 @@ namespace AsbCloudInfrastructure.Repository where TEntity : class { async Task factory(CancellationToken token) - => await query.AsNoTracking().ToArrayAsync(token); + => await query.ToArrayAsync(token); + dbContext.GetChangeTracker().Clear(); var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); return cache.Select(convert); } @@ -244,7 +243,8 @@ namespace AsbCloudInfrastructure.Repository where TEntity : class { async Task factory(CancellationToken token) - => await query.AsNoTracking().ToArrayAsync(token); + => await query.ToArrayAsync(token); + dbContext.GetChangeTracker().Clear(); var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); return cache; } @@ -252,7 +252,8 @@ namespace AsbCloudInfrastructure.Repository where TEntity : class { TEntity[] factory() - => query.AsNoTracking().ToArray(); + => query.ToArray(); + dbContext.GetChangeTracker().Clear(); var cache = GetOrAddCache(tag, factory, obsolescence); return cache.Select(convert); } @@ -260,7 +261,8 @@ namespace AsbCloudInfrastructure.Repository where TEntity : class { TEntity[] factory() - => query.AsNoTracking().ToArray(); + => query.ToArray(); + dbContext.GetChangeTracker().Clear(); var cache = GetOrAddCache(tag, factory, obsolescence); return cache; } From f7a58cfa12c8217a9d5b4ecfabf1a3586e6ee3cd Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Thu, 9 Feb 2023 11:38:04 +0500 Subject: [PATCH 06/14] refact --- AsbCloudDb/Model/AsbCloudDbContext.cs | 5 +---- AsbCloudDb/Model/IAsbCloudDbContext.cs | 2 -- .../Repository/UserRepository.cs | 14 +------------- 3 files changed, 2 insertions(+), 19 deletions(-) diff --git a/AsbCloudDb/Model/AsbCloudDbContext.cs b/AsbCloudDb/Model/AsbCloudDbContext.cs index 12805e60..a43f55c1 100644 --- a/AsbCloudDb/Model/AsbCloudDbContext.cs +++ b/AsbCloudDb/Model/AsbCloudDbContext.cs @@ -1,6 +1,5 @@ using AsbCloudDb.Model.Subsystems; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; using System.Threading; using System.Threading.Tasks; @@ -362,8 +361,6 @@ namespace AsbCloudDb.Model { var sql = $"REFRESH MATERIALIZED VIEW {materializedViewName};"; return Database.ExecuteSqlRawAsync(sql, token); - } - - public ChangeTracker GetChangeTracker() => ChangeTracker; + } } } diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index c2080c72..8e117f71 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -73,7 +73,5 @@ namespace AsbCloudDb.Model DbSet Set(string name) where TEntity : class; DbSet Set() where TEntity : class; EntityEntry Entry([NotNull] TEntity entity) where TEntity : class; - ChangeTracker GetChangeTracker(); - } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 1668fc6a..fe8979b7 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -194,14 +194,6 @@ namespace AsbCloudInfrastructure.Repository { memoryCache.Remove(userCacheTag); } - - private async Task> GetCacheRelationUserUserRoleAsync(CancellationToken token) - { - var query = dbContext.RelationUserUserRoles - .Include(r => r.UserRole) - .Include(r => r.User); - return await FromCacheAsync(query, relationUserUserRoleCacheTag, cacheObsolence, token); - } private IEnumerable GetCachRelationUserUserRoleCacheTag() { var query = dbContext.RelationUserUserRoles @@ -216,7 +208,7 @@ namespace AsbCloudInfrastructure.Repository private async Task UpdateRolesCacheForUserAsync(int idUser, IEnumerable newRoles, CancellationToken token) { - var relations = (await GetCacheRelationUserUserRoleAsync(token)).Where(r => r.IdUser == idUser); + var relations = dbContext.RelationUserUserRoles.Where(r => r.IdUser == idUser); dbContext.RelationUserUserRoles.RemoveRange(relations); if (newRoles?.Any() is true) @@ -235,7 +227,6 @@ namespace AsbCloudInfrastructure.Repository { async Task factory(CancellationToken token) => await query.ToArrayAsync(token); - dbContext.GetChangeTracker().Clear(); var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); return cache.Select(convert); } @@ -244,7 +235,6 @@ namespace AsbCloudInfrastructure.Repository { async Task factory(CancellationToken token) => await query.ToArrayAsync(token); - dbContext.GetChangeTracker().Clear(); var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); return cache; } @@ -253,7 +243,6 @@ namespace AsbCloudInfrastructure.Repository { TEntity[] factory() => query.ToArray(); - dbContext.GetChangeTracker().Clear(); var cache = GetOrAddCache(tag, factory, obsolescence); return cache.Select(convert); } @@ -262,7 +251,6 @@ namespace AsbCloudInfrastructure.Repository { TEntity[] factory() => query.ToArray(); - dbContext.GetChangeTracker().Clear(); var cache = GetOrAddCache(tag, factory, obsolescence); return cache; } From 95790af1f673571ea2640cc2f49f65235dc9c891 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 13 Feb 2023 15:39:17 +0500 Subject: [PATCH 07/14] new change to cache methods --- .../Repository/UserRepository.cs | 192 ++++++++---------- 1 file changed, 81 insertions(+), 111 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index fe8979b7..d5023f90 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -59,30 +59,36 @@ namespace AsbCloudInfrastructure.Repository public async Task> GetAllAsync(CancellationToken token) { - var dtos = (await GetCacheUserAsync(token)).ToList(); - if (dtos is null) + var users = await GetCacheUserAsync(token); + if (users is null) return Enumerable.Empty(); - for (var i = 0; i < dtos.Count; i++) - dtos[i].RoleNames = GetRolesNamesByIdUser(dtos[i].Id); + var dtos = users + .Select(d => Convert(d)); + foreach(var dto in dtos) + { + dto.RoleNames = GetRolesNamesByIdUser(dto.Id); + }; + return dtos; } + public UserExtendedDto? GetOrDefault(int id) { - var dto = GetCacheUser().FirstOrDefault(u => u.Id == id); - if (dto is null) + var user = GetCacheUser().FirstOrDefault(u => u.Id == id); + if (user is null) return null; - var entity = Convert(dto); + var dto = Convert(user); dto.RoleNames = GetRolesNamesByIdUser(dto.Id); return dto; } public async Task GetOrDefaultAsync(int id, CancellationToken token) - { - var dto = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); - if (dto is null) + { + var user = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); + if (user is null) return null; - + var dto = Convert(user); dto.RoleNames = GetRolesNamesByIdUser(dto.Id); return dto; } @@ -102,29 +108,33 @@ namespace AsbCloudInfrastructure.Repository var userRoles = await userRoleRepository.GetByNamesAsync(dto.RoleNames, token).ConfigureAwait(false); await UpdateRolesCacheForUserAsync(dto.Id, userRoles, token); - var entity = Convert(dto); - - var local = dbContext.Set() - .Local - .FirstOrDefault(entry => entry.Id.Equals(entity.Id)); - if (local is not null) - { - dbContext.Entry(local).State = EntityState.Detached; - } - dbContext.Entry(entity).State = EntityState.Modified; - await dbContext.SaveChangesAsync(token); + var entity = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); + if (entity is not null) + { + var user = Convert(dto); + entity.Id = user.Id; + entity.Company = user.Company; + entity.Name = user.Name; + entity.Email = user.Email; + entity.Phone = user.Phone; + entity.Surname = user.Surname; + entity.Patronymic = user.Patronymic; + entity.Position = user.Position; + entity.IdCompany = user.IdCompany; + entity.IdState = user.IdState; + entity.RelationUsersUserRoles = user.RelationUsersUserRoles; + await dbContext.SaveChangesAsync(token); + } DropCacheUsers(); - return entity.Id; + return entity!.Id; } public async Task DeleteAsync(int id, CancellationToken token) { - var dto = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); - if (dto is null) - return 0; - - var entity = Convert(dto); - var result = dbContext.Users.Remove(entity); + var user = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); + if (user is null) + return 0; + var result = dbContext.Users.Remove(user); await dbContext.SaveChangesAsync(token); DropCacheUsers(); return result.Entity.Id; @@ -174,33 +184,23 @@ namespace AsbCloudInfrastructure.Repository if (existingUserDto is not null) throw new ArgumentInvalidException($"Login {login} is busy by {existingUserDto.MakeDisplayName()}, id{existingUserDto.Id}", nameof(login)); - } - - private async Task> GetCacheUserAsync(CancellationToken token) - { - var query = dbContext.Users - .Include(r => r.Company) - .Include(r => r.RelationUsersUserRoles); - return await FromCacheAsync(query, userCacheTag, cacheObsolence, Convert, token); - } - private IEnumerable GetCacheUser() - { - var query = dbContext.Users - .Include(r => r.Company) - .Include(r => r.RelationUsersUserRoles); - return FromCache(query, userCacheTag, cacheObsolence, Convert); - } - private void DropCacheUsers() - { - memoryCache.Remove(userCacheTag); - } + } + + private IEnumerable GetCachRelationUserUserRoleCacheTag() { - var query = dbContext.RelationUserUserRoles + var cache = memoryCache.GetOrCreate(userCacheTag, cacheEntry => + { + cacheEntry.AbsoluteExpirationRelativeToNow = cacheObsolence; + cacheEntry.SlidingExpiration = cacheObsolence; + var query = dbContext.RelationUserUserRoles .Include(r => r.UserRole) .Include(r => r.User); - return FromCache(query, relationUserUserRoleCacheTag, cacheObsolence); - } + var entities = query.ToArray(); + return entities; + }); + return cache; + } private void DropCacheRelationUserUserRoleCacheTag() { memoryCache.Remove(relationUserUserRoleCacheTag); @@ -222,72 +222,40 @@ namespace AsbCloudInfrastructure.Repository DropCacheRelationUserUserRoleCacheTag(); } - public async Task> FromCacheAsync(IQueryable query, string tag, TimeSpan obsolescence, Func convert, CancellationToken token) - where TEntity : class + private void DropCacheUsers() + => memoryCache.Remove(userCacheTag); + + private IEnumerable GetCacheUser() { - async Task factory(CancellationToken token) - => await query.ToArrayAsync(token); - var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); - return cache.Select(convert); - } - public async Task> FromCacheAsync(IQueryable query, string tag, TimeSpan obsolescence, CancellationToken token) - where TEntity : class - { - async Task factory(CancellationToken token) - => await query.ToArrayAsync(token); - var cache = await GetOrAddCacheAsync(tag, factory, obsolescence, token); + var cache = memoryCache.GetOrCreate(userCacheTag, cacheEntry => + { + cacheEntry.AbsoluteExpirationRelativeToNow = cacheObsolence; + cacheEntry.SlidingExpiration = cacheObsolence; + var query = dbContext.Users + .Include(r => r.Company) + .Include(r => r.RelationUsersUserRoles); + var entities = query.ToArray(); + return entities; + }); return cache; } - public IEnumerable FromCache(IQueryable query, string tag, TimeSpan obsolescence, Func convert) - where TEntity : class + + private Task> GetCacheUserAsync(CancellationToken token) { - TEntity[] factory() - => query.ToArray(); - var cache = GetOrAddCache(tag, factory, obsolescence); - return cache.Select(convert); - } - public IEnumerable FromCache(IQueryable query, string tag, TimeSpan obsolescence) - where TEntity : class - { - TEntity[] factory() - => query.ToArray(); - var cache = GetOrAddCache(tag, factory, obsolescence); + var cache = memoryCache.GetOrCreateAsync(userCacheTag, async (cacheEntry) => + { + cacheEntry.AbsoluteExpirationRelativeToNow = cacheObsolence; + cacheEntry.SlidingExpiration = cacheObsolence; + var query = dbContext.Users + .Include(r => r.Company) + .Include(r => r.RelationUsersUserRoles); + var entities = await query.ToArrayAsync(token); + return entities.AsEnumerable(); + }); return cache; } - private async Task GetOrAddCacheAsync(string tag, Func> valueFactoryAsync, TimeSpan obsolete, CancellationToken token) - - { - memoryCache.TryGetValue(tag, out TEntity[]? cached); - if (cached == null) - { - var values = await valueFactoryAsync(token); - - if (values != null) - { - memoryCache.Set(tag, values, new MemoryCacheEntryOptions().SetAbsoluteExpiration(obsolete)); - } - return values!; - } - return cached; - } - private TEntity[] GetOrAddCache(string tag, Func valueFactory, TimeSpan obsolete) - { - memoryCache.TryGetValue(tag, out TEntity[]? cached); - if (cached == null) - { - var values = valueFactory(); - - if (values != null) - { - memoryCache.Set(tag, values, new MemoryCacheEntryOptions().SetAbsoluteExpiration(obsolete)); - } - return values!; - } - return cached; - } - - protected virtual User Convert(UserExtendedDto dto) + protected User Convert(UserExtendedDto dto) { var entity = dto.Adapt(userTypeAdapterConfig); if (string.IsNullOrEmpty(entity.PasswordHash)) @@ -295,6 +263,8 @@ namespace AsbCloudInfrastructure.Repository return entity; } + + protected virtual UserExtendedDto Convert(User entity) { var dto = entity.Adapt(); From 6bf992f1f69e8d4d348ea69511e0fe9e7cac2d81 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Mon, 13 Feb 2023 23:11:39 +0500 Subject: [PATCH 08/14] =?UTF-8?q?=D0=B4=D0=BE=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=BE=D0=B2?= =?UTF-8?q?=20=D1=80=D0=B5=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8?= =?UTF-8?q?=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudDb/Model/IAsbCloudDbContext.cs | 3 +-- .../Repository/UserRepository.cs | 27 +++++++++---------- 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index 8e117f71..60fa41d0 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -71,7 +71,6 @@ namespace AsbCloudDb.Model int SaveChanges(bool acceptAllChangesOnSuccess); Task SaveChangesAsync(CancellationToken cancellationToken); DbSet Set(string name) where TEntity : class; - DbSet Set() where TEntity : class; - EntityEntry Entry([NotNull] TEntity entity) where TEntity : class; + DbSet Set() where TEntity : class; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index d5023f90..7873a4e9 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -121,8 +121,7 @@ namespace AsbCloudInfrastructure.Repository entity.Patronymic = user.Patronymic; entity.Position = user.Position; entity.IdCompany = user.IdCompany; - entity.IdState = user.IdState; - entity.RelationUsersUserRoles = user.RelationUsersUserRoles; + entity.IdState = user.IdState; await dbContext.SaveChangesAsync(token); } DropCacheUsers(); @@ -199,25 +198,19 @@ namespace AsbCloudInfrastructure.Repository var entities = query.ToArray(); return entities; }); - return cache; + return cache!; } private void DropCacheRelationUserUserRoleCacheTag() { memoryCache.Remove(relationUserUserRoleCacheTag); } - private async Task UpdateRolesCacheForUserAsync(int idUser, IEnumerable newRoles, CancellationToken token) + private async Task UpdateRolesCacheForUserAsync(int idUser, IEnumerable roleDtos, CancellationToken token) { var relations = dbContext.RelationUserUserRoles.Where(r => r.IdUser == idUser); dbContext.RelationUserUserRoles.RemoveRange(relations); - - if (newRoles?.Any() is true) - await dbContext.RelationUserUserRoles.AddRangeAsync(newRoles.Select(role => new RelationUserUserRole - { - IdUser = idUser, - IdUserRole = role.Id - }), token).ConfigureAwait(false); - + var entityRoles = roleDtos.Select(role => Convert(role)); + dbContext.RelationUserUserRoles.AddRange(entityRoles); await dbContext.SaveChangesAsync(token); DropCacheRelationUserUserRoleCacheTag(); } @@ -237,7 +230,7 @@ namespace AsbCloudInfrastructure.Repository var entities = query.ToArray(); return entities; }); - return cache; + return cache!; } private Task> GetCacheUserAsync(CancellationToken token) @@ -252,7 +245,7 @@ namespace AsbCloudInfrastructure.Repository var entities = await query.ToArrayAsync(token); return entities.AsEnumerable(); }); - return cache; + return cache!; } protected User Convert(UserExtendedDto dto) @@ -263,7 +256,11 @@ namespace AsbCloudInfrastructure.Repository return entity; } - + protected RelationUserUserRole Convert(UserRoleDto dto) + { + var entity = dto.Adapt(); + return entity; + } protected virtual UserExtendedDto Convert(User entity) { From 2cc8abd7677e544510f0a1f9e240fbe9b8e14ea7 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Tue, 14 Feb 2023 12:20:29 +0500 Subject: [PATCH 09/14] =?UTF-8?q?=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudDb/Model/IAsbCloudDbContext.cs | 5 +-- .../Repository/UserRepository.cs | 38 ++++++++----------- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/AsbCloudDb/Model/IAsbCloudDbContext.cs b/AsbCloudDb/Model/IAsbCloudDbContext.cs index 60fa41d0..446a7656 100644 --- a/AsbCloudDb/Model/IAsbCloudDbContext.cs +++ b/AsbCloudDb/Model/IAsbCloudDbContext.cs @@ -1,10 +1,8 @@ using AsbCloudDb.Model.Subsystems; using AsbCloudDb.Model.WITS; using Microsoft.EntityFrameworkCore; -using Microsoft.EntityFrameworkCore.ChangeTracking; using Microsoft.EntityFrameworkCore.Infrastructure; using System; -using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Threading.Tasks; @@ -69,8 +67,7 @@ namespace AsbCloudDb.Model Task RefreshMaterializedViewAsync(CancellationToken token) where TEntity : class; int SaveChanges(); int SaveChanges(bool acceptAllChangesOnSuccess); - Task SaveChangesAsync(CancellationToken cancellationToken); - DbSet Set(string name) where TEntity : class; + Task SaveChangesAsync(CancellationToken cancellationToken); DbSet Set() where TEntity : class; } } \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 7873a4e9..e1ca6c19 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -67,8 +67,7 @@ namespace AsbCloudInfrastructure.Repository foreach(var dto in dtos) { dto.RoleNames = GetRolesNamesByIdUser(dto.Id); - }; - + }; return dtos; } @@ -110,18 +109,16 @@ namespace AsbCloudInfrastructure.Repository var entity = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); if (entity is not null) - { - var user = Convert(dto); - entity.Id = user.Id; - entity.Company = user.Company; - entity.Name = user.Name; - entity.Email = user.Email; - entity.Phone = user.Phone; - entity.Surname = user.Surname; - entity.Patronymic = user.Patronymic; - entity.Position = user.Position; - entity.IdCompany = user.IdCompany; - entity.IdState = user.IdState; + { + entity.Id = dto.Id; + entity.Name = dto.Name; + entity.Email = dto.Email; + entity.Phone = dto.Phone; + entity.Surname = dto.Surname; + entity.Patronymic = dto.Patronymic; + entity.Position = dto.Position; + entity.IdCompany = dto.IdCompany; + entity.IdState = dto.IdState; await dbContext.SaveChangesAsync(token); } DropCacheUsers(); @@ -209,7 +206,11 @@ namespace AsbCloudInfrastructure.Repository { var relations = dbContext.RelationUserUserRoles.Where(r => r.IdUser == idUser); dbContext.RelationUserUserRoles.RemoveRange(relations); - var entityRoles = roleDtos.Select(role => Convert(role)); + var entityRoles = roleDtos.Select(role => new RelationUserUserRole + { + IdUser = idUser, + IdUserRole = role.Id + }); dbContext.RelationUserUserRoles.AddRange(entityRoles); await dbContext.SaveChangesAsync(token); DropCacheRelationUserUserRoleCacheTag(); @@ -255,13 +256,6 @@ namespace AsbCloudInfrastructure.Repository entity.PasswordHash = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id)?.PasswordHash; return entity; } - - protected RelationUserUserRole Convert(UserRoleDto dto) - { - var entity = dto.Adapt(); - return entity; - } - protected virtual UserExtendedDto Convert(User entity) { var dto = entity.Adapt(); From 2b02bdb0b895e7dde52c83e668cb2f8a07a5a992 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Tue, 14 Feb 2023 12:30:05 +0500 Subject: [PATCH 10/14] =?UTF-8?q?=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B0=20?= =?UTF-8?q?=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=20=D1=80=D0=B5=D0=B4=D0=B0?= =?UTF-8?q?=D0=BA=D1=82=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=81=D0=BE=D0=B3=D0=BB=D0=B0=D1=81=D0=BD=D0=BE?= =?UTF-8?q?=20=D0=BA=D0=BE=D0=B4-=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/UserRepository.cs | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index e1ca6c19..fa69ac0d 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -108,21 +108,20 @@ namespace AsbCloudInfrastructure.Repository await UpdateRolesCacheForUserAsync(dto.Id, userRoles, token); var entity = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); - if (entity is not null) - { - entity.Id = dto.Id; - entity.Name = dto.Name; - entity.Email = dto.Email; - entity.Phone = dto.Phone; - entity.Surname = dto.Surname; - entity.Patronymic = dto.Patronymic; - entity.Position = dto.Position; - entity.IdCompany = dto.IdCompany; - entity.IdState = dto.IdState; - await dbContext.SaveChangesAsync(token); - } + if (entity is null) + return -1; + entity.Id = dto.Id; + entity.Name = dto.Name; + entity.Email = dto.Email; + entity.Phone = dto.Phone; + entity.Surname = dto.Surname; + entity.Patronymic = dto.Patronymic; + entity.Position = dto.Position; + entity.IdCompany = dto.IdCompany; + entity.IdState = dto.IdState; + await dbContext.SaveChangesAsync(token); DropCacheUsers(); - return entity!.Id; + return entity.Id; } public async Task DeleteAsync(int id, CancellationToken token) From 96dae2f247c882811c7117a53593d122f8b28544 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Tue, 14 Feb 2023 18:36:25 +0500 Subject: [PATCH 11/14] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA=20=D0=B2=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Repository/UserRepository.cs | 42 ++++++++++++------- 1 file changed, 28 insertions(+), 14 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index fa69ac0d..5648b21b 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -62,11 +62,12 @@ namespace AsbCloudInfrastructure.Repository var users = await GetCacheUserAsync(token); if (users is null) return Enumerable.Empty(); - var dtos = users - .Select(d => Convert(d)); - foreach(var dto in dtos) + var dtos = new List(); + foreach(var user in users) { - dto.RoleNames = GetRolesNamesByIdUser(dto.Id); + var dto = Convert(user); + dto.RoleNames = GetRolesNamesByIdUser(user.Id); + dtos.Add(dto); }; return dtos; } @@ -111,6 +112,7 @@ namespace AsbCloudInfrastructure.Repository if (entity is null) return -1; entity.Id = dto.Id; + entity.Login = dto.Login; entity.Name = dto.Name; entity.Email = dto.Email; entity.Phone = dto.Phone; @@ -128,11 +130,18 @@ namespace AsbCloudInfrastructure.Repository { var user = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); if (user is null) - return 0; - var result = dbContext.Users.Remove(user); - await dbContext.SaveChangesAsync(token); - DropCacheUsers(); - return result.Entity.Id; + return 0; + var query = dbContext + .Users + .Where(u => u.Id == id); + if (query.Any()) + { + var result = dbContext.Users.Remove(query.First()); + await dbContext.SaveChangesAsync(token); + DropCacheUsers(); + return result.Entity.Id; + } + return -1; } public IEnumerable GetRolesByIdUser(int idUser, int nestedLevel = 0) @@ -168,9 +177,14 @@ namespace AsbCloudInfrastructure.Repository } private IEnumerable GetRolesNamesByIdUser(int idUser) - => GetRolesByIdUser(idUser, 7) - .Select(r => r.Caption) - .Distinct(); + { + var userRoles = GetRolesByIdUser(idUser, 7) + .Select(r => r.Caption) + .Distinct(); + if (userRoles.Any()) + return userRoles; + return Enumerable.Empty(); + } private async Task AssertLoginIsBusyAsync(string login, CancellationToken token) { @@ -184,7 +198,7 @@ namespace AsbCloudInfrastructure.Repository private IEnumerable GetCachRelationUserUserRoleCacheTag() { - var cache = memoryCache.GetOrCreate(userCacheTag, cacheEntry => + var cache = memoryCache.GetOrCreate(relationUserUserRoleCacheTag, cacheEntry => { cacheEntry.AbsoluteExpirationRelativeToNow = cacheObsolence; cacheEntry.SlidingExpiration = cacheObsolence; @@ -259,7 +273,7 @@ namespace AsbCloudInfrastructure.Repository { var dto = entity.Adapt(); return dto; - } + } } #nullable disable } From d2729c3a80b3be649e0b2caafd7a3a6af1950be3 Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 15 Feb 2023 11:13:34 +0500 Subject: [PATCH 12/14] remove package --- AsbCloudInfrastructure/AsbCloudInfrastructure.csproj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj index 84cf9062..bf643cc0 100644 --- a/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj +++ b/AsbCloudInfrastructure/AsbCloudInfrastructure.csproj @@ -42,8 +42,7 @@ - - + From dbbd4d5603363d5de01d809719a8b7794020ad3e Mon Sep 17 00:00:00 2001 From: eugeniy_ivanov Date: Wed, 15 Feb 2023 11:44:20 +0500 Subject: [PATCH 13/14] =?UTF-8?q?=D0=B5=D1=81=D0=BB=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=20?= =?UTF-8?q?=D0=BD=D0=B5=20=D0=BD=D0=B0=D0=B9=D0=B4=D0=B5=D0=BD=20=D0=B2=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=82=D0=B5=D0=BA=D1=81=D1=82=D0=B5=20=D0=B2?= =?UTF-8?q?=D0=BE=D0=B7=D0=B2=D1=80=D0=B0=D1=89=D0=B0=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20ArgumentInvalidException?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudInfrastructure/Repository/UserRepository.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index 5648b21b..d14a4727 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -96,7 +96,8 @@ namespace AsbCloudInfrastructure.Repository public async Task UpdateAsync(UserExtendedDto dto, CancellationToken token) { if (dto.Id <= 1) - throw new ArgumentInvalidException($"Invalid id {dto.Id}. You can't edit this user.", nameof(dto)); + throw new ArgumentInvalidException + ($"Invalid id {dto.Id}. You can't edit this user.", nameof(dto)); var oldUser = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == dto.Id); if (oldUser is null) @@ -110,7 +111,8 @@ namespace AsbCloudInfrastructure.Repository var entity = dbContext.Users.FirstOrDefault(u => u.Id == dto.Id); if (entity is null) - return -1; + throw new ArgumentInvalidException + ($"Invalid id {dto.Id}. You can't edit this user.", nameof(dto)); entity.Id = dto.Id; entity.Login = dto.Login; entity.Name = dto.Name; @@ -141,7 +143,8 @@ namespace AsbCloudInfrastructure.Repository DropCacheUsers(); return result.Entity.Id; } - return -1; + throw new ArgumentInvalidException + ($"Invalid id {id}. You can't edit this user.", nameof(id)); } public IEnumerable GetRolesByIdUser(int idUser, int nestedLevel = 0) From 707b8f8b3b1d43ee34032bd1d9a1851de33c731e Mon Sep 17 00:00:00 2001 From: ngfrolov Date: Wed, 15 Feb 2023 14:00:46 +0500 Subject: [PATCH 14/14] 8543610 Add exceptions for badRequest --- AsbCloudInfrastructure/Repository/UserRepository.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/AsbCloudInfrastructure/Repository/UserRepository.cs b/AsbCloudInfrastructure/Repository/UserRepository.cs index d14a4727..8ddbc5f3 100644 --- a/AsbCloudInfrastructure/Repository/UserRepository.cs +++ b/AsbCloudInfrastructure/Repository/UserRepository.cs @@ -101,7 +101,8 @@ namespace AsbCloudInfrastructure.Repository var oldUser = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == dto.Id); if (oldUser is null) - return 0; + throw new ArgumentInvalidException + ($"Invalid id {dto.Id}. You can't edit this user.", nameof(dto)); if (oldUser.Login != dto.Login) await AssertLoginIsBusyAsync(dto.Login, token); @@ -132,7 +133,8 @@ namespace AsbCloudInfrastructure.Repository { var user = (await GetCacheUserAsync(token)).FirstOrDefault(u => u.Id == id); if (user is null) - return 0; + throw new ArgumentInvalidException + ($"Invalid id {id}. You can't edit this user.", nameof(id)); var query = dbContext .Users .Where(u => u.Id == id);