From 99a491ede81a917899f5995bb08bd9ade1f7a64a Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Fri, 16 Jan 2026 11:04:26 +1000 Subject: [PATCH] =?UTF-8?q?feat(dal,api):=20IMatchingStatusService=20-=20?= =?UTF-8?q?=D1=83=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=B0=D0=BC=D0=B8=20matche?= =?UTF-8?q?r`a.=20=D0=9E=D1=82=D0=BE=D0=B1=D1=80=D0=B0=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=D0=BE=D0=B2?= =?UTF-8?q?=20=D0=B2=20=D0=90=D0=9F=D0=98,=20=D0=BD=D0=B5=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D1=8F=20=D0=BF=D0=BE=D0=B2=D1=82=D0=BE=D1=80=D0=BD=D0=BE?= =?UTF-8?q?=20=D0=B8=D0=B7=20=D0=B0=D0=BF=D0=B8=20=D0=BE=D1=82=D0=BF=D1=80?= =?UTF-8?q?=D0=B0=D0=B2=D0=B8=D1=82=D1=8C=20=D0=B7=D0=B0=D0=B4=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=BC=D1=8D=D1=82=D1=87=D0=B5=D1=80=D1=83=20?= =?UTF-8?q?=D0=B5=D1=81=D0=BB=D0=B8=20=D1=81=D0=B5=D0=B9=D1=87=D0=B0=D1=81?= =?UTF-8?q?=20=D0=B8=D0=B4=D0=B5=D1=82=20matching?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../V1/Responses/JobGroupResponse.cs | 3 + .../Contracts/V1/Responses/JobResponse.cs | 2 + .../V1/Responses/MatchingStatusResponse.cs | 32 +++++ PARR.API/Controllers/V1/JobController.cs | 27 +++- PARR.API/Controllers/V1/JobGroupController.cs | 23 +++- PARR.API/Controllers/V1/SyncTaskController.cs | 15 ++- .../DomainToResponseProfile.cs | 8 ++ ...atchingStatus.cs => MatchingStatusItem.cs} | 6 +- .../Services/CacheMatchingStatusService.cs | 63 --------- .../Services/ICacheMatchingStatusService.cs | 18 --- PARR.DAL/DomainModels/MatchingStatus.cs | 36 ++++++ .../Implementations/MatchingStatusService.cs | 120 ++++++++++++++++++ .../Interfaces/IMatchingStatusService.cs | 38 ++++++ PARR.DAL/ParrDalInstaller.cs | 3 +- 14 files changed, 303 insertions(+), 91 deletions(-) create mode 100644 PARR.API/Contracts/V1/Responses/MatchingStatusResponse.cs rename PARR.DAL/Cache/Models/{MatchingStatus.cs => MatchingStatusItem.cs} (73%) delete mode 100644 PARR.DAL/Cache/Services/CacheMatchingStatusService.cs delete mode 100644 PARR.DAL/Cache/Services/ICacheMatchingStatusService.cs create mode 100644 PARR.DAL/DomainModels/MatchingStatus.cs create mode 100644 PARR.DAL/DomainServices/Implementations/MatchingStatusService.cs create mode 100644 PARR.DAL/DomainServices/Interfaces/IMatchingStatusService.cs diff --git a/PARR.API/Contracts/V1/Responses/JobGroupResponse.cs b/PARR.API/Contracts/V1/Responses/JobGroupResponse.cs index 526b1050..5965b33b 100644 --- a/PARR.API/Contracts/V1/Responses/JobGroupResponse.cs +++ b/PARR.API/Contracts/V1/Responses/JobGroupResponse.cs @@ -40,8 +40,11 @@ { //public List? Jobs { get; set; } public int JobsCount { get; set; } + public JobGroupScheduleResponse? Schedule { get; set; } + public MatchingStatusResponse? MatchingStatus { get; set; } + /// /// Расписание /// diff --git a/PARR.API/Contracts/V1/Responses/JobResponse.cs b/PARR.API/Contracts/V1/Responses/JobResponse.cs index f79491aa..d5d1a32e 100644 --- a/PARR.API/Contracts/V1/Responses/JobResponse.cs +++ b/PARR.API/Contracts/V1/Responses/JobResponse.cs @@ -34,6 +34,8 @@ public JobAutoControlResponse? AutoControl { get; set; } + public MatchingStatusResponse? MatchingStatus { get; set; } + #region Статистика Old //public TemplateStats? TemplateStatistics { get; set; } diff --git a/PARR.API/Contracts/V1/Responses/MatchingStatusResponse.cs b/PARR.API/Contracts/V1/Responses/MatchingStatusResponse.cs new file mode 100644 index 00000000..016bc5ff --- /dev/null +++ b/PARR.API/Contracts/V1/Responses/MatchingStatusResponse.cs @@ -0,0 +1,32 @@ +using PARR.DAL.Cache.Models; + +namespace PARR.API.Contracts.V1.Responses +{ + public class MatchingStatusResponse + { + /// + /// В целом по искомому объекту, идет ли matching + /// + public bool IsMatchingObject { get; set; } + + /// + /// Идет ли мэтчинг по Jobs + /// + public bool IsMatchingJobs { get; set; } + + /// + /// Идет ли мэтчинг по JobGroups + /// + public bool IsMatchingJobGroups { get; set; } + + /// + /// Детально по Jobs + /// + public List? DetailsJobs { get; set; } + + /// + /// Детально по JobGroups + /// + public List? DetailsJobGroups { get; set; } + } +} diff --git a/PARR.API/Controllers/V1/JobController.cs b/PARR.API/Controllers/V1/JobController.cs index 3c9605f8..5aec320a 100644 --- a/PARR.API/Controllers/V1/JobController.cs +++ b/PARR.API/Controllers/V1/JobController.cs @@ -16,6 +16,7 @@ using PARR.BLL.Domain.Mq; using PARR.BLL.Services.Interfaces; using PARR.Common.Domain; using PARR.Constants; +using PARR.DAL.Cache.Services; using PARR.DAL.Contracts; using PARR.DAL.DomainModels; using PARR.DAL.DomainServices.Interfaces; @@ -24,7 +25,6 @@ using PARR.DAL.Models.Job; using PARR.DAL.Services.Interfaces; using PARR.DAL.Services.Interfaces.Job; using PARR.DAL.Services.Interfaces.Unit; -using System.Net; using System.Text.Json; namespace PARR.API.Controllers.V1 @@ -45,6 +45,7 @@ namespace PARR.API.Controllers.V1 private readonly MqSettings mqSettings; private readonly IClientService clientService; private readonly IJobAutoControlService jobAutoControlService; + private readonly IMatchingStatusService matchingStatusService; public JobController( ILogger logger, @@ -59,7 +60,8 @@ namespace PARR.API.Controllers.V1 IMqService mqService, MqSettings mqSettings, IClientService clientService, - IJobAutoControlService jobAutoControlService + IJobAutoControlService jobAutoControlService, + IMatchingStatusService matchingStatusService ) { this.logger = logger; @@ -72,6 +74,7 @@ namespace PARR.API.Controllers.V1 this.mqSettings = mqSettings; this.clientService = clientService; this.jobAutoControlService = jobAutoControlService; + this.matchingStatusService = matchingStatusService; } /// @@ -124,6 +127,11 @@ namespace PARR.API.Controllers.V1 { //jobResponse.TemplatesCount = await templateService.Get().CountAsync(t => t.JobId == jobResponse.Id); jobResponse.TemplatesCount = await GetCountTemplatesAsync(jobResponse.Id); + + if (filter.IsFull) + { + jobResponse.MatchingStatus = await GetMatchingStatusAsync(jobResponse.Id); + } } var paginationResponse = new PagedResponse(response, true).GetPaginatedProps(paginationFilter, query); @@ -159,6 +167,7 @@ namespace PARR.API.Controllers.V1 var response = mapper.Map(job); response.TemplatesCount = await GetCountTemplatesAsync(id); //await templateService.Get().CountAsync(t => t.JobId == id); + response.MatchingStatus = await GetMatchingStatusAsync(id); //var statistics = await GetStatisticsAsync(response.Id); //BindStatistics(response, statistics); @@ -234,6 +243,7 @@ namespace PARR.API.Controllers.V1 var response = mapper.Map(createdJob); // так как мы только что создали Job, то у него нет шаблонов, смело ставим = 0 (ускоряем запрос) response.TemplatesCount = 0; + response.MatchingStatus = await GetMatchingStatusAsync(response.Id); return Created(locationUri, new Response(response, true)); } @@ -355,6 +365,7 @@ namespace PARR.API.Controllers.V1 var response = mapper.Map(updatedJob); response.TemplatesCount = await GetCountTemplatesAsync(id); //await templateService.Get().CountAsync(t => t.JobId == id); + response.MatchingStatus = await GetMatchingStatusAsync(id); //не используется //var statistics = await GetStatisticsAsync(response.Id); @@ -657,6 +668,18 @@ namespace PARR.API.Controllers.V1 return await templateService.Get().CountAsync(t => t.JobId == jobId && t.StatusTypeId == TemplateStatusTypeEnum.Used); } + /// + /// Получить статус matching`a + /// + /// + /// + private async Task GetMatchingStatusAsync(Guid jobId) + { + var statusMatching = await matchingStatusService.GetStatusAsync(jobId, SyncTaskEntityTypeEnum.Job); + + return mapper.Map(statusMatching); + } + } diff --git a/PARR.API/Controllers/V1/JobGroupController.cs b/PARR.API/Controllers/V1/JobGroupController.cs index 7de49f98..09a4441a 100644 --- a/PARR.API/Controllers/V1/JobGroupController.cs +++ b/PARR.API/Controllers/V1/JobGroupController.cs @@ -14,6 +14,7 @@ using PARR.API.Services.Interfaces; using PARR.Constants; using PARR.DAL.Contracts; using PARR.DAL.DomainModels; +using PARR.DAL.DomainServices.Interfaces; using PARR.DAL.Models; using PARR.DAL.Models.Job; using PARR.DAL.Services.Interfaces; @@ -36,6 +37,7 @@ namespace PARR.API.Controllers.V1 private readonly IValidator validator; private readonly IJobGroupTypeService jobGroupTypeService; private readonly SettingsFromDb settingsFromDb; + private readonly IMatchingStatusService matchingStatusService; public JobGroupController( ILogger logger, @@ -46,7 +48,8 @@ namespace PARR.API.Controllers.V1 IEsppSchTypeConfigService esppConfigService, IValidator validator, IJobGroupTypeService jobGroupTypeService, - SettingsFromDb settingsFromDb + SettingsFromDb settingsFromDb, + IMatchingStatusService matchingStatusService ) { this.logger = logger; @@ -58,6 +61,7 @@ namespace PARR.API.Controllers.V1 this.validator = validator; this.jobGroupTypeService = jobGroupTypeService; this.settingsFromDb = settingsFromDb; + this.matchingStatusService = matchingStatusService; } @@ -366,7 +370,7 @@ namespace PARR.API.Controllers.V1 /// - /// Заполнить поля планировщика + /// Заполнить обязательные поля /// /// /// @@ -390,6 +394,8 @@ namespace PARR.API.Controllers.V1 jobGroupResponse.Schedule = scheduleResponse; jobGroupResponse.JobsCount = await jobService.Get().CountAsync(t => t.GroupId == jobGroupResponse.Id); + + jobGroupResponse.MatchingStatus = await GetMatchingStatusAsync(jobGroupResponse.Id); } @@ -419,5 +425,18 @@ namespace PARR.API.Controllers.V1 return null; } } + + + /// + /// Получить статус matching`a + /// + /// + /// + private async Task GetMatchingStatusAsync(Guid jobGroupId) + { + var statusMatching = await matchingStatusService.GetStatusAsync(jobGroupId, SyncTaskEntityTypeEnum.JobGroup); + + return mapper.Map(statusMatching); + } } } diff --git a/PARR.API/Controllers/V1/SyncTaskController.cs b/PARR.API/Controllers/V1/SyncTaskController.cs index f5718a63..30ad6f34 100644 --- a/PARR.API/Controllers/V1/SyncTaskController.cs +++ b/PARR.API/Controllers/V1/SyncTaskController.cs @@ -9,6 +9,8 @@ using PARR.BLL.Domain.Mq; using PARR.BLL.Services.Interfaces; using PARR.Common.Domain; using PARR.Constants; +using PARR.DAL.Cache.Services; +using PARR.DAL.DomainServices.Interfaces; using System.Text.Json; namespace PARR.API.Controllers.V1 @@ -20,13 +22,15 @@ namespace PARR.API.Controllers.V1 private readonly IUriService uriService; private readonly MqSettings mqSettings; private readonly IClientService clientService; + private readonly IMatchingStatusService matchingStatusService; public SyncTaskController( ILogger logger, IMqService mqService, IUriService uriService, MqSettings mqSettings, - IClientService clientService + IClientService clientService, + IMatchingStatusService matchingStatusService ) { this.logger = logger; @@ -34,6 +38,7 @@ namespace PARR.API.Controllers.V1 this.uriService = uriService; this.mqSettings = mqSettings; this.clientService = clientService; + this.matchingStatusService = matchingStatusService; } /// @@ -45,6 +50,14 @@ namespace PARR.API.Controllers.V1 //todo: Валидатор! Валидатор то забыли!!! + // проверяем, если уже идет синхронизация по этому объекту, то ахтунг, ошибка + var matchingStatus = await matchingStatusService.GetStatusAsync(request.ObjectId, request.EntityType); + if (matchingStatus.IsMatchingObject) + { + logger.LogWarning("Прекращена попытка повторного формирования задания для matcher. objectId: {objectId}, entityType: {entityType}, action: {action}", request.ObjectId, request.EntityType, request.Action); + return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Уже выполняется задание синхронизации этого объекта" } })); + } + //24b3529a-dd43-444a-b10e-ac54fefd046a var matchTemplateTask = new TemplateMatcherMq { diff --git a/PARR.API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs index 714cda43..9286450b 100644 --- a/PARR.API/MappingProfiles/DomainToResponseProfile.cs +++ b/PARR.API/MappingProfiles/DomainToResponseProfile.cs @@ -437,6 +437,14 @@ namespace PARR.API.MappingProfiles #endregion CreateMap(); + + #region MatchingStatus -> MatchingStatusResponse + + CreateMap() + .ForMember(d => d.DetailsJobGroups, o => o.MapFrom(s => s.DetailsJobGroups != null ? s.DetailsJobGroups.Select(t => t.Data) : null)) + .ForMember(d => d.DetailsJobs, o => o.MapFrom(s => s.DetailsJobs != null ? s.DetailsJobs.Select(t => t.Data) : null)); + + #endregion } } diff --git a/PARR.DAL/Cache/Models/MatchingStatus.cs b/PARR.DAL/Cache/Models/MatchingStatusItem.cs similarity index 73% rename from PARR.DAL/Cache/Models/MatchingStatus.cs rename to PARR.DAL/Cache/Models/MatchingStatusItem.cs index 83d59f48..6b630d0c 100644 --- a/PARR.DAL/Cache/Models/MatchingStatus.cs +++ b/PARR.DAL/Cache/Models/MatchingStatusItem.cs @@ -6,9 +6,9 @@ namespace PARR.DAL.Cache.Models /// /// КЭШ модель, состояние matching`a /// - public class MatchingStatus : IBaseCache + public class MatchingStatusItem : IBaseCache { - public required MatchingStatusDto Data { get; set; } + public required MatchingStatusItemDto Data { get; set; } public DateTimeOffset Timestamp { get; set; } @@ -16,7 +16,7 @@ namespace PARR.DAL.Cache.Models } - public class MatchingStatusDto + public class MatchingStatusItemDto { public DateTimeOffset DateStart { get; set; } diff --git a/PARR.DAL/Cache/Services/CacheMatchingStatusService.cs b/PARR.DAL/Cache/Services/CacheMatchingStatusService.cs deleted file mode 100644 index f33c6ea3..00000000 --- a/PARR.DAL/Cache/Services/CacheMatchingStatusService.cs +++ /dev/null @@ -1,63 +0,0 @@ -using PARR.Constants; -using PARR.DAL.Cache.Models; -using PARR.DAL.Cache.Services.Base; - -namespace PARR.DAL.Cache.Services -{ - internal class CacheMatchingStatusService : ICacheMatchingStatusService - { - private readonly IRedisCacheService redisCacheService; - - public CacheMatchingStatusService(IRedisCacheService redisCacheService) - { - this.redisCacheService = redisCacheService; - } - - public async Task DeleteCacheAsync(Guid id, SyncTaskEntityTypeEnum type) - { - var key = GetKey(id, type); - - await redisCacheService.DeleteCachedDataAsync(key); - } - - - public async Task GetDataAsync(Guid id, SyncTaskEntityTypeEnum type) - { - var key = GetKey(id, type); - - return await redisCacheService.GetCachedDataAsync(key); - } - - - public async Task SetCacheAsync(Guid id, SyncTaskEntityTypeEnum type, MatchingStatusDto data, TimeSpan cacheDuration) - { - var key = GetKey(id, type); - - await redisCacheService.SetCachedDataAsync(key, data, cacheDuration); - } - - - private string GetKey(Guid id, SyncTaskEntityTypeEnum type) - { - var typeStr = ""; - switch (type) - { - case SyncTaskEntityTypeEnum.Job: - typeStr = "j"; - break; - case SyncTaskEntityTypeEnum.JobGroup: - typeStr = "g"; - break; - case SyncTaskEntityTypeEnum.Template: - typeStr = "t"; - break; - default: - break; - } - - return redisCacheService.GetKey(new string[] { "ms", typeStr, id.ToString() }); - } - - - } -} diff --git a/PARR.DAL/Cache/Services/ICacheMatchingStatusService.cs b/PARR.DAL/Cache/Services/ICacheMatchingStatusService.cs deleted file mode 100644 index 976b766c..00000000 --- a/PARR.DAL/Cache/Services/ICacheMatchingStatusService.cs +++ /dev/null @@ -1,18 +0,0 @@ -using PARR.Constants; -using PARR.DAL.Cache.Models; - -namespace PARR.DAL.Cache.Services -{ - /// - /// Сервис - статус matching`a - /// - public interface ICacheMatchingStatusService - { - Task GetDataAsync(Guid id, SyncTaskEntityTypeEnum type); - - Task SetCacheAsync(Guid id, SyncTaskEntityTypeEnum type, MatchingStatusDto data, TimeSpan cacheDuration); - - Task DeleteCacheAsync(Guid id, SyncTaskEntityTypeEnum type); - - } -} diff --git a/PARR.DAL/DomainModels/MatchingStatus.cs b/PARR.DAL/DomainModels/MatchingStatus.cs new file mode 100644 index 00000000..8e79e466 --- /dev/null +++ b/PARR.DAL/DomainModels/MatchingStatus.cs @@ -0,0 +1,36 @@ +using PARR.DAL.Cache.Models; + +namespace PARR.DAL.DomainModels +{ + /// + /// Статус matching`a + /// + public class MatchingStatus + { + /// + /// В целом по искомому объекту, идет ли matching + /// + public bool IsMatchingObject => IsMatchingJobs || IsMatchingJobGroups; + + /// + /// Идет ли мэтчинг по Jobs + /// + public bool IsMatchingJobs => DetailsJobs?.Any() ?? false; + + /// + /// Идет ли мэтчинг по JobGroups + /// + public bool IsMatchingJobGroups => DetailsJobGroups?.Any() ?? false; + + /// + /// Детально из КЭШ по Jobs + /// + public List? DetailsJobs { get; set; } + + /// + /// Детально из КЭШ по JobGroups + /// + public List? DetailsJobGroups { get; set; } + + } +} diff --git a/PARR.DAL/DomainServices/Implementations/MatchingStatusService.cs b/PARR.DAL/DomainServices/Implementations/MatchingStatusService.cs new file mode 100644 index 00000000..799236e1 --- /dev/null +++ b/PARR.DAL/DomainServices/Implementations/MatchingStatusService.cs @@ -0,0 +1,120 @@ +using Microsoft.EntityFrameworkCore; +using PARR.Constants; +using PARR.DAL.Cache.Models; +using PARR.DAL.Cache.Services.Base; +using PARR.DAL.DomainModels; +using PARR.DAL.DomainServices.Interfaces; +using PARR.DAL.Services.Interfaces.Job; + +namespace PARR.DAL.DomainServices.Implementations +{ + internal class MatchingStatusService : IMatchingStatusService + { + private readonly IRedisCacheService redisCacheService; + private readonly IJobService jobService; + private readonly IJobGroupService jobGroupService; + + public MatchingStatusService( + IRedisCacheService redisCacheService, + IJobService jobService, + IJobGroupService jobGroupService + ) + { + this.redisCacheService = redisCacheService; + this.jobService = jobService; + this.jobGroupService = jobGroupService; + } + + + public async Task DeleteMatchingStatusAsync(Guid objectId, SyncTaskEntityTypeEnum type) + { + var key = GetKey(objectId, type); + await redisCacheService.DeleteCachedDataAsync(key); + } + + public async Task GetStatusAsync(Guid objectId, SyncTaskEntityTypeEnum type) + { + var jobGroupIdList = new List(); + var jobIdList = new List(); + + //формируем список jobId и jobGroupId для поиска в КЭШ, происходит ли у кого-то из них сейчас matching + switch (type) + { + case SyncTaskEntityTypeEnum.Job: + var job = await jobService.Get().FirstOrDefaultAsync(t => t.Id == objectId); + if (job != null) + { + jobIdList.Add(job.Id); + jobGroupIdList = await jobGroupService.Get().Where(t => t.Id == job.GroupId).Select(t => t.Id).ToListAsync(); + } + break; + case SyncTaskEntityTypeEnum.JobGroup: + var jobGroup = await jobGroupService.Get().FirstOrDefaultAsync(t => t.Id == objectId); + if (jobGroup != null) + { + jobGroupIdList.Add(jobGroup.Id); + jobIdList = await jobService.Get().Where(t => t.GroupId == jobGroup.Id).Select(t => t.Id).ToListAsync(); + } + break; + case SyncTaskEntityTypeEnum.Template: + throw new Exception("Нет реализации получения кэша статуса matching для template"); + //todo: У нас вообще нет matching для Template, позже надо удалить это вообще из Enum SyncTaskEntityTypeEnum + break; + } + + // Если списки пустые, мало ли, говорим что нет matching`a + if (!jobGroupIdList.Any() && !jobIdList.Any()) + return new MatchingStatus { DetailsJobGroups = null, DetailsJobs = null }; + + // Ищем в КЭШ + var jobGroupDetails = new List(); + foreach (var jobGroupId in jobGroupIdList) + { + var cacheResult = await redisCacheService.GetCachedDataAsync(GetKey(jobGroupId, SyncTaskEntityTypeEnum.JobGroup)); + if (cacheResult != null) + jobGroupDetails.Add(cacheResult); + } + + var jobDetails = new List(); + foreach (var jobId in jobIdList) + { + var cacheResult = await redisCacheService.GetCachedDataAsync(GetKey(jobId, SyncTaskEntityTypeEnum.Job)); + if (cacheResult != null) + jobDetails.Add(cacheResult); + } + + return new MatchingStatus + { + DetailsJobGroups = jobGroupDetails.Any() ? jobGroupDetails : null, + DetailsJobs = jobDetails.Any() ? jobDetails : null + }; + } + + public async Task SetMatchingStatusAsync(Guid objectId, SyncTaskEntityTypeEnum type, MatchingStatusItem data, TimeSpan cacheDuration) + { + var key = GetKey(objectId, type); + await redisCacheService.SetCachedDataAsync(key, data, cacheDuration); + } + + private string GetKey(Guid id, SyncTaskEntityTypeEnum type) + { + var typeStr = ""; + switch (type) + { + case SyncTaskEntityTypeEnum.Job: + typeStr = "j"; + break; + case SyncTaskEntityTypeEnum.JobGroup: + typeStr = "g"; + break; + case SyncTaskEntityTypeEnum.Template: + typeStr = "t"; + break; + default: + break; + } + + return redisCacheService.GetKey(new string[] { "ms", typeStr, id.ToString() }); + } + } +} diff --git a/PARR.DAL/DomainServices/Interfaces/IMatchingStatusService.cs b/PARR.DAL/DomainServices/Interfaces/IMatchingStatusService.cs new file mode 100644 index 00000000..3fc927de --- /dev/null +++ b/PARR.DAL/DomainServices/Interfaces/IMatchingStatusService.cs @@ -0,0 +1,38 @@ +using PARR.Constants; +using PARR.DAL.Cache.Models; +using PARR.DAL.DomainModels; + +namespace PARR.DAL.DomainServices.Interfaces +{ + /// + /// Сервис по управлению статусом Matching`a + /// + public interface IMatchingStatusService + { + /// + /// Получить статус matching`a + /// + /// + /// + /// + Task GetStatusAsync(Guid objectId, SyncTaskEntityTypeEnum type); + + /// + /// Установить/обновить статус matching`a + /// + /// + /// + /// + /// + /// + Task SetMatchingStatusAsync(Guid objectId, SyncTaskEntityTypeEnum type, MatchingStatusItem data, TimeSpan cacheDuration); + + /// + /// Удалить статус matching`a + /// + /// + /// + /// + Task DeleteMatchingStatusAsync(Guid objectId, SyncTaskEntityTypeEnum type); + } +} diff --git a/PARR.DAL/ParrDalInstaller.cs b/PARR.DAL/ParrDalInstaller.cs index a64a40d6..8f10279b 100644 --- a/PARR.DAL/ParrDalInstaller.cs +++ b/PARR.DAL/ParrDalInstaller.cs @@ -53,8 +53,6 @@ namespace PARR.DAL services.AddTransient(); - services.AddTransient(); - #endregion #region InfluxDb @@ -141,6 +139,7 @@ namespace PARR.DAL #region DomainServces services.AddTransient(); services.AddTransient(); + services.AddTransient(); #endregion