Restructure solution layout by module

This commit is contained in:
master
2025-10-28 15:10:40 +02:00
parent 95daa159c4
commit d870da18ce
4103 changed files with 192899 additions and 187024 deletions

View File

@@ -0,0 +1,69 @@
using System;
namespace StellaOps.Concelier.Connector.Distro.Ubuntu.Configuration;
public sealed class UbuntuOptions
{
public const string HttpClientName = "concelier.ubuntu";
public const int MaxPageSize = 20;
/// <summary>
/// Endpoint exposing the rolling JSON index of Ubuntu Security Notices.
/// </summary>
public Uri NoticesEndpoint { get; set; } = new("https://ubuntu.com/security/notices.json");
/// <summary>
/// Base URI where individual notice detail pages live.
/// </summary>
public Uri NoticeDetailBaseUri { get; set; } = new("https://ubuntu.com/security/");
public TimeSpan FetchTimeout { get; set; } = TimeSpan.FromSeconds(45);
public TimeSpan InitialBackfill { get; set; } = TimeSpan.FromDays(30);
public TimeSpan ResumeOverlap { get; set; } = TimeSpan.FromDays(3);
public int MaxNoticesPerFetch { get; set; } = 60;
public int IndexPageSize { get; set; } = 20;
public string UserAgent { get; set; } = "StellaOps.Concelier.Ubuntu/0.1 (+https://stella-ops.org)";
public void Validate()
{
if (NoticesEndpoint is null || !NoticesEndpoint.IsAbsoluteUri)
{
throw new InvalidOperationException("Ubuntu notices endpoint must be an absolute URI.");
}
if (NoticeDetailBaseUri is null || !NoticeDetailBaseUri.IsAbsoluteUri)
{
throw new InvalidOperationException("Ubuntu notice detail base URI must be an absolute URI.");
}
if (MaxNoticesPerFetch <= 0 || MaxNoticesPerFetch > 200)
{
throw new InvalidOperationException("MaxNoticesPerFetch must be between 1 and 200.");
}
if (FetchTimeout <= TimeSpan.Zero || FetchTimeout > TimeSpan.FromMinutes(5))
{
throw new InvalidOperationException("FetchTimeout must be positive and less than five minutes.");
}
if (InitialBackfill < TimeSpan.Zero || InitialBackfill > TimeSpan.FromDays(365))
{
throw new InvalidOperationException("InitialBackfill must be between 0 and 365 days.");
}
if (ResumeOverlap < TimeSpan.Zero || ResumeOverlap > TimeSpan.FromDays(14))
{
throw new InvalidOperationException("ResumeOverlap must be between 0 and 14 days.");
}
if (IndexPageSize <= 0 || IndexPageSize > MaxPageSize)
{
throw new InvalidOperationException($"IndexPageSize must be between 1 and {MaxPageSize}.");
}
}
}