persistence/DD.Persistence.API/Services/ChangeLogService.cs

119 lines
4.1 KiB
C#
Raw Normal View History

using DD.Persistence.Models.Requests;
using DD.Persistence.Repositories;
2025-02-13 17:57:43 +05:00
using Microsoft.Extensions.Caching.Memory;
namespace DD.Persistence.API.Services;
/// <summary>
/// Сервис по работе с журналом изменений
/// </summary>
public class ChangeLogService
2025-02-13 17:57:43 +05:00
{
private readonly IMemoryCache memoryCache;
private readonly IChangeLogCommitRepository commitRepository;
private readonly IChangeLogRepository repository;
private readonly TimeSpan? AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(60);
/// <summary>
/// ctor
/// </summary>
/// <param name="memoryCache"></param>
/// <param name="commitRepository"></param>
/// <param name="repository"></param>
2025-02-13 17:57:43 +05:00
public ChangeLogService(
IMemoryCache memoryCache,
IChangeLogCommitRepository commitRepository,
IChangeLogRepository repository)
{
this.memoryCache = memoryCache;
this.commitRepository = commitRepository;
this.repository = repository;
}
/// <summary>
/// Создание или чтение данных коммита
/// </summary>
/// <param name="commitDto"></param>
/// <param name="token"></param>
/// <returns></returns>
private async Task<Guid> GetOrCreateCommitAsync(ChangeLogCommitDto commitDto, CancellationToken token)
2025-02-13 17:57:43 +05:00
{
var key = (commitDto.IdAuthor, commitDto.Comment);
2025-02-13 17:57:43 +05:00
var commitId = await memoryCache.GetOrCreateAsync(key, async (cacheEntry) =>
{
cacheEntry.AbsoluteExpirationRelativeToNow = AbsoluteExpirationRelativeToNow;
var commitId = await commitRepository.Add(commitDto, token);
2025-02-13 17:57:43 +05:00
return commitId;
});
return commitId;
}
/// <summary>
/// Добавление записи в журнал изменений
/// </summary>
/// <param name="idDiscriminator"></param>
/// <param name="commitDto"></param>
/// <param name="token"></param>
/// <returns></returns>
public async Task<int> AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token)
{
var commitId = await GetOrCreateCommitAsync(commitDto, token);
commitDto.Id = commitId;
var result = await repository.AddRange(idDiscriminator, commitDto, token);
return result;
}
/// <summary>
/// Пометить запись журнала изменений как удаленную
/// </summary>
/// <param name="ids"></param>
/// <param name="commitDto"></param>
/// <param name="token"></param>
/// <returns></returns>
public async Task<int> MarkAsDeleted(IEnumerable<Guid> ids, ChangeLogCommitDto commitDto, CancellationToken token)
2025-02-13 17:57:43 +05:00
{
var commitId = await GetOrCreateCommitAsync(commitDto, token);
commitDto.Id = commitId;
var result = await repository.MarkAsDeleted(commitId, ids, commitDto.Creation, token);
return result;
}
/// <summary>
/// Очистить старые и добавить новые записи в журнал изменений
/// </summary>
/// <param name="idDiscriminator"></param>
/// <param name="commitDto"></param>
/// <param name="token"></param>
/// <returns></returns>
public async Task<int> ClearAndAddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token)
{
var commitId = await GetOrCreateCommitAsync(commitDto, token);
commitDto.Id = commitId;
var result = await repository.ClearAndAddRange(idDiscriminator, commitDto, token);
return result;
}
/// <summary>
/// Обновить записи в журнале изменений
/// </summary>
/// <param name="changeLogCommit"></param>
/// <param name="token"></param>
/// <returns></returns>
public async Task<int> UpdateRange(ChangeLogCommitDto changeLogCommit, CancellationToken token)
{
var commitId = await GetOrCreateCommitAsync(changeLogCommit, token);
changeLogCommit.Id = commitId;
var result = await repository.UpdateRange(changeLogCommit, token);
return result;
2025-02-13 17:57:43 +05:00
}
}