Gaps fill up, fixes, ui restructuring
This commit is contained in:
100
src/Remediation/StellaOps.Remediation.WebService/Program.cs
Normal file
100
src/Remediation/StellaOps.Remediation.WebService/Program.cs
Normal file
@@ -0,0 +1,100 @@
|
||||
using StellaOps.Remediation.Core.Abstractions;
|
||||
using StellaOps.Remediation.Core.Services;
|
||||
using StellaOps.Remediation.Persistence.Repositories;
|
||||
using StellaOps.Remediation.WebService.Endpoints;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
builder.Services.AddProblemDetails();
|
||||
builder.Services.AddHealthChecks();
|
||||
builder.Services.AddRouting(options => options.LowercaseUrls = true);
|
||||
builder.Services.AddAuthorization(options =>
|
||||
{
|
||||
options.AddPolicy("remediation.read", policy => policy.RequireAssertion(_ => true));
|
||||
options.AddPolicy("remediation.submit", policy => policy.RequireAssertion(_ => true));
|
||||
options.AddPolicy("remediation.manage", policy => policy.RequireAssertion(_ => true));
|
||||
});
|
||||
builder.Services.AddAuthentication();
|
||||
|
||||
// Core services
|
||||
builder.Services.AddSingleton<IContributorTrustScorer, ContributorTrustScorer>();
|
||||
builder.Services.AddSingleton<IRemediationVerifier, RemediationVerifier>();
|
||||
|
||||
// Persistence (in-memory stubs for now; swap to Postgres in production)
|
||||
var templateRepo = new PostgresFixTemplateRepository();
|
||||
var submissionRepo = new PostgresPrSubmissionRepository();
|
||||
builder.Services.AddSingleton<IFixTemplateRepository>(templateRepo);
|
||||
builder.Services.AddSingleton<IPrSubmissionRepository>(submissionRepo);
|
||||
|
||||
// Registry: compose from repositories
|
||||
builder.Services.AddSingleton<IRemediationRegistry>(sp =>
|
||||
new InMemoryRemediationRegistry(templateRepo, submissionRepo));
|
||||
|
||||
// Matcher: compose from template repository
|
||||
builder.Services.AddSingleton<IRemediationMatcher>(sp =>
|
||||
new InMemoryRemediationMatcher(templateRepo));
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
app.UseAuthentication();
|
||||
app.UseAuthorization();
|
||||
|
||||
app.MapHealthChecks("/healthz").AllowAnonymous();
|
||||
|
||||
app.MapRemediationRegistryEndpoints();
|
||||
app.MapRemediationMatchEndpoints();
|
||||
app.MapRemediationSourceEndpoints();
|
||||
|
||||
app.Run();
|
||||
|
||||
/// <summary>
|
||||
/// In-memory registry implementation composed from repositories.
|
||||
/// </summary>
|
||||
internal sealed class InMemoryRemediationRegistry : IRemediationRegistry
|
||||
{
|
||||
private readonly IFixTemplateRepository _templates;
|
||||
private readonly IPrSubmissionRepository _submissions;
|
||||
|
||||
public InMemoryRemediationRegistry(IFixTemplateRepository templates, IPrSubmissionRepository submissions)
|
||||
{
|
||||
_templates = templates;
|
||||
_submissions = submissions;
|
||||
}
|
||||
|
||||
public Task<IReadOnlyList<StellaOps.Remediation.Core.Models.FixTemplate>> ListTemplatesAsync(string? cveId, string? purl, int limit, int offset, CancellationToken ct)
|
||||
=> _templates.ListAsync(cveId, purl, limit, offset, ct);
|
||||
|
||||
public Task<StellaOps.Remediation.Core.Models.FixTemplate?> GetTemplateAsync(Guid id, CancellationToken ct)
|
||||
=> _templates.GetByIdAsync(id, ct);
|
||||
|
||||
public Task<StellaOps.Remediation.Core.Models.FixTemplate> CreateTemplateAsync(StellaOps.Remediation.Core.Models.FixTemplate template, CancellationToken ct)
|
||||
=> _templates.InsertAsync(template, ct);
|
||||
|
||||
public Task<IReadOnlyList<StellaOps.Remediation.Core.Models.PrSubmission>> ListSubmissionsAsync(string? cveId, string? status, int limit, int offset, CancellationToken ct)
|
||||
=> _submissions.ListAsync(cveId, status, limit, offset, ct);
|
||||
|
||||
public Task<StellaOps.Remediation.Core.Models.PrSubmission?> GetSubmissionAsync(Guid id, CancellationToken ct)
|
||||
=> _submissions.GetByIdAsync(id, ct);
|
||||
|
||||
public Task<StellaOps.Remediation.Core.Models.PrSubmission> CreateSubmissionAsync(StellaOps.Remediation.Core.Models.PrSubmission submission, CancellationToken ct)
|
||||
=> _submissions.InsertAsync(submission, ct);
|
||||
|
||||
public Task UpdateSubmissionStatusAsync(Guid id, string status, string? verdict, CancellationToken ct)
|
||||
=> _submissions.UpdateStatusAsync(id, status, verdict, ct);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// In-memory matcher implementation that delegates to template repository.
|
||||
/// </summary>
|
||||
internal sealed class InMemoryRemediationMatcher : IRemediationMatcher
|
||||
{
|
||||
private readonly IFixTemplateRepository _templates;
|
||||
|
||||
public InMemoryRemediationMatcher(IFixTemplateRepository templates)
|
||||
{
|
||||
_templates = templates;
|
||||
}
|
||||
|
||||
public Task<IReadOnlyList<StellaOps.Remediation.Core.Models.FixTemplate>> FindMatchesAsync(string cveId, string? purl, string? version, CancellationToken ct)
|
||||
=> _templates.FindMatchesAsync(cveId, purl, version, ct);
|
||||
}
|
||||
Reference in New Issue
Block a user