Fix build and code structure improvements. New but essential UI functionality. CI improvements. Documentation improvements. AI module improvements.

This commit is contained in:
StellaOps Bot
2025-12-26 21:54:17 +02:00
parent 335ff7da16
commit c2b9cd8d1f
3717 changed files with 264714 additions and 48202 deletions

View File

@@ -0,0 +1,85 @@
using System.Text.Json;
using Microsoft.Extensions.Logging;
using StellaOps.Scanner.Sources.Contracts;
using StellaOps.Scanner.Sources.Domain;
namespace StellaOps.Scanner.Sources.Services;
/// <summary>
/// Dispatches connection tests to type-specific testers.
/// </summary>
public sealed class SourceConnectionTester : ISourceConnectionTester
{
private readonly IEnumerable<ISourceTypeConnectionTester> _testers;
private readonly ILogger<SourceConnectionTester> _logger;
public SourceConnectionTester(
IEnumerable<ISourceTypeConnectionTester> testers,
ILogger<SourceConnectionTester> logger)
{
_testers = testers;
_logger = logger;
}
public Task<ConnectionTestResult> TestAsync(SbomSource source, CancellationToken ct = default)
{
return TestAsync(source, null, ct);
}
public async Task<ConnectionTestResult> TestAsync(
SbomSource source,
JsonDocument? testCredentials,
CancellationToken ct = default)
{
var tester = _testers.FirstOrDefault(t => t.SourceType == source.SourceType);
if (tester == null)
{
_logger.LogWarning(
"No connection tester registered for source type {SourceType}",
source.SourceType);
return new ConnectionTestResult
{
Success = false,
Message = $"No connection tester available for source type {source.SourceType}",
TestedAt = DateTimeOffset.UtcNow
};
}
try
{
_logger.LogDebug(
"Testing connection for source {SourceId} ({SourceType})",
source.SourceId, source.SourceType);
var result = await tester.TestAsync(source, testCredentials, ct);
_logger.LogInformation(
"Connection test for source {SourceId} {Result}: {Message}",
source.SourceId,
result.Success ? "succeeded" : "failed",
result.Message);
return result;
}
catch (OperationCanceledException)
{
throw;
}
catch (Exception ex)
{
_logger.LogError(ex, "Connection test failed for source {SourceId}", source.SourceId);
return new ConnectionTestResult
{
Success = false,
Message = $"Connection test error: {ex.Message}",
TestedAt = DateTimeOffset.UtcNow,
Details = new Dictionary<string, object>
{
["exceptionType"] = ex.GetType().Name
}
};
}
}
}