using FrameworkDAL.DTO.ChangeTracking;
using FrameworkDAL.Query.ChangeTracking;
using GB5Shared.ChangeTracking;
using GB5Shared.DTO.Framework.Login;
using GB5Shared.QueryExecutor;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace FrameworkDAL.CustomCode.ChangeTracking
{
public sealed class ChangeTrackingDAL : IChangeTrackingDAL
{
private readonly IQueryExecutor _qe;
public ChangeTrackingDAL(IQueryExecutor qe) => _qe = qe;
///
public async Task SaveChangesAsync(
int eventLogId,
IReadOnlyList changes,
LoginDTO login,
CancellationToken ct = default)
{
if (changes.Count == 0) return;
// Each change is a separate INSERT — change counts per event are small (<20 typical).
// BulkInsertAsync is overkill for this volume; individual inserts keep the code simple.
foreach (var change in changes)
{
await _qe.ExecuteAsync(
login,
ChangeTrackingQB.INSERT_CHANGE,
new
{
EventLogId = eventLogId,
change.FieldName,
change.OldValue,
change.NewValue,
TenantId = login.ClientId
},
cancellationToken: ct).ConfigureAwait(false);
}
}
///
public async Task> GetChangesByEventLogAsync(
int eventLogId,
LoginDTO login,
CancellationToken ct = default)
{
return (await _qe.QueryAsync(
login,
ChangeTrackingQB.GET_BY_EVENTLOG_ID,
new { EventLogId = eventLogId, TenantId = login.ClientId },
cancellationToken: ct).ConfigureAwait(false)).ToList();
}
}
}