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)
{
}