feat(core,dal,domain,snapshotWorker): Воркер по управлению снапшотами. Создание сгапшотов для таблицы RobotConfigurations

This commit is contained in:
Mikhail Trubnikov
2026-07-13 15:29:48 +10:00
parent 9194d127d2
commit 50556ef605
28 changed files with 4953 additions and 26 deletions

View File

@@ -1,7 +1,9 @@
using AutoMapper;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PARR.Core.Repositories.Interfaces;
using PARR.Core.Repositories.Interfaces.RobotRepositories;
using PARR.Core.Services.Snapshots.Interfaces;
using PARR.Domain.DTOs.RobotSnapshotDTO;
using PARR.Domain.DTOs.User;
using PARR.Domain.Entities.RobotEntities;
@@ -9,21 +11,32 @@ using PARR.Domain.Exceptions;
namespace PARR.Core.Services.RobotSnapshotServices
{
internal class RobotSnapshotService : IRobotSnapshotService
internal class RobotSnapshotService : IRobotSnapshotService, ISnapshotProvider
{
private readonly IRobotSnapshotRepository _robotSnapshotRepository;
private readonly IUserRepository _userRepository;
private readonly IMapper _mapper;
private readonly ILogger<RobotSnapshotService> _logger;
private readonly ISnapshotSettings _snapshotSettings;
// Тут любое значение, не используем метод создания снапшота
public TimeSpan Interval => TimeSpan.FromHours(1);
public TimeSpan RetentionPeriod => _snapshotSettings.RobotSnapshotRetentionPeriod;
public RobotSnapshotService(
IRobotSnapshotRepository robotSnapshotRepository,
IUserRepository userRepository,
IMapper mapper
IMapper mapper,
ILogger<RobotSnapshotService> logger,
ISnapshotSettings snapshotSettings
)
{
_robotSnapshotRepository = robotSnapshotRepository;
_userRepository = userRepository;
_mapper = mapper;
_logger = logger;
_snapshotSettings = snapshotSettings;
}
@@ -348,5 +361,26 @@ namespace PARR.Core.Services.RobotSnapshotServices
}
public Task TakeSnapshotAsync(CancellationToken cancellationToken)
{
// Метод пустой! Нам не нужно собирать данные по таймеру,
// так как они и так пишутся сюда через контроллер API.
return Task.CompletedTask;
}
public async Task CleanUpOldSnapshotsAsync(CancellationToken cancellationToken)
{
var thresholdDate = DateTimeOffset.UtcNow - RetentionPeriod;
_logger.LogInformation("[{ServiceName}] Запуск очистки старых снапшотов. Удаление данных старше {ThresholdDate}", GetType().Name, thresholdDate);
// Удаляем старые записи напрямую в PostgreSQL
var deletedCount = await _robotSnapshotRepository.Get()
.Where(s => s.DateCreated < thresholdDate)
.ExecuteDeleteAsync(cancellationToken);
_logger.LogInformation("[{ServiceName}] Очистка завершена. Удалено устаревших строк снапшотов: {Count}", GetType().Name, deletedCount);
}
}
}