From 547cb894bef5128d8d09cd85a837bb938cc2fe30 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Tue, 17 Mar 2026 13:50:06 +1000 Subject: [PATCH 1/3] =?UTF-8?q?feat(dal):=20RedisCacheService=20-=20=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D1=81=20Hash=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=D0=BC=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API/Contracts/V1/ApiRoutes.cs | 13 -- PARR.API/Controllers/V1/TestController.cs | 163 ++++-------------- .../Cache/Services/Base/IRedisCacheService.cs | 70 ++++++++ .../Cache/Services/Base/RedisCacheService.cs | 92 +++++++++- PARR.DAL/ParrDalInstaller.cs | 11 +- 5 files changed, 200 insertions(+), 149 deletions(-) diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index ecb11262..f2ced40a 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -49,20 +49,7 @@ public const string GetNextRun = Base + "/tests/next-run"; - public const string GetNextScheduleDate = Base + "/tests/next-schedule-date/" + paramApplicationInWorkId + "/" + paramDate; - - public const string GetNextSchedule = Base + "/tests/next-schedule/" + paramApplicationInWorkId + "/" + paramDate; - public const string CreateCache = Base + "/tests/cache/"; - - public const string IsWorkDay = Base + "/tests/is-work-day/"; - - public const string TestHandler = Base + "/tests/test/"; - - public const string GetWorkDay = Base + "/tests/get-work-day/{date}"; - - public const string paramDate = "{lastRunDate}"; - public const string paramApplicationInWorkId = "{applicationInWorkId}"; } public static class Template diff --git a/PARR.API/Controllers/V1/TestController.cs b/PARR.API/Controllers/V1/TestController.cs index da19f183..e76fa8c6 100644 --- a/PARR.API/Controllers/V1/TestController.cs +++ b/PARR.API/Controllers/V1/TestController.cs @@ -1,16 +1,12 @@ -using AutoMapper; -using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using PARR.API.Contracts.V1; using PARR.API.Contracts.V1.Responses.Base; using PARR.API.Controllers.V1.Base; using PARR.API.Services.Interfaces; using PARR.DAL.Cache.Services.Base; -using PARR.DAL.DomainServices.UnitFilterService; using PARR.DAL.NextRunServices; using PARR.DAL.Services.Interfaces; -using PARR.DAL.Services.Interfaces.Job; -using PARR.DAL.Services.Interfaces.Unit; namespace PARR.API.Controllers.V1 @@ -19,43 +15,19 @@ namespace PARR.API.Controllers.V1 public class TestController : BaseApiController { private readonly IClientService clientService; - //private readonly IEsppScheduleTransformService esppScheduleTransformService; private readonly IRedisCacheService redisCacheService; - private readonly IWeekendDayService weekendDayService; - private readonly IUnitService unitService; - private readonly IFieldFilterService fieldFilterService; - private readonly IJobService jobService; - private readonly IJobUnitFilterService jobUnitFilterService; - private readonly IUnitFilterService unitFilterService; - private readonly IMapper mapper; private readonly INextRunService nextRunService; private readonly ITemplateService templateService; public TestController( IClientService clientService, - //IEsppScheduleTransformService esppScheduleTransformService, IRedisCacheService redisCacheService, - IWeekendDayService weekendDayService, - IUnitService unitService, - IFieldFilterService fieldFilterService, - IJobService jobService, - IJobUnitFilterService jobUnitFilterService, - IUnitFilterService unitFilterService, - IMapper mapper, INextRunService nextRunService, ITemplateService templateService ) { this.clientService = clientService; - //this.esppScheduleTransformService = esppScheduleTransformService; this.redisCacheService = redisCacheService; - this.weekendDayService = weekendDayService; - this.unitService = unitService; - this.fieldFilterService = fieldFilterService; - this.jobService = jobService; - this.jobUnitFilterService = jobUnitFilterService; - this.unitFilterService = unitFilterService; - this.mapper = mapper; this.nextRunService = nextRunService; this.templateService = templateService; } @@ -92,124 +64,47 @@ namespace PARR.API.Controllers.V1 } - ///// - ///// Получить следующую дату запуска - ///// - ///// - ///// - ///// - //[HttpGet(ApiRoutes.Test.GetNextScheduleDate)] - //public async Task GetNextScheduleDate([FromRoute] Guid applicationInWorkId, [FromRoute] DateTimeOffset lastRunDate) - //{ - // var result = await esppScheduleTransformService.GetNextDateAsync(applicationInWorkId, lastRunDate); - // return Ok(result); - //} - ///// - ///// Получить следующее расписание + ///// Записать в кэш ///// - ///// - ///// + ///// ///// - //[HttpGet(ApiRoutes.Test.GetNextSchedule)] - //public async Task GetNextSchedule([FromRoute] Guid applicationInWorkId, [FromRoute] DateTimeOffset lastRunDate) + //[HttpPost(ApiRoutes.Test.CreateCache)] + //public async Task CreateCache() //{ - // var result = await esppScheduleTransformService.GetNextScheduleAsync(applicationInWorkId, lastRunDate); - // return Ok(result); + // var hashKey = redisCacheService.GetKey(new[] { "test", "mxa" }); + // var ttl = TimeSpan.FromMinutes(10); + + // await redisCacheService.SetHashFieldAsync(hashKey, "t1", "val1", ttl); + // await redisCacheService.SetHashFieldAsync(hashKey, "t2", "val2"); + // await redisCacheService.SetHashFieldAsync(hashKey, "t3", "val3"); + + // var length = await redisCacheService.GetHashLengthAsync(hashKey); + + // var get = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); + + // var getAll = await redisCacheService.GetAllHashFieldsAsync(hashKey); + + // await redisCacheService.DeleteHashFieldAsync(hashKey, "t1"); + // var getT1 = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); + + // var exist = await redisCacheService.HashFieldExistsAsync(hashKey, "t2"); + + // await redisCacheService.DeleteHashAsync(hashKey); + // var getT_1 = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); + + // await redisCacheService.SetHashTtlAsync(hashKey, ttl); + + // return Ok(); //} - /// - /// Записать в кэш и получить обратно значение из кэша - /// - /// - /// - [HttpPost(ApiRoutes.Test.CreateCache)] - public async Task CreateCache([FromBody] CaheRequestTest request) - { - await redisCacheService.SetCachedDataAsync(request.Key, request, TimeSpan.FromMinutes(1)); - - var fromCache = await redisCacheService.GetCachedDataAsync(request.Key); - - return Ok(new { fromCache }); - } - /// - /// Проверка, это рабочий день? - /// - /// - /// - [HttpGet(ApiRoutes.Test.IsWorkDay)] - public async Task IsWorkDay([FromQuery] DateOnly date) - { - return Ok(await weekendDayService.IsWorkDayAsync(date, true)); - } - /// - /// Тестовый метод - /// - /// - [HttpGet(ApiRoutes.Test.TestHandler)] - public async Task Test() - { - //var job = new Job - //{ - // Id = Guid.NewGuid(), - // Name = "ВИ-VMWARE ТО-1 Мониторинг и анализ работы виртуальной инфраструктуры", - // DateCreated = DateTimeOffset.Now, - // TemplateNameMask = "ЭИТИ_%РГ%_%ТНК%_%ЭК%", - // TnkId = Guid.Parse("9b7e0251-cb13-427c-ac71-16baa2a111dd") - //}; - //var jobDetails = new JobDetails { - // Id = Guid.NewGuid(), - // UnitFilter = "ВРТ-VMWARE-*", - // JobId = job.Id, - // ShortDescription = "Мониторинг и анализ работы виртуальной инфраструктуры", - // FullDescription = "Проверка журналов (лог-файла) событий (warning, alarm) объектов виртуальной инфраструктуры (ВМ, хост, кластер, датацентр, virtual center и др.)", - // Solution = "Работы проведены", - // Duration = "7 00:00:00", - // ReferenceDate = new DateTimeOffset(2026,01,01,00,00,00,new TimeSpan(0)) - //}; - - //var fieldFilter = new FieldFilter - //{ - // Id = Guid.NewGuid(), - // JobDetailsId = jobDetails.Id, - // FieldId = Guid.Parse("08b42860-09a7-4a1f-aa4f-0290e86df884"), - // ValueMask = "виртуальный комплекс" - //}; - ////await jobService.CreateAsync(job); - ////await jobService.CommitAsync(); - //if (await jobService.CreateAsync(job)) - // if (await jobDetailsService.CreateAsync(jobDetails)) - // if (await fieldFilterService.CreateAsync(fieldFilter)) - // await jobService.CommitAsync(); - //var unit = await unitService.Get().Include(t => t.Parents).Include(t => t.Childs).FirstOrDefaultAsync(t => t.Id == Guid.Parse("01fda0bd-3423-4b12-965b-2947153d1d87")); - - //var parent = unit?.Parents; - //var child = unit?.Childs; - - return Ok(); - } - - - //[HttpGet(ApiRoutes.Test.GetWorkDay)] - //public async Task GetWorkDay([FromRoute] DateTimeOffset date) - //{ - // var result = await esppScheduleTransformService.GetWorkDayAsync(date); - - // return Ok(result); - //} } - public class CaheRequestTest - { - public required string Key { get; set; } - - public required string Value { get; set; } - } } diff --git a/PARR.DAL/Cache/Services/Base/IRedisCacheService.cs b/PARR.DAL/Cache/Services/Base/IRedisCacheService.cs index 881fdf8a..01a48bb8 100644 --- a/PARR.DAL/Cache/Services/Base/IRedisCacheService.cs +++ b/PARR.DAL/Cache/Services/Base/IRedisCacheService.cs @@ -57,5 +57,75 @@ /// /// string GetKey(string[] keyParts, bool isUseHash = false); + + #region Работа с Hash + + /// + /// Изменить одно поле в Hash + /// + /// + /// + /// + /// + /// Если указано, обновится у всего Hash. Если не указано и hash не существовал, создастся Hash с бесокнечным ttl + /// + Task SetHashFieldAsync(string hashKey, string field, T value, TimeSpan? ttl = null); + + /// + /// Получить значение поля из Hash + /// + /// + /// + /// + /// + Task GetHashFieldAsync(string hashKey, string field); + + /// + /// Получить все значения из Hash + /// + /// + /// + /// + Task> GetAllHashFieldsAsync(string hashKey); + + /// + /// Удалить одну запись из Hash + /// + /// + /// + /// + Task DeleteHashFieldAsync(string hashKey, string field); + + /// + /// Есть ли запись в Hash + /// + /// + /// + /// + Task HashFieldExistsAsync(string hashKey, string field); + + /// + /// Удалить весь Hash + /// + /// + /// + Task DeleteHashAsync(string hashKey); + + /// + /// Получить количество записей в Hash + /// + /// + /// + Task GetHashLengthAsync(string hashKey); + + /// + /// Установить TTL для Hash + /// + /// + /// + /// + Task SetHashTtlAsync(string hashKey, TimeSpan ttl); + + #endregion } } diff --git a/PARR.DAL/Cache/Services/Base/RedisCacheService.cs b/PARR.DAL/Cache/Services/Base/RedisCacheService.cs index 38c902be..bb7fa130 100644 --- a/PARR.DAL/Cache/Services/Base/RedisCacheService.cs +++ b/PARR.DAL/Cache/Services/Base/RedisCacheService.cs @@ -1,17 +1,26 @@ using Microsoft.Extensions.Caching.Distributed; +using StackExchange.Redis; using System.Text.Json; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace PARR.DAL.Cache.Services.Base { internal class RedisCacheService : IRedisCacheService { private readonly IDistributedCache cache; + private readonly IDatabase redis; - public RedisCacheService(IDistributedCache cache) + public RedisCacheService( + IDistributedCache cache, + IConnectionMultiplexer connectionMultiplexer + ) { this.cache = cache; + this.redis = connectionMultiplexer.GetDatabase(); } + #region Распределенный кэш IDistributedCache + public async Task GetCachedDataAsync(string key) { var jsonData = await cache.GetStringAsync(key); @@ -69,6 +78,85 @@ namespace PARR.DAL.Cache.Services.Base cache.Remove(key); } + #endregion + + #region Нативные операции Redis, Redis Hash + + public async Task SetHashFieldAsync(string hashKey, string field, T value, TimeSpan? ttl = null) + { + // меняет одно поле в Hash + + var jsonData = JsonSerializer.Serialize(value); + + // true - поля не было, создалось новое. false - поле было, обновили значение + var result = await redis.HashSetAsync(hashKey, field, jsonData); + + // если указан ttl, обновим для всего Hash + // если не указан и ранее был создан hashKey, оставит его ttl; а если hashKey не было, то создаст его БЕССРОЧНЫМ!!! + if (ttl.HasValue) + await SetHashTtlAsync(hashKey, ttl.Value); + } + + public async Task GetHashFieldAsync(string hashKey, string field) + { + // получить значение поля из Hash + var value = await redis.HashGetAsync(hashKey, field); + + if (value.IsNullOrEmpty) + return default; + + return JsonSerializer.Deserialize(value); + } + + public async Task> GetAllHashFieldsAsync(string hashKey) + { + // получить все записи из Hash + var objs = await redis.HashGetAllAsync(hashKey); + + if (objs.Length == 0) + return new Dictionary(); + + var result = objs.ToDictionary( + t => t.Name.ToString(), + t => JsonSerializer.Deserialize(t.Value) + ); + + return result!; + } + + public async Task DeleteHashFieldAsync(string hashKey, string field) + { + // удалить запись из Hash + await redis.HashDeleteAsync(hashKey, field); + } + + public async Task HashFieldExistsAsync(string hashKey, string field) + { + // есть ли запись в Hash + return await redis.HashExistsAsync(hashKey, field); + } + + public async Task DeleteHashAsync(string hashKey) + { + // удалить весь Hash + await redis.KeyDeleteAsync(hashKey); + } + + public async Task GetHashLengthAsync(string hashKey) + { + // кол-во записей в hash + return await redis.HashLengthAsync(hashKey); + } + + public async Task SetHashTtlAsync(string hashKey, TimeSpan ttl) + { + // Установить ttl для Hash + await redis.KeyExpireAsync(hashKey, ttl); + } + + #endregion + + #region Helpers public string GetKey(string[] keyParts, bool isUseHash = false) { @@ -91,5 +179,7 @@ namespace PARR.DAL.Cache.Services.Base return keyStr; } + #endregion + } } diff --git a/PARR.DAL/ParrDalInstaller.cs b/PARR.DAL/ParrDalInstaller.cs index 5a92befb..f858bb7a 100644 --- a/PARR.DAL/ParrDalInstaller.cs +++ b/PARR.DAL/ParrDalInstaller.cs @@ -24,6 +24,7 @@ using PARR.DAL.Services.Interfaces.Job; using PARR.DAL.Services.Interfaces.Schedule; using PARR.DAL.Services.Interfaces.Unit; using PARR.DAL.Settings; +using StackExchange.Redis; namespace PARR.DAL { @@ -45,16 +46,24 @@ namespace PARR.DAL #region Redis + cache services + services.AddSingleton(sp => + { + // IConnectionMultiplexer - для нативных операций Redis + var connectionString = configuration.GetConnectionString("RedisConnection"); + return ConnectionMultiplexer.Connect(connectionString); + }); + services.AddStackExchangeRedisCache(opt => { opt.Configuration = configuration.GetConnectionString("RedisConnection"); }); + var groupedShortcodesCacheSettings = new GroupedShortcodesCacheSettings(); configuration.GetSection(nameof(GroupedShortcodesCacheSettings)).Bind(groupedShortcodesCacheSettings); services.AddSingleton(groupedShortcodesCacheSettings); - services.AddTransient(); + services.AddSingleton(); #endregion From 01c0200c6d6abe4ee3b9c5f5131d49972b2a1e07 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Tue, 17 Mar 2026 16:50:49 +1000 Subject: [PATCH 2/3] =?UTF-8?q?feat(dal):=20=D0=9C=D0=BE=D0=B4=D0=B5=D0=BB?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=20Task?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.DAL/Context/DataContext.cs | 39 +++++++++++++++ PARR.DAL/Context/DataContextSettings.cs | 6 +++ PARR.DAL/Contracts/TaskStatusEnum.cs | 2 + PARR.DAL/Contracts/TaskTaskStatusEnum.cs | 30 ++++++++++++ PARR.DAL/Contracts/TaskTypeEnum.cs | 13 +++++ PARR.DAL/Models/Task/Task.cs | 47 +++++++++++++++++++ PARR.DAL/Models/Task/TaskError.cs | 32 +++++++++++++ PARR.DAL/Models/Task/TaskStatus.cs | 23 +++++++++ PARR.DAL/Models/Task/TaskType.cs | 28 +++++++++++ PARR.DAL/ParrDalInstaller.cs | 9 ++++ .../Implementations/Task/TaskErrorService.cs | 23 +++++++++ .../Implementations/Task/TaskService.cs | 25 ++++++++++ .../Interfaces/Task/ITaskErrorService.cs | 9 ++++ .../Services/Interfaces/Task/ITaskService.cs | 8 ++++ 14 files changed, 294 insertions(+) create mode 100644 PARR.DAL/Contracts/TaskTaskStatusEnum.cs create mode 100644 PARR.DAL/Contracts/TaskTypeEnum.cs create mode 100644 PARR.DAL/Models/Task/Task.cs create mode 100644 PARR.DAL/Models/Task/TaskError.cs create mode 100644 PARR.DAL/Models/Task/TaskStatus.cs create mode 100644 PARR.DAL/Models/Task/TaskType.cs create mode 100644 PARR.DAL/Services/Implementations/Task/TaskErrorService.cs create mode 100644 PARR.DAL/Services/Implementations/Task/TaskService.cs create mode 100644 PARR.DAL/Services/Interfaces/Task/ITaskErrorService.cs create mode 100644 PARR.DAL/Services/Interfaces/Task/ITaskService.cs diff --git a/PARR.DAL/Context/DataContext.cs b/PARR.DAL/Context/DataContext.cs index 6c7f2621..1a64080d 100644 --- a/PARR.DAL/Context/DataContext.cs +++ b/PARR.DAL/Context/DataContext.cs @@ -6,6 +6,7 @@ using PARR.DAL.Extensions; using PARR.DAL.Models; using PARR.DAL.Models.Job; using PARR.DAL.Models.Schedule; +using PARR.DAL.Models.Task; using PARR.DAL.Models.Unit; namespace PARR.DAL.Context @@ -117,6 +118,15 @@ namespace PARR.DAL.Context #endregion + #region Tasks + + public DbSet Tasks { get; set; } + public DbSet TaskStatus { get; set; } + public DbSet TaskTypes { get; set; } + public DbSet TaskErrors { get; set; } + + #endregion + protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -555,6 +565,35 @@ namespace PARR.DAL.Context #endregion + + #region TaskType + + modelBuilder.Entity(f => + { + f.HasData(new TaskType[] + { + new() { Code = TaskTypeEnum.Workload, Name = TaskTypeEnum.Workload.ToString(), Description = "Формирование данных для отчетности - Загруженность", MaxRetries = 2 } + } + ); + }); + + #endregion + + #region TaskStatus + + modelBuilder.Entity(f => + { + f.HasData(new PARR.DAL.Models.Task.TaskStatus[] + { + new(){Code=TaskTaskStatusEnum.Wait, Name=TaskTaskStatusEnum.Wait.ToString(), Description="Ожидание"}, + new(){Code=TaskTaskStatusEnum.Processing, Name=TaskTaskStatusEnum.Processing.ToString(), Description="В работе"}, + new(){Code=TaskTaskStatusEnum.Success, Name=TaskTaskStatusEnum.Success.ToString(), Description="Выполнено успешно"}, + new(){Code=TaskTaskStatusEnum.Error, Name=TaskTaskStatusEnum.Error.ToString(), Description="Ошибка"} + }); + }); + + #endregion + } //protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) diff --git a/PARR.DAL/Context/DataContextSettings.cs b/PARR.DAL/Context/DataContextSettings.cs index e0539407..19424f2b 100644 --- a/PARR.DAL/Context/DataContextSettings.cs +++ b/PARR.DAL/Context/DataContextSettings.cs @@ -18,5 +18,11 @@ /// Расписание регламентных работ /// public const string Schedule = "schedule"; + + + /// + /// Управление очередями + /// + public const string Task = "task"; } } diff --git a/PARR.DAL/Contracts/TaskStatusEnum.cs b/PARR.DAL/Contracts/TaskStatusEnum.cs index d33eea7b..cb364f4a 100644 --- a/PARR.DAL/Contracts/TaskStatusEnum.cs +++ b/PARR.DAL/Contracts/TaskStatusEnum.cs @@ -1,5 +1,7 @@ namespace PARR.DAL.Contracts { + //TODO: Надо это переименовать в RobotTaskStatusEnum + /// /// Статус задания на синхронизацию /// diff --git a/PARR.DAL/Contracts/TaskTaskStatusEnum.cs b/PARR.DAL/Contracts/TaskTaskStatusEnum.cs new file mode 100644 index 00000000..7377435a --- /dev/null +++ b/PARR.DAL/Contracts/TaskTaskStatusEnum.cs @@ -0,0 +1,30 @@ +namespace PARR.DAL.Contracts +{ + // TODO: Сначала надо переименовать TaskStatusEnum -> RobotTaskStatusEnum, а потом TaskTaskStatusEnum -> TaskStatusEnum + + /// + /// Статус задач Task + /// + public enum TaskTaskStatusEnum + { + /// + /// Ожидание + /// + Wait=10, + + /// + /// В работе + /// + Processing = 20, + + /// + /// Выполнено успешно + /// + Success = 30, + + /// + /// Ошибка + /// + Error = 40 + } +} diff --git a/PARR.DAL/Contracts/TaskTypeEnum.cs b/PARR.DAL/Contracts/TaskTypeEnum.cs new file mode 100644 index 00000000..2f163d1b --- /dev/null +++ b/PARR.DAL/Contracts/TaskTypeEnum.cs @@ -0,0 +1,13 @@ +namespace PARR.DAL.Contracts +{ + /// + /// Типы заданий + /// + public enum TaskTypeEnum + { + /// + /// Загруженность + /// + Workload = 0, + } +} diff --git a/PARR.DAL/Models/Task/Task.cs b/PARR.DAL/Models/Task/Task.cs new file mode 100644 index 00000000..9ca5a78c --- /dev/null +++ b/PARR.DAL/Models/Task/Task.cs @@ -0,0 +1,47 @@ +using Microsoft.EntityFrameworkCore; +using PARR.DAL.Context; +using PARR.DAL.Contracts; +using PARR.DAL.Models.Base; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace PARR.DAL.Models.Task +{ + [Table("Tasks", Schema = DataContextSettings.Task)] + [Comment("Таблица заданий")] + public class Task : IBase + { + [Key] + public Guid Id { get; set; } + + public DateTimeOffset DateCreated { get; set; } + + public DateTimeOffset? DateModified { get; set; } + + public TaskTypeEnum TypeCode { get; set; } + + public TaskTaskStatusEnum StatusCode { get; set; } + + public string? Payload { get; set; } + + /// + /// Кол-во попыток + /// + public int RetryCount { get; set; } + + /// + /// Дата завершения (устанавливается или когда Успех или когда Ошибка) + /// + public DateTimeOffset? ProcessedAt { get; set; } + + + + [ForeignKey(nameof(TypeCode))] + public TaskType? TaskType { get; set; } + + [ForeignKey(nameof(StatusCode))] + public TaskStatus? TaskStatus { get; set; } + + public ICollection TaskErrors { get; set; } = new HashSet(); + } +} diff --git a/PARR.DAL/Models/Task/TaskError.cs b/PARR.DAL/Models/Task/TaskError.cs new file mode 100644 index 00000000..51709574 --- /dev/null +++ b/PARR.DAL/Models/Task/TaskError.cs @@ -0,0 +1,32 @@ +using Microsoft.EntityFrameworkCore; +using PARR.DAL.Context; +using PARR.DAL.Models.Base; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace PARR.DAL.Models.Task +{ + [Table("Errors", Schema = DataContextSettings.Task)] + [Comment("Таблица ошибок заданий")] + public class TaskError : IBase + { + [Key] + public Guid Id { get; set; } + + public DateTimeOffset DateCreated { get; set; } + + [NotMapped] + public DateTimeOffset? DateModified { get; set; } + + public Guid TaskId { get; set; } + + public int AttemptNumber { get; set; } + + public required string ErrorMessage { get; set; } + + public string? StackTrace { get; set; } + + [ForeignKey(nameof(TaskId))] + public Task? Task { get; set; } + } +} diff --git a/PARR.DAL/Models/Task/TaskStatus.cs b/PARR.DAL/Models/Task/TaskStatus.cs new file mode 100644 index 00000000..4879bf7b --- /dev/null +++ b/PARR.DAL/Models/Task/TaskStatus.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore; +using PARR.DAL.Context; +using PARR.DAL.Contracts; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace PARR.DAL.Models.Task +{ + [Table("Statuses", Schema = DataContextSettings.Task)] + [Comment("Таблица статусов заданий")] + public class TaskStatus + { + [Key] + public TaskTaskStatusEnum Code { get; set; } + + public required string Name { get; set; } + + public required string Description { get; set; } + + + public ICollection Tasks { get; set; } = new HashSet(); + } +} diff --git a/PARR.DAL/Models/Task/TaskType.cs b/PARR.DAL/Models/Task/TaskType.cs new file mode 100644 index 00000000..fc61b5a6 --- /dev/null +++ b/PARR.DAL/Models/Task/TaskType.cs @@ -0,0 +1,28 @@ +using Microsoft.EntityFrameworkCore; +using PARR.DAL.Context; +using PARR.DAL.Contracts; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace PARR.DAL.Models.Task +{ + [Table("Types", Schema = DataContextSettings.Task)] + [Comment("Таблица типов заданий")] + public class TaskType + { + [Key] + public TaskTypeEnum Code { get; set; } + + public required string Name { get; set; } + + public required string Description { get; set; } + + /// + /// Максимальное кол-во попыток + /// + public int MaxRetries { get; set; } + + + public ICollection Tasks { get; set; } = new HashSet(); + } +} diff --git a/PARR.DAL/ParrDalInstaller.cs b/PARR.DAL/ParrDalInstaller.cs index f858bb7a..758a30e4 100644 --- a/PARR.DAL/ParrDalInstaller.cs +++ b/PARR.DAL/ParrDalInstaller.cs @@ -18,10 +18,12 @@ using PARR.DAL.Services.Implementation; using PARR.DAL.Services.Implementations; using PARR.DAL.Services.Implementations.Job; using PARR.DAL.Services.Implementations.Schedule; +using PARR.DAL.Services.Implementations.Task; using PARR.DAL.Services.Implementations.Unit; using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces.Job; using PARR.DAL.Services.Interfaces.Schedule; +using PARR.DAL.Services.Interfaces.Task; using PARR.DAL.Services.Interfaces.Unit; using PARR.DAL.Settings; using StackExchange.Redis; @@ -144,6 +146,13 @@ namespace PARR.DAL #endregion + #region Task + + services.AddTransient(); + services.AddTransient(); + + #endregion + //services.AddTransient(); #region NextRun Services diff --git a/PARR.DAL/Services/Implementations/Task/TaskErrorService.cs b/PARR.DAL/Services/Implementations/Task/TaskErrorService.cs new file mode 100644 index 00000000..5fe91e66 --- /dev/null +++ b/PARR.DAL/Services/Implementations/Task/TaskErrorService.cs @@ -0,0 +1,23 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using PARR.DAL.Context; +using PARR.DAL.Models.Task; +using PARR.DAL.Services.Abstracts; +using PARR.DAL.Services.Interfaces.Task; + +namespace PARR.DAL.Services.Implementations.Task +{ + internal class TaskErrorService : BaseService, ITaskErrorService + { + private readonly DataContext dataContext; + + protected override DbSet EntitySet => dataContext.TaskErrors; + + protected override DataContext EntitiContext => dataContext; + + public TaskErrorService(DataContext dataContext, ILogger logger): base(logger) + { + this.dataContext = dataContext; + } + } +} diff --git a/PARR.DAL/Services/Implementations/Task/TaskService.cs b/PARR.DAL/Services/Implementations/Task/TaskService.cs new file mode 100644 index 00000000..adf0ef2d --- /dev/null +++ b/PARR.DAL/Services/Implementations/Task/TaskService.cs @@ -0,0 +1,25 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using PARR.DAL.Context; +using PARR.DAL.Services.Abstracts; +using PARR.DAL.Services.Interfaces.Task; + +namespace PARR.DAL.Services.Implementations.Task +{ + internal class TaskService : BaseService, ITaskService + { + private readonly DataContext dataContext; + + protected override DbSet EntitySet => dataContext.Tasks; + + protected override DataContext EntitiContext => dataContext; + + public TaskService(DataContext dataContext, ILogger logger) : base(logger) + { + this.dataContext = dataContext; + } + + + // метод атомарного взятия в работу + } +} diff --git a/PARR.DAL/Services/Interfaces/Task/ITaskErrorService.cs b/PARR.DAL/Services/Interfaces/Task/ITaskErrorService.cs new file mode 100644 index 00000000..46345ad4 --- /dev/null +++ b/PARR.DAL/Services/Interfaces/Task/ITaskErrorService.cs @@ -0,0 +1,9 @@ +using PARR.DAL.Models.Task; +using PARR.DAL.Services.Interfaces.Base; + +namespace PARR.DAL.Services.Interfaces.Task +{ + public interface ITaskErrorService : IBaseService + { + } +} diff --git a/PARR.DAL/Services/Interfaces/Task/ITaskService.cs b/PARR.DAL/Services/Interfaces/Task/ITaskService.cs new file mode 100644 index 00000000..dc2878ed --- /dev/null +++ b/PARR.DAL/Services/Interfaces/Task/ITaskService.cs @@ -0,0 +1,8 @@ +using PARR.DAL.Services.Interfaces.Base; + +namespace PARR.DAL.Services.Interfaces.Task +{ + public interface ITaskService : IBaseService + { + } +} From 92ab9ea6c284d257fd155448899a72a50350dcd4 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Thu, 19 Mar 2026 16:52:41 +1000 Subject: [PATCH 3/3] =?UTF-8?q?feat(dal):=20Task=20-=20=D0=B4=D0=BE=D1=80?= =?UTF-8?q?=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D0=B0=20=D0=BC=D0=BE=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- PARR.API/Contracts/V1/ApiRoutes.cs | 5 ++ .../V1/Statistics/StatWorkloadController.cs | 34 +++++++++++++ PARR.API/Controllers/V1/TestController.cs | 50 ++++++++++--------- PARR.DAL/Context/DataContext.cs | 20 ++++---- ...askStatusEnum.cs => TaskItemStatusEnum.cs} | 10 ++-- .../Models/{Task => TaskModels}/TaskError.cs | 4 +- .../{Task/Task.cs => TaskModels/TaskItem.cs} | 12 +++-- .../Models/{Task => TaskModels}/TaskStatus.cs | 6 +-- .../Models/{Task => TaskModels}/TaskType.cs | 19 ++++++- PARR.DAL/ParrDalInstaller.cs | 4 +- .../TaskErrorService.cs | 6 +-- .../{Task => TaskServices}/TaskService.cs | 9 ++-- .../Services/Interfaces/Task/ITaskService.cs | 8 --- .../ITaskErrorService.cs | 4 +- .../Interfaces/TaskServices/ITaskService.cs | 9 ++++ 15 files changed, 132 insertions(+), 68 deletions(-) create mode 100644 PARR.API/Controllers/V1/Statistics/StatWorkloadController.cs rename PARR.DAL/Contracts/{TaskTaskStatusEnum.cs => TaskItemStatusEnum.cs} (83%) rename PARR.DAL/Models/{Task => TaskModels}/TaskError.cs (90%) rename PARR.DAL/Models/{Task/Task.cs => TaskModels/TaskItem.cs} (76%) rename PARR.DAL/Models/{Task => TaskModels}/TaskStatus.cs (73%) rename PARR.DAL/Models/{Task => TaskModels}/TaskType.cs (50%) rename PARR.DAL/Services/Implementations/{Task => TaskServices}/TaskErrorService.cs (81%) rename PARR.DAL/Services/Implementations/{Task => TaskServices}/TaskService.cs (64%) delete mode 100644 PARR.DAL/Services/Interfaces/Task/ITaskService.cs rename PARR.DAL/Services/Interfaces/{Task => TaskServices}/ITaskErrorService.cs (58%) create mode 100644 PARR.DAL/Services/Interfaces/TaskServices/ITaskService.cs diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index f2ced40a..594ad678 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -296,6 +296,11 @@ public const string GetByApplicationInWork = BaseStat + "/work-workloads/"; } + public static class Workload + { + public const string Build = BaseStat + "/workload/build"; + } + #endregion #region Наряды diff --git a/PARR.API/Controllers/V1/Statistics/StatWorkloadController.cs b/PARR.API/Controllers/V1/Statistics/StatWorkloadController.cs new file mode 100644 index 00000000..78a0ca3f --- /dev/null +++ b/PARR.API/Controllers/V1/Statistics/StatWorkloadController.cs @@ -0,0 +1,34 @@ +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using PARR.API.Contracts.V1; +using PARR.API.Controllers.V1.Base; +using PARR.Constants; + +namespace PARR.API.Controllers.V1.Statistics +{ + /// + /// Статистика загруженности по ЗО, РГ + /// + [Authorize(Roles = ParrRoles.EsppRobot.RoleOrAdmin)] + public class StatWorkloadController : BaseApiController + { + public StatWorkloadController() + { + + } + + + /// + /// Сформировать отчетность + /// + /// + [HttpPost(ApiRoutes.Workload.Build)] + public async Task Build() + { + + return Ok(); + } + + + } +} diff --git a/PARR.API/Controllers/V1/TestController.cs b/PARR.API/Controllers/V1/TestController.cs index e76fa8c6..ccc11361 100644 --- a/PARR.API/Controllers/V1/TestController.cs +++ b/PARR.API/Controllers/V1/TestController.cs @@ -65,39 +65,41 @@ namespace PARR.API.Controllers.V1 - ///// - ///// Записать в кэш - ///// - ///// - ///// - //[HttpPost(ApiRoutes.Test.CreateCache)] - //public async Task CreateCache() - //{ - // var hashKey = redisCacheService.GetKey(new[] { "test", "mxa" }); - // var ttl = TimeSpan.FromMinutes(10); + /// + /// Записать в кэш + /// + /// + /// + [HttpPost(ApiRoutes.Test.CreateCache)] + public async Task CreateCache() + { + //var val = await redisCacheService.GetCachedDataAsync("96dAoIH/8Q9Bg8VY"); - // await redisCacheService.SetHashFieldAsync(hashKey, "t1", "val1", ttl); - // await redisCacheService.SetHashFieldAsync(hashKey, "t2", "val2"); - // await redisCacheService.SetHashFieldAsync(hashKey, "t3", "val3"); + //var hashKey = redisCacheService.GetKey(new[] { "test", "mxa" }); + //var ttl = TimeSpan.FromMinutes(10); - // var length = await redisCacheService.GetHashLengthAsync(hashKey); + //await redisCacheService.SetHashFieldAsync(hashKey, "t1", "val1", ttl); + //await redisCacheService.SetHashFieldAsync(hashKey, "t2", "val2"); + //await redisCacheService.SetHashFieldAsync(hashKey, "t3", "val3"); - // var get = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); + //var length = await redisCacheService.GetHashLengthAsync(hashKey); - // var getAll = await redisCacheService.GetAllHashFieldsAsync(hashKey); + //var get = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); - // await redisCacheService.DeleteHashFieldAsync(hashKey, "t1"); - // var getT1 = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); + //var getAll = await redisCacheService.GetAllHashFieldsAsync(hashKey); - // var exist = await redisCacheService.HashFieldExistsAsync(hashKey, "t2"); + //await redisCacheService.DeleteHashFieldAsync(hashKey, "t1"); + //var getT1 = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); - // await redisCacheService.DeleteHashAsync(hashKey); - // var getT_1 = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); + //var exist = await redisCacheService.HashFieldExistsAsync(hashKey, "t2"); - // await redisCacheService.SetHashTtlAsync(hashKey, ttl); + //await redisCacheService.DeleteHashAsync(hashKey); + //var getT_1 = await redisCacheService.GetHashFieldAsync(hashKey, "t1"); - // return Ok(); - //} + //await redisCacheService.SetHashTtlAsync(hashKey, ttl); + + return Ok(); + } diff --git a/PARR.DAL/Context/DataContext.cs b/PARR.DAL/Context/DataContext.cs index 1a64080d..71511e92 100644 --- a/PARR.DAL/Context/DataContext.cs +++ b/PARR.DAL/Context/DataContext.cs @@ -6,7 +6,7 @@ using PARR.DAL.Extensions; using PARR.DAL.Models; using PARR.DAL.Models.Job; using PARR.DAL.Models.Schedule; -using PARR.DAL.Models.Task; +using PARR.DAL.Models.TaskModels; using PARR.DAL.Models.Unit; namespace PARR.DAL.Context @@ -120,8 +120,8 @@ namespace PARR.DAL.Context #region Tasks - public DbSet Tasks { get; set; } - public DbSet TaskStatus { get; set; } + public DbSet Tasks { get; set; } + public DbSet TaskStatus { get; set; } public DbSet TaskTypes { get; set; } public DbSet TaskErrors { get; set; } @@ -572,7 +572,7 @@ namespace PARR.DAL.Context { f.HasData(new TaskType[] { - new() { Code = TaskTypeEnum.Workload, Name = TaskTypeEnum.Workload.ToString(), Description = "Формирование данных для отчетности - Загруженность", MaxRetries = 2 } + new() { Code = TaskTypeEnum.Workload, Name = TaskTypeEnum.Workload.ToString(), Description = "Формирование данных для отчетности - Загруженность", MaxRetries = 2, IsSingleton=true, MaxExecutionTimeMinutes=30, RetantionsDays=90 } } ); }); @@ -581,14 +581,14 @@ namespace PARR.DAL.Context #region TaskStatus - modelBuilder.Entity(f => + modelBuilder.Entity(f => { - f.HasData(new PARR.DAL.Models.Task.TaskStatus[] + f.HasData(new PARR.DAL.Models.TaskModels.TaskStatus[] { - new(){Code=TaskTaskStatusEnum.Wait, Name=TaskTaskStatusEnum.Wait.ToString(), Description="Ожидание"}, - new(){Code=TaskTaskStatusEnum.Processing, Name=TaskTaskStatusEnum.Processing.ToString(), Description="В работе"}, - new(){Code=TaskTaskStatusEnum.Success, Name=TaskTaskStatusEnum.Success.ToString(), Description="Выполнено успешно"}, - new(){Code=TaskTaskStatusEnum.Error, Name=TaskTaskStatusEnum.Error.ToString(), Description="Ошибка"} + new(){Code=TaskItemStatusEnum.Pending, Name=TaskItemStatusEnum.Pending.ToString(), Description="Ожидание"}, + new(){Code=TaskItemStatusEnum.Processing, Name=TaskItemStatusEnum.Processing.ToString(), Description="В работе"}, + new(){Code=TaskItemStatusEnum.Success, Name=TaskItemStatusEnum.Success.ToString(), Description="Выполнено успешно"}, + new(){Code=TaskItemStatusEnum.Failed, Name=TaskItemStatusEnum.Failed.ToString(), Description="Ошибка"} }); }); diff --git a/PARR.DAL/Contracts/TaskTaskStatusEnum.cs b/PARR.DAL/Contracts/TaskItemStatusEnum.cs similarity index 83% rename from PARR.DAL/Contracts/TaskTaskStatusEnum.cs rename to PARR.DAL/Contracts/TaskItemStatusEnum.cs index 7377435a..299273d3 100644 --- a/PARR.DAL/Contracts/TaskTaskStatusEnum.cs +++ b/PARR.DAL/Contracts/TaskItemStatusEnum.cs @@ -5,26 +5,26 @@ /// /// Статус задач Task /// - public enum TaskTaskStatusEnum + public enum TaskItemStatusEnum { /// /// Ожидание /// - Wait=10, + Pending=0, /// /// В работе /// - Processing = 20, + Processing = 1, /// /// Выполнено успешно /// - Success = 30, + Success = 2, /// /// Ошибка /// - Error = 40 + Failed = 3 } } diff --git a/PARR.DAL/Models/Task/TaskError.cs b/PARR.DAL/Models/TaskModels/TaskError.cs similarity index 90% rename from PARR.DAL/Models/Task/TaskError.cs rename to PARR.DAL/Models/TaskModels/TaskError.cs index 51709574..59b16d75 100644 --- a/PARR.DAL/Models/Task/TaskError.cs +++ b/PARR.DAL/Models/TaskModels/TaskError.cs @@ -4,7 +4,7 @@ using PARR.DAL.Models.Base; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -namespace PARR.DAL.Models.Task +namespace PARR.DAL.Models.TaskModels { [Table("Errors", Schema = DataContextSettings.Task)] [Comment("Таблица ошибок заданий")] @@ -27,6 +27,6 @@ namespace PARR.DAL.Models.Task public string? StackTrace { get; set; } [ForeignKey(nameof(TaskId))] - public Task? Task { get; set; } + public TaskItem? TaskItem { get; set; } } } diff --git a/PARR.DAL/Models/Task/Task.cs b/PARR.DAL/Models/TaskModels/TaskItem.cs similarity index 76% rename from PARR.DAL/Models/Task/Task.cs rename to PARR.DAL/Models/TaskModels/TaskItem.cs index 9ca5a78c..33a515d7 100644 --- a/PARR.DAL/Models/Task/Task.cs +++ b/PARR.DAL/Models/TaskModels/TaskItem.cs @@ -1,15 +1,17 @@ using Microsoft.EntityFrameworkCore; +using PARR.Common.Domain; +using PARR.Constants; using PARR.DAL.Context; using PARR.DAL.Contracts; using PARR.DAL.Models.Base; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -namespace PARR.DAL.Models.Task +namespace PARR.DAL.Models.TaskModels { [Table("Tasks", Schema = DataContextSettings.Task)] [Comment("Таблица заданий")] - public class Task : IBase + public class TaskItem : IBase, IHistoryInitiator { [Key] public Guid Id { get; set; } @@ -20,7 +22,7 @@ namespace PARR.DAL.Models.Task public TaskTypeEnum TypeCode { get; set; } - public TaskTaskStatusEnum StatusCode { get; set; } + public TaskItemStatusEnum StatusCode { get; set; } public string? Payload { get; set; } @@ -35,6 +37,10 @@ namespace PARR.DAL.Models.Task public DateTimeOffset? ProcessedAt { get; set; } + public string? InitiatorIp { get; set; } + public ParrComponentsEnum? InitiatorParrComponentId { get; set; } + public string? InitiatorComment { get; set; } + [ForeignKey(nameof(TypeCode))] public TaskType? TaskType { get; set; } diff --git a/PARR.DAL/Models/Task/TaskStatus.cs b/PARR.DAL/Models/TaskModels/TaskStatus.cs similarity index 73% rename from PARR.DAL/Models/Task/TaskStatus.cs rename to PARR.DAL/Models/TaskModels/TaskStatus.cs index 4879bf7b..6bd1d6a0 100644 --- a/PARR.DAL/Models/Task/TaskStatus.cs +++ b/PARR.DAL/Models/TaskModels/TaskStatus.cs @@ -4,20 +4,20 @@ using PARR.DAL.Contracts; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -namespace PARR.DAL.Models.Task +namespace PARR.DAL.Models.TaskModels { [Table("Statuses", Schema = DataContextSettings.Task)] [Comment("Таблица статусов заданий")] public class TaskStatus { [Key] - public TaskTaskStatusEnum Code { get; set; } + public TaskItemStatusEnum Code { get; set; } public required string Name { get; set; } public required string Description { get; set; } - public ICollection Tasks { get; set; } = new HashSet(); + public ICollection Tasks { get; set; } = new HashSet(); } } diff --git a/PARR.DAL/Models/Task/TaskType.cs b/PARR.DAL/Models/TaskModels/TaskType.cs similarity index 50% rename from PARR.DAL/Models/Task/TaskType.cs rename to PARR.DAL/Models/TaskModels/TaskType.cs index fc61b5a6..7a520de8 100644 --- a/PARR.DAL/Models/Task/TaskType.cs +++ b/PARR.DAL/Models/TaskModels/TaskType.cs @@ -4,7 +4,7 @@ using PARR.DAL.Contracts; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -namespace PARR.DAL.Models.Task +namespace PARR.DAL.Models.TaskModels { [Table("Types", Schema = DataContextSettings.Task)] [Comment("Таблица типов заданий")] @@ -22,7 +22,22 @@ namespace PARR.DAL.Models.Task /// public int MaxRetries { get; set; } + /// + /// Максимальное время выполнения + /// + public int MaxExecutionTimeMinutes { get; set; } - public ICollection Tasks { get; set; } = new HashSet(); + /// + /// Одновременно может быть только одна задача или несколько + /// + public bool IsSingleton { get; set; } + + /// + /// Сколько дней хранить в БД + /// + public int RetentionDays { get; set; } + + + public ICollection Tasks { get; set; } = new HashSet(); } } diff --git a/PARR.DAL/ParrDalInstaller.cs b/PARR.DAL/ParrDalInstaller.cs index 758a30e4..10b69f40 100644 --- a/PARR.DAL/ParrDalInstaller.cs +++ b/PARR.DAL/ParrDalInstaller.cs @@ -18,12 +18,12 @@ using PARR.DAL.Services.Implementation; using PARR.DAL.Services.Implementations; using PARR.DAL.Services.Implementations.Job; using PARR.DAL.Services.Implementations.Schedule; -using PARR.DAL.Services.Implementations.Task; +using PARR.DAL.Services.Implementations.TaskServices; using PARR.DAL.Services.Implementations.Unit; using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces.Job; using PARR.DAL.Services.Interfaces.Schedule; -using PARR.DAL.Services.Interfaces.Task; +using PARR.DAL.Services.Interfaces.TaskServices; using PARR.DAL.Services.Interfaces.Unit; using PARR.DAL.Settings; using StackExchange.Redis; diff --git a/PARR.DAL/Services/Implementations/Task/TaskErrorService.cs b/PARR.DAL/Services/Implementations/TaskServices/TaskErrorService.cs similarity index 81% rename from PARR.DAL/Services/Implementations/Task/TaskErrorService.cs rename to PARR.DAL/Services/Implementations/TaskServices/TaskErrorService.cs index 5fe91e66..a29a02a1 100644 --- a/PARR.DAL/Services/Implementations/Task/TaskErrorService.cs +++ b/PARR.DAL/Services/Implementations/TaskServices/TaskErrorService.cs @@ -1,11 +1,11 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.DAL.Context; -using PARR.DAL.Models.Task; +using PARR.DAL.Models.TaskModels; using PARR.DAL.Services.Abstracts; -using PARR.DAL.Services.Interfaces.Task; +using PARR.DAL.Services.Interfaces.TaskServices; -namespace PARR.DAL.Services.Implementations.Task +namespace PARR.DAL.Services.Implementations.TaskServices { internal class TaskErrorService : BaseService, ITaskErrorService { diff --git a/PARR.DAL/Services/Implementations/Task/TaskService.cs b/PARR.DAL/Services/Implementations/TaskServices/TaskService.cs similarity index 64% rename from PARR.DAL/Services/Implementations/Task/TaskService.cs rename to PARR.DAL/Services/Implementations/TaskServices/TaskService.cs index adf0ef2d..98f67f71 100644 --- a/PARR.DAL/Services/Implementations/Task/TaskService.cs +++ b/PARR.DAL/Services/Implementations/TaskServices/TaskService.cs @@ -1,16 +1,17 @@ using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.DAL.Context; +using PARR.DAL.Models.TaskModels; using PARR.DAL.Services.Abstracts; -using PARR.DAL.Services.Interfaces.Task; +using PARR.DAL.Services.Interfaces.TaskServices; -namespace PARR.DAL.Services.Implementations.Task +namespace PARR.DAL.Services.Implementations.TaskServices { - internal class TaskService : BaseService, ITaskService + internal class TaskService : BaseService, ITaskService { private readonly DataContext dataContext; - protected override DbSet EntitySet => dataContext.Tasks; + protected override DbSet EntitySet => dataContext.Tasks; protected override DataContext EntitiContext => dataContext; diff --git a/PARR.DAL/Services/Interfaces/Task/ITaskService.cs b/PARR.DAL/Services/Interfaces/Task/ITaskService.cs deleted file mode 100644 index dc2878ed..00000000 --- a/PARR.DAL/Services/Interfaces/Task/ITaskService.cs +++ /dev/null @@ -1,8 +0,0 @@ -using PARR.DAL.Services.Interfaces.Base; - -namespace PARR.DAL.Services.Interfaces.Task -{ - public interface ITaskService : IBaseService - { - } -} diff --git a/PARR.DAL/Services/Interfaces/Task/ITaskErrorService.cs b/PARR.DAL/Services/Interfaces/TaskServices/ITaskErrorService.cs similarity index 58% rename from PARR.DAL/Services/Interfaces/Task/ITaskErrorService.cs rename to PARR.DAL/Services/Interfaces/TaskServices/ITaskErrorService.cs index 46345ad4..4ded533c 100644 --- a/PARR.DAL/Services/Interfaces/Task/ITaskErrorService.cs +++ b/PARR.DAL/Services/Interfaces/TaskServices/ITaskErrorService.cs @@ -1,7 +1,7 @@ -using PARR.DAL.Models.Task; +using PARR.DAL.Models.TaskModels; using PARR.DAL.Services.Interfaces.Base; -namespace PARR.DAL.Services.Interfaces.Task +namespace PARR.DAL.Services.Interfaces.TaskServices { public interface ITaskErrorService : IBaseService { diff --git a/PARR.DAL/Services/Interfaces/TaskServices/ITaskService.cs b/PARR.DAL/Services/Interfaces/TaskServices/ITaskService.cs new file mode 100644 index 00000000..aa22eb81 --- /dev/null +++ b/PARR.DAL/Services/Interfaces/TaskServices/ITaskService.cs @@ -0,0 +1,9 @@ +using PARR.DAL.Models.TaskModels; +using PARR.DAL.Services.Interfaces.Base; + +namespace PARR.DAL.Services.Interfaces.TaskServices +{ + public interface ITaskService : IBaseService + { + } +}