wip: doctor/cli/docs/api to vector db consolidation; api hardening for descriptions, tenant, and scopes; migrations and conversions of all DALs to EF v10

This commit is contained in:
master
2026-02-23 15:30:50 +02:00
parent bd8fee6ed8
commit e746577380
1424 changed files with 81225 additions and 25251 deletions

View File

@@ -0,0 +1,48 @@
// Licensed to StellaOps under the BUSL-1.1 license.
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Npgsql;
using StellaOps.Infrastructure.Postgres.Connections;
using StellaOps.Infrastructure.Postgres.Options;
namespace StellaOps.ReachGraph.Persistence.Postgres;
/// <summary>
/// PostgreSQL data source for the ReachGraph module.
/// Manages connections for reachability graph persistence.
/// </summary>
public sealed class ReachGraphDataSource : DataSourceBase
{
/// <summary>
/// Default schema name for ReachGraph tables.
/// </summary>
public const string DefaultSchemaName = "reachgraph";
/// <summary>
/// Creates a new ReachGraph data source.
/// </summary>
public ReachGraphDataSource(IOptions<PostgresOptions> options, ILogger<ReachGraphDataSource> logger)
: base(EnsureSchema(options.Value), logger)
{
}
/// <inheritdoc />
protected override string ModuleName => "ReachGraph";
/// <inheritdoc />
protected override void ConfigureDataSourceBuilder(NpgsqlDataSourceBuilder builder)
{
base.ConfigureDataSourceBuilder(builder);
// No custom enum types for ReachGraph; JSONB columns use string storage.
}
private static PostgresOptions EnsureSchema(PostgresOptions baseOptions)
{
if (string.IsNullOrWhiteSpace(baseOptions.SchemaName))
{
baseOptions.SchemaName = DefaultSchemaName;
}
return baseOptions;
}
}

View File

@@ -0,0 +1,35 @@
// Licensed to StellaOps under the BUSL-1.1 license.
using System;
using Microsoft.EntityFrameworkCore;
using Npgsql;
using StellaOps.ReachGraph.Persistence.EfCore.CompiledModels;
using StellaOps.ReachGraph.Persistence.EfCore.Context;
namespace StellaOps.ReachGraph.Persistence.Postgres;
/// <summary>
/// Runtime factory for creating <see cref="ReachGraphDbContext"/> instances.
/// Uses the static compiled model when schema matches the default; falls back to
/// reflection-based model building for non-default schemas (integration tests).
/// </summary>
internal static class ReachGraphDbContextFactory
{
public static ReachGraphDbContext Create(NpgsqlConnection connection, int commandTimeoutSeconds, string schemaName)
{
var normalizedSchema = string.IsNullOrWhiteSpace(schemaName)
? ReachGraphDataSource.DefaultSchemaName
: schemaName.Trim();
var optionsBuilder = new DbContextOptionsBuilder<ReachGraphDbContext>()
.UseNpgsql(connection, npgsql => npgsql.CommandTimeout(commandTimeoutSeconds));
if (string.Equals(normalizedSchema, ReachGraphDataSource.DefaultSchemaName, StringComparison.Ordinal))
{
// Use the static compiled model when schema mapping matches the default model.
optionsBuilder.UseModel(ReachGraphDbContextModel.Instance);
}
return new ReachGraphDbContext(optionsBuilder.Options, normalizedSchema);
}
}