using Dapper; namespace SQLInsight.Repository; public sealed record UpdateStatusRow { public string? Feed { get; init; } public string Channel { get; init; } = "stable"; public string Mode { get; init; } = "Notify"; public bool RulePacks { get; init; } public string InstalledVersion { get; init; } = string.Empty; public string RulePackVersion { get; init; } = string.Empty; public string RulePackSource { get; init; } = string.Empty; public string? AvailableVersion { get; init; } public bool AvailableSecurity { get; init; } public string? AvailableNotesUrl { get; init; } public string? StagedVersion { get; init; } public DateTime? LastCheckAt { get; init; } public string? LastError { get; init; } public string? LastResultOutcome { get; init; } public string? LastResultMessage { get; init; } public DateTime? LastResultAt { get; init; } public DateTime UpdatedAt { get; init; } } public sealed partial class InsightRepository { public async Task SaveUpdateStatusAsync(UpdateStatusRow status, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(status); await using var connection = await OpenAsync(cancellationToken).ConfigureAwait(false); await connection.ExecuteAsync(""" MERGE insight.UpdateStatus AS t USING (SELECT 1 AS Id) AS s ON t.Id = s.Id WHEN MATCHED THEN UPDATE SET Feed = @Feed, Channel = @Channel, Mode = @Mode, RulePacks = @RulePacks, InstalledVersion = @InstalledVersion, RulePackVersion = @RulePackVersion, RulePackSource = @RulePackSource, AvailableVersion = @AvailableVersion, AvailableSecurity = @AvailableSecurity, AvailableNotesUrl = @AvailableNotesUrl, StagedVersion = @StagedVersion, LastCheckAt = @LastCheckAt, LastError = @LastError, LastResultOutcome = @LastResultOutcome, LastResultMessage = @LastResultMessage, LastResultAt = @LastResultAt, UpdatedAt = @UpdatedAt WHEN NOT MATCHED THEN INSERT (Id, Feed, Channel, Mode, RulePacks, InstalledVersion, RulePackVersion, RulePackSource, AvailableVersion, AvailableSecurity, AvailableNotesUrl, StagedVersion, LastCheckAt, LastError, LastResultOutcome, LastResultMessage, LastResultAt, UpdatedAt) VALUES (1, @Feed, @Channel, @Mode, @RulePacks, @InstalledVersion, @RulePackVersion, @RulePackSource, @AvailableVersion, @AvailableSecurity, @AvailableNotesUrl, @StagedVersion, @LastCheckAt, @LastError, @LastResultOutcome, @LastResultMessage, @LastResultAt, @UpdatedAt); """, status).ConfigureAwait(false); } public async Task GetUpdateStatusAsync(CancellationToken cancellationToken = default) { await using var connection = await OpenAsync(cancellationToken).ConfigureAwait(false); return await connection.QuerySingleOrDefaultAsync("SELECT * FROM insight.UpdateStatus WHERE Id = 1;").ConfigureAwait(false); } }