From fb5483299d4d1affb50b4ddf640981be176e8d7e Mon Sep 17 00:00:00 2001 From: "ai.astrakhantsev" Date: Thu, 1 Dec 2022 15:56:11 +0500 Subject: [PATCH] =?UTF-8?q?#8101318=20=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D0=BA=D1=8D=D1=88=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- AsbCloudApp/Data/UserRoleDto.cs | 2 +- AsbCloudApp/Repositories/IFileRepository.cs | 2 +- AsbCloudApp/Repositories/IUserRepository.cs | 2 +- .../Repositories/IUserRoleRepository.cs | 2 +- .../{ICrudService.cs => ICrudRepository.cs} | 2 +- AsbCloudApp/Services/IDrillParamsService.cs | 2 +- .../Services/IRepositoryWellRelated.cs | 2 +- AsbCloudApp/Services/IWellService.cs | 2 +- AsbCloudInfrastructure/DependencyInjection.cs | 26 ++-- .../Repository/CacheBase.cs | 70 +++++++++ .../Repository/CrudCacheRepositoryBase.cs | 100 +++++++++++++ .../Repository/CrudCacheServiceBase.cs | 140 ------------------ ...udServiceBase.cs => CrudRepositoryBase.cs} | 52 ++----- .../CrudWellRelatedCacheServiceBase.cs | 2 +- .../Repository/CrudWellRelatedServiceBase.cs | 2 +- .../Repository/FileRepository.cs | 5 - .../Repository/QueryContainer.cs | 28 ++++ .../Repository/SetpointsRequestRepository.cs | 27 ++++ .../Services/DrillParamsService.cs | 2 +- .../Services/FileCategoryService.cs | 2 +- .../SubsystemOperationTimeService.cs | 4 +- .../Services/Subsystems/SubsystemService.cs | 2 +- .../Services/WellService.cs | 12 +- AsbCloudWebApi.Tests/RepositoryFactory.cs | 2 +- .../ServicesTests/CrudServiceTestAbstract.cs | 4 +- .../DepositCrudCacheServiceTest.cs | 4 +- .../ServicesTests/DrillerServiceTest.cs | 4 +- .../Controllers/AdminClusterController.cs | 4 +- .../Controllers/AdminCompanyController.cs | 4 +- .../Controllers/AdminCompanyTypeController.cs | 4 +- .../Controllers/AdminDepositController.cs | 4 +- .../Controllers/AdminPermissionController.cs | 4 +- .../Controllers/AdminTelemetryController.cs | 4 +- .../Controllers/AdminUserController.cs | 2 +- .../Controllers/AdminWellController.cs | 2 +- AsbCloudWebApi/Controllers/CrudController.cs | 6 +- .../Controllers/DrillerController.cs | 4 +- .../Controllers/FileCategoryController.cs | 4 +- .../Subsystems/AdminSubsystemController.cs | 4 +- 39 files changed, 298 insertions(+), 252 deletions(-) rename AsbCloudApp/Services/{ICrudService.cs => ICrudRepository.cs} (98%) create mode 100644 AsbCloudInfrastructure/Repository/CacheBase.cs create mode 100644 AsbCloudInfrastructure/Repository/CrudCacheRepositoryBase.cs delete mode 100644 AsbCloudInfrastructure/Repository/CrudCacheServiceBase.cs rename AsbCloudInfrastructure/Repository/{CrudServiceBase.cs => CrudRepositoryBase.cs} (71%) create mode 100644 AsbCloudInfrastructure/Repository/QueryContainer.cs diff --git a/AsbCloudApp/Data/UserRoleDto.cs b/AsbCloudApp/Data/UserRoleDto.cs index aa525c91..8d761a85 100644 --- a/AsbCloudApp/Data/UserRoleDto.cs +++ b/AsbCloudApp/Data/UserRoleDto.cs @@ -29,7 +29,7 @@ namespace AsbCloudApp.Data /// /// Включенные роли /// - public virtual ICollection Roles { get; set; } + public virtual IEnumerable Roles { get; set; } /// /// Пользователи в роли diff --git a/AsbCloudApp/Repositories/IFileRepository.cs b/AsbCloudApp/Repositories/IFileRepository.cs index a05cf909..a62aa0d5 100644 --- a/AsbCloudApp/Repositories/IFileRepository.cs +++ b/AsbCloudApp/Repositories/IFileRepository.cs @@ -11,7 +11,7 @@ namespace AsbCloudApp.Repositories /// /// Сервис доступа к файлам /// - public interface IFileRepository : ICrudService + public interface IFileRepository : ICrudRepository { /// /// Получение файлов по скважине diff --git a/AsbCloudApp/Repositories/IUserRepository.cs b/AsbCloudApp/Repositories/IUserRepository.cs index 4f6b0fac..f23dc67b 100644 --- a/AsbCloudApp/Repositories/IUserRepository.cs +++ b/AsbCloudApp/Repositories/IUserRepository.cs @@ -7,7 +7,7 @@ namespace AsbCloudApp.Repositories /// /// Репозиторий пользователей /// - public interface IUserRepository : ICrudService + public interface IUserRepository : ICrudRepository { /// /// Получить список всех прав пользователя (включая наследование групп) diff --git a/AsbCloudApp/Repositories/IUserRoleRepository.cs b/AsbCloudApp/Repositories/IUserRoleRepository.cs index a2c25704..d20a42cb 100644 --- a/AsbCloudApp/Repositories/IUserRoleRepository.cs +++ b/AsbCloudApp/Repositories/IUserRoleRepository.cs @@ -10,7 +10,7 @@ namespace AsbCloudApp.Repositories /// /// Разрешения на доступ к данным /// - public interface IUserRoleRepository : ICrudService + public interface IUserRoleRepository : ICrudRepository { /// /// получить dto по названиям diff --git a/AsbCloudApp/Services/ICrudService.cs b/AsbCloudApp/Services/ICrudRepository.cs similarity index 98% rename from AsbCloudApp/Services/ICrudService.cs rename to AsbCloudApp/Services/ICrudRepository.cs index bbb7fce8..f402ebb9 100644 --- a/AsbCloudApp/Services/ICrudService.cs +++ b/AsbCloudApp/Services/ICrudRepository.cs @@ -10,7 +10,7 @@ namespace AsbCloudApp.Services /// Сервис получения, добавления, изменения, удаления данных /// /// - public interface ICrudService + public interface ICrudRepository where TDto : Data.IId { /// diff --git a/AsbCloudApp/Services/IDrillParamsService.cs b/AsbCloudApp/Services/IDrillParamsService.cs index e95e74b8..edb5067f 100644 --- a/AsbCloudApp/Services/IDrillParamsService.cs +++ b/AsbCloudApp/Services/IDrillParamsService.cs @@ -8,7 +8,7 @@ namespace AsbCloudApp.Services /// /// The параметры бурения service. /// - public interface IDrillParamsService : ICrudService + public interface IDrillParamsService : ICrudRepository { /// /// default параметры бурения diff --git a/AsbCloudApp/Services/IRepositoryWellRelated.cs b/AsbCloudApp/Services/IRepositoryWellRelated.cs index 6ce2af0e..f608fd04 100644 --- a/AsbCloudApp/Services/IRepositoryWellRelated.cs +++ b/AsbCloudApp/Services/IRepositoryWellRelated.cs @@ -11,7 +11,7 @@ namespace AsbCloudApp.Services /// Для сущностей относящихся к скважине /// /// - public interface IRepositoryWellRelated : ICrudService + public interface IRepositoryWellRelated : ICrudRepository where Tdto : IId, IWellRelated { /// diff --git a/AsbCloudApp/Services/IWellService.cs b/AsbCloudApp/Services/IWellService.cs index b8f9531c..7eef310e 100644 --- a/AsbCloudApp/Services/IWellService.cs +++ b/AsbCloudApp/Services/IWellService.cs @@ -9,7 +9,7 @@ namespace AsbCloudApp.Services /// /// сервис скважин /// - public interface IWellService : ICrudService + public interface IWellService : ICrudRepository { /// /// сервис телеметрии diff --git a/AsbCloudInfrastructure/DependencyInjection.cs b/AsbCloudInfrastructure/DependencyInjection.cs index 90c1bf5c..ed5ce7c8 100644 --- a/AsbCloudInfrastructure/DependencyInjection.cs +++ b/AsbCloudInfrastructure/DependencyInjection.cs @@ -139,33 +139,33 @@ namespace AsbCloudInfrastructure services.AddTransient(); // admin crud services: - services.AddTransient, CrudServiceBase>(s => - new CrudCacheServiceBase( + services.AddTransient, CrudCacheRepositoryBase>(s => + new CrudCacheRepositoryBase( s.GetService(), s.GetService(), dbSet => dbSet.Include(t => t.Well))); // может быть включен в сервис TelemetryService - services.AddTransient, DrillParamsService>(); - services.AddTransient, CrudCacheServiceBase>(s => - new CrudCacheServiceBase( + services.AddTransient, DrillParamsService>(); + services.AddTransient, CrudCacheRepositoryBase>(s => + new CrudCacheRepositoryBase( s.GetService(), s.GetService(), dbSet => dbSet.Include(d => d.Clusters))); - services.AddTransient, CrudCacheServiceBase>(s => - new CrudCacheServiceBase( + services.AddTransient, CrudCacheRepositoryBase>(s => + new CrudCacheRepositoryBase( s.GetService(), s.GetService(), dbSet => dbSet.Include(c => c.CompanyType))); - services.AddTransient, CrudCacheServiceBase>(); - services.AddTransient, CrudCacheServiceBase>(s => - new CrudCacheServiceBase( + services.AddTransient, CrudCacheRepositoryBase>(); + services.AddTransient, CrudCacheRepositoryBase>(s => + new CrudCacheRepositoryBase( s.GetService(), s.GetService(), dbSet => dbSet .Include(c => c.Wells) .Include(c => c.Deposit))); // может быть включен в сервис ClusterService - services.AddTransient, CrudCacheServiceBase>(); + services.AddTransient, CrudCacheRepositoryBase>(); services.AddTransient(); services.AddTransient(); @@ -174,10 +174,10 @@ namespace AsbCloudInfrastructure services.AddTransient(); services.AddTransient(); // Subsystem service - services.AddTransient, CrudCacheServiceBase>(); + services.AddTransient, CrudCacheRepositoryBase>(); services.AddTransient(); - services.AddTransient, CrudCacheServiceBase>(); + services.AddTransient, CrudCacheRepositoryBase>(); // TelemetryData services services.AddTransient, TelemetryDataSaubService>(); diff --git a/AsbCloudInfrastructure/Repository/CacheBase.cs b/AsbCloudInfrastructure/Repository/CacheBase.cs new file mode 100644 index 00000000..88761ddb --- /dev/null +++ b/AsbCloudInfrastructure/Repository/CacheBase.cs @@ -0,0 +1,70 @@ +using AsbCloudApp.Data; +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using Mapster; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Repository +{ + public class CacheBase : QueryContainer + where TDto : AsbCloudApp.Data.IId + where TEntity : class, AsbCloudDb.Model.IId + { + protected readonly IMemoryCache memoryCache; + protected string CacheTag = typeof(TDto).Name; + protected TimeSpan CacheOlescence = TimeSpan.FromMinutes(5); + + public CacheBase(IAsbCloudDbContext context, IMemoryCache memoryCache) + : base(context) + { + this.memoryCache = memoryCache; + } + + public CacheBase(IAsbCloudDbContext context, IMemoryCache memoryCache, Func, IQueryable> makeQuery) + : base(context, makeQuery) + { + this.memoryCache = memoryCache; + } + + protected virtual void DropCache() + => memoryCache.Remove(CacheTag); + + protected virtual IEnumerable GetCache() + { + var cache = memoryCache.GetOrCreate(CacheTag, cacheEntry => + { + cacheEntry.AbsoluteExpirationRelativeToNow = CacheOlescence; + cacheEntry.SlidingExpiration = CacheOlescence; + + var entities = this.GetQuery().ToArray(); + var dtos = entities.Select(Convert); + return dtos.ToArray(); + }); + return cache; + } + + protected virtual Task> GetCacheAsync(CancellationToken token) + { + var cache = memoryCache.GetOrCreateAsync(CacheTag, async (cacheEntry) => + { + cacheEntry.AbsoluteExpirationRelativeToNow = CacheOlescence; + cacheEntry.SlidingExpiration = CacheOlescence; + + var entities = await this.GetQuery().ToArrayAsync(token); + var dtos = entities.Select(Convert); + return dtos.ToArray().AsEnumerable(); + }); + return cache; + } + + protected virtual TDto Convert(TEntity src) => src.Adapt(); + + protected virtual TEntity Convert(TDto src) => src.Adapt(); + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/CrudCacheRepositoryBase.cs b/AsbCloudInfrastructure/Repository/CrudCacheRepositoryBase.cs new file mode 100644 index 00000000..30aaf673 --- /dev/null +++ b/AsbCloudInfrastructure/Repository/CrudCacheRepositoryBase.cs @@ -0,0 +1,100 @@ +using AsbCloudApp.Services; +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Caching.Memory; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; + +namespace AsbCloudInfrastructure.Repository +{ +#nullable enable + /// + /// CRUD + /// + /// + /// + public class CrudCacheRepositoryBase : CacheBase, ICrudRepository + where TDto : AsbCloudApp.Data.IId + where TEntity : class, IId + { + protected int KeySelector(TEntity entity) => entity.Id; + protected readonly ICrudRepository crudServiceBase; + + public CrudCacheRepositoryBase(IAsbCloudDbContext dbContext, IMemoryCache memoryCache) + : base(dbContext, memoryCache) + { + crudServiceBase = new CrudRepositoryBase(dbContext); + } + + public CrudCacheRepositoryBase(IAsbCloudDbContext dbContext, IMemoryCache memoryCache, Func, IQueryable> makeQuery) + : base(dbContext, memoryCache, makeQuery) + { + crudServiceBase = new CrudRepositoryBase(dbContext, makeQuery); + } + + /// + public async Task InsertAsync(TDto newItem, CancellationToken token) + { + var result = await crudServiceBase.InsertAsync(newItem, token); + if (result > 0) + DropCache(); + return result; + } + + /// + public async Task InsertRangeAsync(IEnumerable dtos, CancellationToken token) + { + var result = await crudServiceBase.InsertRangeAsync(dtos, token); + if (result > 0) + DropCache(); + return result; + } + + /// + public async Task> GetAllAsync(CancellationToken token) + { + var cache = await GetCacheAsync(token); + return cache; + } + + /// + /// + /// + /// + /// + public TDto? GetOrDefault(int id) + { + var cache = GetCache(); + return cache.FirstOrDefault(d => d.Id == id); + } + + /// + public async Task GetOrDefaultAsync(int id, CancellationToken token) + { + var cache = await GetCacheAsync(token); + return cache.FirstOrDefault(d => d.Id == id); + } + + /// + public async Task UpdateAsync(TDto dto, CancellationToken token) + { + var result = await crudServiceBase.UpdateAsync(dto, token); + if (result > 0) + DropCache(); + return result; + } + + /// + public async Task DeleteAsync(int id, CancellationToken token) + { + var result = await crudServiceBase.DeleteAsync(id, token); + if (result > 0) + DropCache(); + return result; + } + } +#nullable disable +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/CrudCacheServiceBase.cs b/AsbCloudInfrastructure/Repository/CrudCacheServiceBase.cs deleted file mode 100644 index 2624d39c..00000000 --- a/AsbCloudInfrastructure/Repository/CrudCacheServiceBase.cs +++ /dev/null @@ -1,140 +0,0 @@ -using AsbCloudDb.Model; -using Microsoft.EntityFrameworkCore; -using Microsoft.Extensions.Caching.Memory; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; - -namespace AsbCloudInfrastructure.Repository -{ -#nullable enable - /// - /// CRUD - /// - /// - /// - public class CrudCacheServiceBase : CrudServiceBase - where TDto : AsbCloudApp.Data.IId - where TEntity : class, IId - { - protected string CacheTag = typeof(TDto).Name; - protected TimeSpan CacheOlescence = TimeSpan.FromMinutes(5); - private readonly IMemoryCache memoryCache; - - protected int KeySelector(TEntity entity) => entity.Id; - - public CrudCacheServiceBase(IAsbCloudDbContext dbContext, IMemoryCache memoryCache) - : base(dbContext) - { - this.memoryCache = memoryCache; - } - - public CrudCacheServiceBase(IAsbCloudDbContext dbContext, IMemoryCache memoryCache, Func, IQueryable> makeQuery) - : base(dbContext, makeQuery) - { - this.memoryCache = memoryCache; - } - - /// - public override async Task InsertAsync(TDto newItem, CancellationToken token) - { - var result = await base.InsertAsync(newItem, token); - if (result > 0) - DropCache(); - return result; - } - - /// - public override async Task InsertRangeAsync(IEnumerable dtos, CancellationToken token) - { - var result = await base.InsertRangeAsync(dtos, token); - if (result > 0) - DropCache(); - return result; - } - - /// - public override async Task> GetAllAsync(CancellationToken token) - { - var cache = await GetCacheAsync(token); - return cache; - } - - /// - /// - /// - /// - /// - public override TDto? GetOrDefault(int id) - { - var cache = GetCache(); - return cache.FirstOrDefault(d => d.Id == id); - } - - /// - public override async Task GetOrDefaultAsync(int id, CancellationToken token) - { - var cache = await GetCacheAsync(token); - return cache.FirstOrDefault(d => d.Id == id); - } - - /// - public override async Task UpdateAsync(TDto dto, CancellationToken token) - { - var result = await base.UpdateAsync(dto, token); - if (result > 0) - DropCache(); - return result; - } - - /// - public override async Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) - { - var result = await base.UpdateRangeAsync(dtos, token); - if (result > 0) - DropCache(); - return result; - } - - /// - public override async Task DeleteAsync(int id, CancellationToken token) - { - var result = await base.DeleteAsync(id, token); - if (result > 0) - DropCache(); - return result; - } - - protected virtual Task> GetCacheAsync(CancellationToken token) - { - var cache = memoryCache.GetOrCreateAsync(CacheTag, async (cacheEntry) => { - cacheEntry.AbsoluteExpirationRelativeToNow = CacheOlescence; - cacheEntry.SlidingExpiration = CacheOlescence; - - var entities = await GetQuery().ToArrayAsync(token); - var dtos = entities.Select(Convert); - return dtos.ToArray().AsEnumerable(); - }); - return cache; - } - - protected virtual IEnumerable GetCache() - { - var cache = memoryCache.GetOrCreate(CacheTag, cacheEntry => { - cacheEntry.AbsoluteExpirationRelativeToNow = CacheOlescence; - cacheEntry.SlidingExpiration= CacheOlescence; - - var entities = GetQuery().ToArray(); - var dtos = entities.Select(Convert); - return dtos.ToArray(); - }); - return cache; - } - - protected virtual void DropCache() - => memoryCache.Remove(CacheTag); - } -#nullable disable -} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/CrudServiceBase.cs b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs similarity index 71% rename from AsbCloudInfrastructure/Repository/CrudServiceBase.cs rename to AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs index 67b750cc..da51ab32 100644 --- a/AsbCloudInfrastructure/Repository/CrudServiceBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudRepositoryBase.cs @@ -16,33 +16,22 @@ namespace AsbCloudInfrastructure.Repository /// /// /// - public class CrudServiceBase : ICrudService + public class CrudRepositoryBase : QueryContainer, ICrudRepository where TDto : AsbCloudApp.Data.IId where TEntity : class, IId { - protected readonly IAsbCloudDbContext dbContext; - protected readonly DbSet dbSet; - protected readonly Func> GetQuery; + public CrudRepositoryBase(IAsbCloudDbContext context) + : base(context) + { } - public CrudServiceBase(IAsbCloudDbContext context) - { - dbContext = context; - dbSet = context.Set(); - GetQuery = () => dbSet; - } - - public CrudServiceBase(IAsbCloudDbContext context, Func, IQueryable> makeQuery) - { - dbContext = context; - dbSet = context.Set(); - GetQuery = () => makeQuery(dbSet); - } + public CrudRepositoryBase(IAsbCloudDbContext context, Func, IQueryable> makeQuery) + : base(context, makeQuery) + { } /// public virtual async Task> GetAllAsync(CancellationToken token = default) { var entities = await GetQuery() - //.OrderBy(e => e.Id) .AsNoTracking() .ToListAsync(token) .ConfigureAwait(false); @@ -117,7 +106,7 @@ namespace AsbCloudInfrastructure.Repository .ConfigureAwait(false); if (existingEntity is null) - return ICrudService.ErrorIdNotFound; + return ICrudRepository.ErrorIdNotFound; var entity = Convert(item); var entry = dbSet.Update(entity); @@ -126,29 +115,6 @@ namespace AsbCloudInfrastructure.Repository return entry.Entity.Id; } - public virtual async Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) - { - var ids = dtos.Select(d => d.Id); - var existingEntities = await dbSet - .AsNoTracking() - .Where(d => ids.Contains(d.Id)) - .Select(d => d.Id) - .ToListAsync(token) - .ConfigureAwait(false); - - if (ids.Count() > existingEntities.Count) - return ICrudService.ErrorIdNotFound; - - foreach (var dto in dtos) - { - var entity = Convert(dto); - var entry = dbSet.Update(entity); - } - - var affected = await dbContext.SaveChangesAsync(token); - return affected; - } - /// public virtual Task DeleteAsync(int id, CancellationToken token = default) { @@ -156,7 +122,7 @@ namespace AsbCloudInfrastructure.Repository .AsNoTracking() .FirstOrDefault(e => e.Id == id); if (entity == default) - return Task.FromResult(ICrudService.ErrorIdNotFound); + return Task.FromResult(ICrudRepository.ErrorIdNotFound); var entry = dbSet.Remove(entity); var affected = dbContext.SaveChangesAsync(token); entry.State = EntityState.Detached; diff --git a/AsbCloudInfrastructure/Repository/CrudWellRelatedCacheServiceBase.cs b/AsbCloudInfrastructure/Repository/CrudWellRelatedCacheServiceBase.cs index a7eb3305..29362c89 100644 --- a/AsbCloudInfrastructure/Repository/CrudWellRelatedCacheServiceBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudWellRelatedCacheServiceBase.cs @@ -11,7 +11,7 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository { #nullable enable - public class CrudWellRelatedCacheServiceBase : CrudCacheServiceBase, IRepositoryWellRelated + public class CrudWellRelatedCacheServiceBase : CrudCacheRepositoryBase, IRepositoryWellRelated where TDto : AsbCloudApp.Data.IId, AsbCloudApp.Data.IWellRelated where TEntity : class, IId, IWellRelated { diff --git a/AsbCloudInfrastructure/Repository/CrudWellRelatedServiceBase.cs b/AsbCloudInfrastructure/Repository/CrudWellRelatedServiceBase.cs index b79277cc..eb59a94d 100644 --- a/AsbCloudInfrastructure/Repository/CrudWellRelatedServiceBase.cs +++ b/AsbCloudInfrastructure/Repository/CrudWellRelatedServiceBase.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Repository { #nullable enable - public class CrudWellRelatedServiceBase : CrudServiceBase, IRepositoryWellRelated + public class CrudWellRelatedServiceBase : CrudRepositoryBase, IRepositoryWellRelated where TDto : AsbCloudApp.Data.IId, AsbCloudApp.Data.IWellRelated where TEntity : class, IId, IWellRelated { diff --git a/AsbCloudInfrastructure/Repository/FileRepository.cs b/AsbCloudInfrastructure/Repository/FileRepository.cs index deb43445..98d899cc 100644 --- a/AsbCloudInfrastructure/Repository/FileRepository.cs +++ b/AsbCloudInfrastructure/Repository/FileRepository.cs @@ -1,15 +1,10 @@ using AsbCloudApp.Data; using AsbCloudApp.Repositories; using AsbCloudApp.Requests; -using AsbCloudApp.Services; using AsbCloudDb; using AsbCloudDb.Model; -using AsbCloudInfrastructure.Services; -using DocumentFormat.OpenXml.Drawing.Charts; -using DocumentFormat.OpenXml.Wordprocessing; using Mapster; using Microsoft.EntityFrameworkCore; -using Org.BouncyCastle.Asn1.Ocsp; using System; using System.Collections.Generic; using System.Linq; diff --git a/AsbCloudInfrastructure/Repository/QueryContainer.cs b/AsbCloudInfrastructure/Repository/QueryContainer.cs new file mode 100644 index 00000000..a1586220 --- /dev/null +++ b/AsbCloudInfrastructure/Repository/QueryContainer.cs @@ -0,0 +1,28 @@ +using AsbCloudDb.Model; +using Microsoft.EntityFrameworkCore; +using System; +using System.Linq; + +namespace AsbCloudInfrastructure.Repository +{ + public class QueryContainer where TEntity : class, IId + { + protected readonly IAsbCloudDbContext dbContext; + protected readonly DbSet dbSet; + protected readonly Func> GetQuery; + + public QueryContainer(IAsbCloudDbContext context) + { + dbContext = context; + dbSet = context.Set(); + GetQuery = () => dbSet; + } + + public QueryContainer(IAsbCloudDbContext context, Func, IQueryable> makeQuery) + { + dbContext = context; + dbSet = context.Set(); + GetQuery = () => makeQuery(dbSet); + } + } +} \ No newline at end of file diff --git a/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs b/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs index c9379244..325cae07 100644 --- a/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs +++ b/AsbCloudInfrastructure/Repository/SetpointsRequestRepository.cs @@ -4,6 +4,10 @@ using AsbCloudDb.Model; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using System.Threading; +using System.Linq; namespace AsbCloudInfrastructure.Repository { @@ -18,6 +22,29 @@ namespace AsbCloudInfrastructure.Repository this.wellService = wellService; } + public virtual async Task UpdateRangeAsync(IEnumerable dtos, CancellationToken token) + { + var ids = dtos.Select(d => d.Id); + var existingEntities = await dbSet + .AsNoTracking() + .Where(d => ids.Contains(d.Id)) + .Select(d => d.Id) + .ToListAsync(token) + .ConfigureAwait(false); + + if (ids.Count() > existingEntities.Count) + return ICrudRepository.ErrorIdNotFound; + + foreach (var dto in dtos) + { + var entity = Convert(dto); + var entry = dbSet.Update(entity); + } + + var affected = await dbContext.SaveChangesAsync(token); + return affected; + } + protected override SetpointsRequestDto Convert(SetpointsRequest src) { var result = base.Convert(src); diff --git a/AsbCloudInfrastructure/Services/DrillParamsService.cs b/AsbCloudInfrastructure/Services/DrillParamsService.cs index a2ac61c6..7c5f8e62 100644 --- a/AsbCloudInfrastructure/Services/DrillParamsService.cs +++ b/AsbCloudInfrastructure/Services/DrillParamsService.cs @@ -12,7 +12,7 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services { #nullable enable - public class DrillParamsService : CrudServiceBase, IDrillParamsService + public class DrillParamsService : CrudRepositoryBase, IDrillParamsService { private readonly IAsbCloudDbContext db; private readonly ITelemetryService telemetryService; diff --git a/AsbCloudInfrastructure/Services/FileCategoryService.cs b/AsbCloudInfrastructure/Services/FileCategoryService.cs index 8721ef25..e7370ee8 100644 --- a/AsbCloudInfrastructure/Services/FileCategoryService.cs +++ b/AsbCloudInfrastructure/Services/FileCategoryService.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services { - public class FileCategoryService : CrudCacheServiceBase, IFileCategoryService + public class FileCategoryService : CrudCacheRepositoryBase, IFileCategoryService { public FileCategoryService(IAsbCloudDbContext context, IMemoryCache memoryCache) : base(context, memoryCache) { } diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs index ada2ab42..16a48b56 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemOperationTimeService.cs @@ -23,13 +23,13 @@ namespace AsbCloudInfrastructure.Services.Subsystems private readonly IAsbCloudDbContext db; private readonly IWellService wellService; - private readonly ICrudService subsystemService; + private readonly ICrudRepository subsystemService; private readonly IDetectedOperationService detectedOperationService; public const int IdSubsystemAKB = 1; public const int IdSubsystemMSE = 2; public const int IdSubsystemSpin = 65536; public const int IdSubsystemTorque = 65537; - public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService, ICrudService subsystemService, IDetectedOperationService detectedOperationService) + public SubsystemOperationTimeService(IAsbCloudDbContext db, IWellService wellService, ICrudRepository subsystemService, IDetectedOperationService detectedOperationService) { this.db = db; this.wellService = wellService; diff --git a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs index 6491265a..e73e6d84 100644 --- a/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs +++ b/AsbCloudInfrastructure/Services/Subsystems/SubsystemService.cs @@ -15,7 +15,7 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services.Subsystems { #nullable enable - internal class SubsystemService : CrudCacheServiceBase, ISubsystemService + internal class SubsystemService : CrudCacheRepositoryBase, ISubsystemService { private readonly IWellService wellService; public SubsystemService(IAsbCloudDbContext dbContext, IMemoryCache memoryCache, IWellService wellService) : base(dbContext, memoryCache) diff --git a/AsbCloudInfrastructure/Services/WellService.cs b/AsbCloudInfrastructure/Services/WellService.cs index c96672f7..8967ad78 100644 --- a/AsbCloudInfrastructure/Services/WellService.cs +++ b/AsbCloudInfrastructure/Services/WellService.cs @@ -15,13 +15,13 @@ using System.Threading.Tasks; namespace AsbCloudInfrastructure.Services { - public class WellService : CrudCacheServiceBase, IWellService + public class WellService : CrudCacheRepositoryBase, IWellService { private const string relationCompaniesWellsCacheTag = "RelationCompaniesWells"; private static readonly TimeSpan relationCompaniesWellsCacheObsolence = TimeSpan.FromMinutes(15); private readonly ITelemetryService telemetryService; - private readonly ICrudService companyTypesService; + private readonly ICrudRepository companyTypesService; private readonly ITimezoneService timezoneService; private readonly IWellOperationService wellOperationService; @@ -43,7 +43,7 @@ namespace AsbCloudInfrastructure.Services this.timezoneService = timezoneService; this.wellOperationService = new WellOperationService.WellOperationService(db, memoryCache, this); - companyTypesService = new CrudCacheServiceBase(dbContext, memoryCache); + companyTypesService = new CrudCacheRepositoryBase(dbContext, memoryCache); } private IEnumerable GetCacheRelationCompanyWell() @@ -86,7 +86,7 @@ namespace AsbCloudInfrastructure.Services return wellsDtos.ToList(); } - public override async Task InsertAsync(WellDto dto, CancellationToken token = default) + public async Task InsertAsync(WellDto dto, CancellationToken token = default) { if (dto.IdWellType is < 1 or > 2) throw new ArgumentInvalidException("Тип скважины указан неправильно.", nameof(dto)); @@ -112,12 +112,12 @@ namespace AsbCloudInfrastructure.Services return result; } - public override Task InsertRangeAsync(IEnumerable dtos, CancellationToken token) + public Task InsertRangeAsync(IEnumerable dtos, CancellationToken token) { throw new NotImplementedException(); } - public override async Task UpdateAsync(WellDto dto, + public async Task UpdateAsync(WellDto dto, CancellationToken token = default) { if (dto.IdWellType is < 1 or > 2) diff --git a/AsbCloudWebApi.Tests/RepositoryFactory.cs b/AsbCloudWebApi.Tests/RepositoryFactory.cs index a8588dda..984fb494 100644 --- a/AsbCloudWebApi.Tests/RepositoryFactory.cs +++ b/AsbCloudWebApi.Tests/RepositoryFactory.cs @@ -11,7 +11,7 @@ namespace AsbCloudWebApi.Tests { public static Mock Make(ICollection data) where TDto : AsbCloudApp.Data.IId - where TRepository : class, ICrudService + where TRepository : class, ICrudRepository { var repositoryMock = new Mock(); diff --git a/AsbCloudWebApi.Tests/ServicesTests/CrudServiceTestAbstract.cs b/AsbCloudWebApi.Tests/ServicesTests/CrudServiceTestAbstract.cs index d427e038..4b9a6ebb 100644 --- a/AsbCloudWebApi.Tests/ServicesTests/CrudServiceTestAbstract.cs +++ b/AsbCloudWebApi.Tests/ServicesTests/CrudServiceTestAbstract.cs @@ -9,7 +9,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests public abstract class CrudServiceTestAbstract where TDto : AsbCloudApp.Data.IId { - private readonly ICrudService service; + private readonly ICrudRepository service; public CrudServiceTestAbstract() { @@ -17,7 +17,7 @@ namespace AsbCloudWebApi.Tests.ServicesTests service = MakeService(); } - protected abstract ICrudService MakeService(); + protected abstract ICrudRepository MakeService(); protected abstract TDto MakeNewItem(); [Fact] diff --git a/AsbCloudWebApi.Tests/ServicesTests/DepositCrudCacheServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/DepositCrudCacheServiceTest.cs index e95c7cc3..f907f889 100644 --- a/AsbCloudWebApi.Tests/ServicesTests/DepositCrudCacheServiceTest.cs +++ b/AsbCloudWebApi.Tests/ServicesTests/DepositCrudCacheServiceTest.cs @@ -19,10 +19,10 @@ namespace AsbCloudWebApi.Tests.ServicesTests return item; } - protected override ICrudService MakeService() + protected override ICrudRepository MakeService() { var dbContext = TestHelpter.MakeRealTestContext(); - return new CrudCacheServiceBase(dbContext, TestHelpter.MemoryCache); + return new CrudCacheRepositoryBase(dbContext, TestHelpter.MemoryCache); } } } diff --git a/AsbCloudWebApi.Tests/ServicesTests/DrillerServiceTest.cs b/AsbCloudWebApi.Tests/ServicesTests/DrillerServiceTest.cs index f829c76c..b0f0e518 100644 --- a/AsbCloudWebApi.Tests/ServicesTests/DrillerServiceTest.cs +++ b/AsbCloudWebApi.Tests/ServicesTests/DrillerServiceTest.cs @@ -27,11 +27,11 @@ namespace AsbCloudWebApi.Tests.ServicesTests Surname = "Тестович" } }; - private ICrudService service; + private ICrudRepository service; public DrillerServiceTest() { - var repositoryMock = RepositoryFactory.Make, DrillerDto>(Drillers); + var repositoryMock = RepositoryFactory.Make, DrillerDto>(Drillers); repositoryMock.Setup(x => x.GetAllAsync(It.IsAny())) .Returns(() => { diff --git a/AsbCloudWebApi/Controllers/AdminClusterController.cs b/AsbCloudWebApi/Controllers/AdminClusterController.cs index 2f8d927a..511b786b 100644 --- a/AsbCloudWebApi/Controllers/AdminClusterController.cs +++ b/AsbCloudWebApi/Controllers/AdminClusterController.cs @@ -11,9 +11,9 @@ namespace AsbCloudWebApi.Controllers [Route("api/admin/cluster")] [ApiController] [Authorize] - public class AdminClusterController : CrudController> + public class AdminClusterController : CrudController> { - public AdminClusterController(ICrudService service) + public AdminClusterController(ICrudRepository service) : base(service) { } } diff --git a/AsbCloudWebApi/Controllers/AdminCompanyController.cs b/AsbCloudWebApi/Controllers/AdminCompanyController.cs index 04f6109f..f6ebb3d2 100644 --- a/AsbCloudWebApi/Controllers/AdminCompanyController.cs +++ b/AsbCloudWebApi/Controllers/AdminCompanyController.cs @@ -11,9 +11,9 @@ namespace AsbCloudWebApi.Controllers [Route("api/admin/company")] [ApiController] [Authorize] - public class AdminCompanyController : CrudController> + public class AdminCompanyController : CrudController> { - public AdminCompanyController(ICrudService service) + public AdminCompanyController(ICrudRepository service) : base(service) { } diff --git a/AsbCloudWebApi/Controllers/AdminCompanyTypeController.cs b/AsbCloudWebApi/Controllers/AdminCompanyTypeController.cs index 60c3ea22..eb05c245 100644 --- a/AsbCloudWebApi/Controllers/AdminCompanyTypeController.cs +++ b/AsbCloudWebApi/Controllers/AdminCompanyTypeController.cs @@ -11,9 +11,9 @@ namespace AsbCloudWebApi.Controllers [Route("api/admin/companyType")] [ApiController] [Authorize] - public class AdminCompanyTypeController : CrudController> + public class AdminCompanyTypeController : CrudController> { - public AdminCompanyTypeController(ICrudService service) + public AdminCompanyTypeController(ICrudRepository service) : base(service) { } } diff --git a/AsbCloudWebApi/Controllers/AdminDepositController.cs b/AsbCloudWebApi/Controllers/AdminDepositController.cs index c35be313..b39e4f01 100644 --- a/AsbCloudWebApi/Controllers/AdminDepositController.cs +++ b/AsbCloudWebApi/Controllers/AdminDepositController.cs @@ -11,9 +11,9 @@ namespace AsbCloudWebApi.Controllers [Route("api/admin/deposit")] [ApiController] [Authorize] - public class AdminDepositController : CrudController> + public class AdminDepositController : CrudController> { - public AdminDepositController(ICrudService service) + public AdminDepositController(ICrudRepository service) : base(service) { } diff --git a/AsbCloudWebApi/Controllers/AdminPermissionController.cs b/AsbCloudWebApi/Controllers/AdminPermissionController.cs index ffbfe213..31d7bec6 100644 --- a/AsbCloudWebApi/Controllers/AdminPermissionController.cs +++ b/AsbCloudWebApi/Controllers/AdminPermissionController.cs @@ -15,9 +15,9 @@ namespace AsbCloudWebApi.Controllers [Route("api/admin/permission")] [ApiController] [Authorize] - public class AdminPermissionController : CrudController> + public class AdminPermissionController : CrudController> { - public AdminPermissionController(ICrudService service) + public AdminPermissionController(ICrudRepository service) : base(service) { } diff --git a/AsbCloudWebApi/Controllers/AdminTelemetryController.cs b/AsbCloudWebApi/Controllers/AdminTelemetryController.cs index 1daad23c..b55d623a 100644 --- a/AsbCloudWebApi/Controllers/AdminTelemetryController.cs +++ b/AsbCloudWebApi/Controllers/AdminTelemetryController.cs @@ -13,11 +13,11 @@ namespace AsbCloudWebApi.Controllers [Route("api/admin/telemetry")] [ApiController] [Authorize] - public class AdminTelemetryController : CrudController> + public class AdminTelemetryController : CrudController> { private readonly ITelemetryService telemetryService; - public AdminTelemetryController(ICrudService service, + public AdminTelemetryController(ICrudRepository service, ITelemetryService telemetryService) : base(service) { diff --git a/AsbCloudWebApi/Controllers/AdminUserController.cs b/AsbCloudWebApi/Controllers/AdminUserController.cs index 0ce262d0..288f838a 100644 --- a/AsbCloudWebApi/Controllers/AdminUserController.cs +++ b/AsbCloudWebApi/Controllers/AdminUserController.cs @@ -13,7 +13,7 @@ namespace AsbCloudWebApi.Controllers [Route("api/admin/user")] [ApiController] [Authorize] - public class AdminUserController : CrudController> + public class AdminUserController : CrudController> { public AdminUserController(IUserRepository service) : base(service) diff --git a/AsbCloudWebApi/Controllers/AdminWellController.cs b/AsbCloudWebApi/Controllers/AdminWellController.cs index 3441af43..4a670652 100644 --- a/AsbCloudWebApi/Controllers/AdminWellController.cs +++ b/AsbCloudWebApi/Controllers/AdminWellController.cs @@ -13,7 +13,7 @@ namespace AsbCloudWebApi.Controllers [Route("api/admin/well")] [ApiController] [Authorize] - public class AdminWellController : CrudController> + public class AdminWellController : CrudController> { public AdminWellController(IWellService service) : base(service) diff --git a/AsbCloudWebApi/Controllers/CrudController.cs b/AsbCloudWebApi/Controllers/CrudController.cs index db66e468..4b0a6c19 100644 --- a/AsbCloudWebApi/Controllers/CrudController.cs +++ b/AsbCloudWebApi/Controllers/CrudController.cs @@ -21,7 +21,7 @@ namespace AsbCloudWebApi.Controllers [Authorize] public abstract class CrudController : ControllerBase where T : IId - where TService : ICrudService + where TService : ICrudRepository { protected readonly TService service; @@ -115,7 +115,7 @@ namespace AsbCloudWebApi.Controllers return Forbid(); var result = await service.UpdateAsync(value, token).ConfigureAwait(false); - if (result == ICrudService.ErrorIdNotFound) + if (result == ICrudRepository.ErrorIdNotFound) return BadRequest($"id:{value.Id} does not exist in the db"); return Ok(result); } @@ -134,7 +134,7 @@ namespace AsbCloudWebApi.Controllers return Forbid(); var result = await service.DeleteAsync(id, token).ConfigureAwait(false); - if (result == ICrudService.ErrorIdNotFound) + if (result == ICrudRepository.ErrorIdNotFound) return NoContent(); return Ok(result); } diff --git a/AsbCloudWebApi/Controllers/DrillerController.cs b/AsbCloudWebApi/Controllers/DrillerController.cs index 2175c1ce..0fa84e4a 100644 --- a/AsbCloudWebApi/Controllers/DrillerController.cs +++ b/AsbCloudWebApi/Controllers/DrillerController.cs @@ -11,9 +11,9 @@ namespace AsbCloudWebApi.Controllers [Route("api/driller")] [ApiController] [Authorize] - public class DrillerController : CrudController> + public class DrillerController : CrudController> { - public DrillerController(ICrudService service) + public DrillerController(ICrudRepository service) : base(service) { } } diff --git a/AsbCloudWebApi/Controllers/FileCategoryController.cs b/AsbCloudWebApi/Controllers/FileCategoryController.cs index 5567c5e7..2a19cbe7 100644 --- a/AsbCloudWebApi/Controllers/FileCategoryController.cs +++ b/AsbCloudWebApi/Controllers/FileCategoryController.cs @@ -11,9 +11,9 @@ namespace AsbCloudWebApi.Controllers [Route("api/[Controller]")] [ApiController] [Authorize] - public class FileCategoryController : CrudController> + public class FileCategoryController : CrudController> { - public FileCategoryController(ICrudService service, IFileCategoryService fileCategoryService) + public FileCategoryController(ICrudRepository service, IFileCategoryService fileCategoryService) : base(service) { } diff --git a/AsbCloudWebApi/Controllers/Subsystems/AdminSubsystemController.cs b/AsbCloudWebApi/Controllers/Subsystems/AdminSubsystemController.cs index dc7ac408..454062e1 100644 --- a/AsbCloudWebApi/Controllers/Subsystems/AdminSubsystemController.cs +++ b/AsbCloudWebApi/Controllers/Subsystems/AdminSubsystemController.cs @@ -12,9 +12,9 @@ namespace AsbCloudWebApi.Controllers.Subsystems [Route("api/admin/subsystem")] [ApiController] [Authorize] - public class AdminSubsystemController : CrudController> + public class AdminSubsystemController : CrudController> { - public AdminSubsystemController(ICrudService service) + public AdminSubsystemController(ICrudRepository service) : base(service) { }