feat(datasync): implement GetRecentUpdatesAsync and GetLastRunsAsync

- GetRecentUpdatesAsync: Returns last N DataUpdate records for a table,
  optionally filtered by UpdateType, ordered by StartDt descending
- GetLastRunsAsync: Returns the most recent run (successful or not) for
  each UpdateType for a given table using a CTE with ROW_NUMBER
This commit is contained in:
Joseph Doherty
2026-01-07 08:01:23 -05:00
parent f3ad38b954
commit 33a04f4022
@@ -256,4 +256,54 @@ FROM LastSuccessful";
return lastSync.Value < overdueThreshold;
}
/// <inheritdoc/>
public async Task<List<DataUpdate>> GetRecentUpdatesAsync(
string tableName,
UpdateTypes? updateType = null,
int count = 30,
CancellationToken cancellationToken = default)
{
var sql = updateType.HasValue
? @"SELECT TOP (@count) du.Id, du.SourceSystem, du.SourceData, du.TableName,
du.StartDt, du.EndDt, du.UpdateType, du.WasSuccessful, du.NumberRecords
FROM dbo.DataUpdate du
WHERE du.TableName = @tableName AND du.UpdateType = @updateType
ORDER BY du.StartDt DESC"
: @"SELECT TOP (@count) du.Id, du.SourceSystem, du.SourceData, du.TableName,
du.StartDt, du.EndDt, du.UpdateType, du.WasSuccessful, du.NumberRecords
FROM dbo.DataUpdate du
WHERE du.TableName = @tableName
ORDER BY du.StartDt DESC";
await using var connection = await _connectionFactory.CreateLotFinderConnectionAsync(cancellationToken);
var results = await connection.QueryAsync<DataUpdate>(
sql,
new { tableName, updateType = updateType.HasValue ? (int)updateType.Value : 0, count },
commandTimeout: 30);
return results.ToList();
}
/// <inheritdoc/>
public async Task<Dictionary<UpdateTypes, DataUpdate>> GetLastRunsAsync(
string tableName,
CancellationToken cancellationToken = default)
{
const string sql = @"
WITH LastRuns AS (
SELECT du.*,
ROW_NUMBER() OVER (PARTITION BY du.UpdateType ORDER BY du.StartDt DESC) AS RN
FROM dbo.DataUpdate du
WHERE du.TableName = @tableName
)
SELECT Id, SourceSystem, SourceData, TableName, StartDt, EndDt, UpdateType, WasSuccessful, NumberRecords
FROM LastRuns
WHERE RN = 1";
await using var connection = await _connectionFactory.CreateLotFinderConnectionAsync(cancellationToken);
var results = await connection.QueryAsync<DataUpdate>(sql, new { tableName }, commandTimeout: 30);
return results.ToDictionary(du => du.UpdateType, du => du);
}
}