Наработки по ChangeLog

This commit is contained in:
Olga Nemt 2025-02-13 17:57:43 +05:00
parent 5a44dfb109
commit 3b4af1fd8d
6 changed files with 125 additions and 10 deletions

View File

@ -5,6 +5,7 @@ using DD.Persistence.Models.Requests;
using DD.Persistence.Repositories; using DD.Persistence.Repositories;
using System.Net; using System.Net;
using DD.Persistence.Models.Common; using DD.Persistence.Models.Common;
using DD.Persistence.API.Services;
namespace DD.Persistence.API.Controllers; namespace DD.Persistence.API.Controllers;
@ -13,11 +14,15 @@ namespace DD.Persistence.API.Controllers;
[Route("api/[controller]")] [Route("api/[controller]")]
public class ChangeLogController : ControllerBase, IChangeLogApi public class ChangeLogController : ControllerBase, IChangeLogApi
{ {
private readonly IChangeLogRepository repository; public ChangeLogService service { get; }
public ChangeLogController(IChangeLogRepository repository) /// <summary>
/// ctor
/// </summary>
/// <param name="service"></param>
public ChangeLogController(ChangeLogService service)
{ {
this.repository = repository; this.service = service;
} }
[HttpPost("{idDiscriminator}")] [HttpPost("{idDiscriminator}")]
@ -31,7 +36,7 @@ public class ChangeLogController : ControllerBase, IChangeLogApi
//var userId = User.GetUserId<Guid>(); //var userId = User.GetUserId<Guid>();
var userId = Guid.NewGuid(); var userId = Guid.NewGuid();
var changeLogCommit = new ChangeLogCommitDto(userId, comment, [dto]); var changeLogCommit = new ChangeLogCommitDto(userId, comment, [dto]);
var result = await repository.AddRange(idDiscriminator, changeLogCommit, token); var result = await service.(idDiscriminator, changeLogCommit, token);
return CreatedAtAction(nameof(Add), result); return CreatedAtAction(nameof(Add), result);
} }

View File

@ -0,0 +1,42 @@
using DD.Persistence.Repositories;
using Microsoft.Extensions.Caching.Memory;
namespace DD.Persistence.API.Services;
public class ChangeLogService
{
private readonly IMemoryCache memoryCache;
private readonly IChangeLogCommitRepository commitRepository;
private readonly IChangeLogRepository repository;
private readonly TimeSpan? AbsoluteExpirationRelativeToNow = TimeSpan.FromMinutes(60);
public ChangeLogService(
IMemoryCache memoryCache,
IChangeLogCommitRepository commitRepository,
IChangeLogRepository repository)
{
this.memoryCache = memoryCache;
this.commitRepository = commitRepository;
this.repository = repository;
}
private async Task<Guid> GetOrCreateAsync(Guid idUser, string comment, CancellationToken token)
{
var key = (idUser, comment);
var commitId = await memoryCache.GetOrCreateAsync(key, async (cacheEntry) =>
{
cacheEntry.AbsoluteExpirationRelativeToNow = AbsoluteExpirationRelativeToNow;
var commitId = await commitRepository.Add(idUser, comment, token);
return commitId;
});
return commitId;
}
public async Task<int> AddRange( Guid idUser, string comment, CancellationToken token)
{
var cimmitId = await GetOrCreateAsync(idUser, comment, token);
repository.AddRange(new);
}
}

View File

@ -1,7 +1,7 @@
{ {
"DbConnection": { "DbConnection": {
"Host": "postgres", "Host": "localhost",
"Port": 5432, "Port": 5462,
"Database": "persistence", "Database": "persistence",
"Username": "postgres", "Username": "postgres",
"Password": "postgres" "Password": "postgres"

View File

@ -0,0 +1,44 @@
using DD.Persistence.Database.Entity;
using DD.Persistence.Repositories;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UuidExtensions;
namespace DD.Persistence.Database.Repositories;
public class ChangeLogCommitRepository : IChangeLogCommitRepository
{
private DbContext db;
public ChangeLogCommitRepository()
{
}
public ChangeLogCommitRepository(DbContext db)
{
this.db = db;
}
private virtual async Task<Guid> Add(Guid idUser, string comment, CancellationToken token) {
var commit = new ChangeLogCommit()
{
Id = Uuid7.Guid(),
IdCommitAuthor = idUser,
Comment = comment,
Creation = DateTimeOffset.UtcNow
};
db.Add(commit);
await db.SaveChangesAsync();
return commit.Id;
}
public abstract Task<Guid> GetOrCreate(Guid idUser, string comment, CancellationToken token);
}

View File

@ -12,15 +12,17 @@ namespace DD.Persistence.Database.Repositories;
public class ChangeLogRepository : IChangeLogRepository public class ChangeLogRepository : IChangeLogRepository
{ {
private readonly DbContext db; private readonly DbContext db;
private readonly IChangeLogCommitRepository changeLogCommitRepo;
public ChangeLogRepository(DbContext db) public ChangeLogRepository(DbContext db, IChangeLogCommitRepository changeLogCommitRepo)
{ {
this.db = db; this.db = db;
this.changeLogCommitRepo = changeLogCommitRepo;
} }
public async Task<int> AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token) public async Task<int> AddRange(Guid idDiscriminator, ChangeLogCommitDto commitDto, CancellationToken token)
{ {
var commit = CreateCommit(commitDto); var commit = changeLogCommitRepo.Get(commitDto);
db.Set<ChangeLogCommit>().Add(commit); db.Set<ChangeLogCommit>().Add(commit);
var entities = new List<ChangeLog>(); var entities = new List<ChangeLog>();
@ -115,7 +117,7 @@ public class ChangeLogRepository : IChangeLogRepository
using var transaction = await db.Database.BeginTransactionAsync(token); using var transaction = await db.Database.BeginTransactionAsync(token);
var commit = CreateCommit(commitDto); var commit = GetOrCreate(commitDto);
db.Set<ChangeLogCommit>().Add(commit); db.Set<ChangeLogCommit>().Add(commit);
foreach (var dto in commitDto.ChangeLogItems) foreach (var dto in commitDto.ChangeLogItems)
@ -221,7 +223,7 @@ public class ChangeLogRepository : IChangeLogRepository
return entity; return entity;
} }
private static ChangeLogCommit CreateCommit(ChangeLogCommitDto commitDto) private static ChangeLogCommit GetOrCreate(ChangeLogCommitDto commitDto)
{ {
return new ChangeLogCommit() return new ChangeLogCommit()
{ {

View File

@ -0,0 +1,22 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DD.Persistence.Repositories;
/// <summary>
///
/// </summary>
public interface IChangeLogCommitRepository
{
/// <summary>
///
/// </summary>
/// <param name="idUser"></param>
/// <param name="comment"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<Guid> Add(Guid idUser, string comment, CancellationToken token);
}