Search/AdvisoryAI and DAL conversion to EF finishes up. Preparation for microservices consolidation.

This commit is contained in:
master
2026-02-25 18:19:22 +02:00
parent 4db038123b
commit 63c70a6d37
447 changed files with 52257 additions and 2636 deletions

View File

@@ -0,0 +1,9 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore.Infrastructure;
using StellaOps.Provcache.Postgres;
using StellaOps.Provcache.Postgres.EfCore.CompiledModels;
#pragma warning disable 219, 612, 618
#nullable disable
[assembly: DbContextModel(typeof(ProvcacheDbContext), typeof(ProvcacheDbContextModel))]

View File

@@ -0,0 +1,47 @@
// <auto-generated />
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
#pragma warning disable 219, 612, 618
#nullable disable
namespace StellaOps.Provcache.Postgres.EfCore.CompiledModels
{
[DbContext(typeof(ProvcacheDbContext))]
public partial class ProvcacheDbContextModel : RuntimeModel
{
private static readonly bool _useOldBehavior31751 =
System.AppContext.TryGetSwitch("Microsoft.EntityFrameworkCore.Issue31751", out var enabled31751) && enabled31751;
static ProvcacheDbContextModel()
{
var model = new ProvcacheDbContextModel();
if (_useOldBehavior31751)
{
model.Initialize();
}
else
{
var thread = new System.Threading.Thread(RunInitialization, 10 * 1024 * 1024);
thread.Start();
thread.Join();
void RunInitialization()
{
model.Initialize();
}
}
model.Customize();
_instance = (ProvcacheDbContextModel)model.FinalizeModel();
}
private static ProvcacheDbContextModel _instance;
public static IModel Instance => _instance;
partial void Initialize();
partial void Customize();
}
}

View File

@@ -0,0 +1,35 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#pragma warning disable 219, 612, 618
#nullable disable
namespace StellaOps.Provcache.Postgres.EfCore.CompiledModels
{
public partial class ProvcacheDbContextModel
{
private ProvcacheDbContextModel()
: base(skipDetectChanges: false, modelId: new Guid("2a8c29a9-57cf-4b35-8d5b-07f4a6a83a74"), entityTypeCount: 3)
{
}
partial void Initialize()
{
var provcacheEvidenceChunkEntity = ProvcacheEvidenceChunkEntityEntityType.Create(this);
var provcacheItemEntity = ProvcacheItemEntityEntityType.Create(this);
var provcacheRevocationEntity = ProvcacheRevocationEntityEntityType.Create(this);
ProvcacheEvidenceChunkEntityEntityType.CreateAnnotations(provcacheEvidenceChunkEntity);
ProvcacheItemEntityEntityType.CreateAnnotations(provcacheItemEntity);
ProvcacheRevocationEntityEntityType.CreateAnnotations(provcacheRevocationEntity);
AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn);
AddAnnotation("ProductVersion", "10.0.0");
AddAnnotation("Relational:DefaultSchema", "provcache");
AddAnnotation("Relational:MaxIdentifierLength", 63);
}
}
}

View File

@@ -0,0 +1,128 @@
// <auto-generated />
using System;
using System.Reflection;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using StellaOps.Provcache.Entities;
#pragma warning disable 219, 612, 618
#nullable disable
namespace StellaOps.Provcache.Postgres.EfCore.CompiledModels
{
[EntityFrameworkInternal]
public partial class ProvcacheEvidenceChunkEntityEntityType
{
public static RuntimeEntityType Create(RuntimeModel model, RuntimeEntityType baseEntityType = null)
{
var runtimeEntityType = model.AddEntityType(
"StellaOps.Provcache.Entities.ProvcacheEvidenceChunkEntity",
typeof(ProvcacheEvidenceChunkEntity),
baseEntityType,
propertyCount: 8,
unnamedIndexCount: 2,
keyCount: 1);
var chunkId = runtimeEntityType.AddProperty(
"ChunkId",
typeof(Guid),
propertyInfo: typeof(ProvcacheEvidenceChunkEntity).GetProperty("ChunkId", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheEvidenceChunkEntity).GetField("<ChunkId>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
valueGenerated: ValueGenerated.OnAdd,
afterSaveBehavior: PropertySaveBehavior.Throw,
sentinel: new Guid("00000000-0000-0000-0000-000000000000"));
chunkId.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
chunkId.AddAnnotation("Relational:ColumnName", "chunk_id");
var blob = runtimeEntityType.AddProperty(
"Blob",
typeof(byte[]),
propertyInfo: typeof(ProvcacheEvidenceChunkEntity).GetProperty("Blob", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheEvidenceChunkEntity).GetField("<Blob>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
blob.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
blob.AddAnnotation("Relational:ColumnName", "blob");
var blobSize = runtimeEntityType.AddProperty(
"BlobSize",
typeof(int),
propertyInfo: typeof(ProvcacheEvidenceChunkEntity).GetProperty("BlobSize", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheEvidenceChunkEntity).GetField("<BlobSize>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
sentinel: 0);
blobSize.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
blobSize.AddAnnotation("Relational:ColumnName", "blob_size");
var chunkHash = runtimeEntityType.AddProperty(
"ChunkHash",
typeof(string),
propertyInfo: typeof(ProvcacheEvidenceChunkEntity).GetProperty("ChunkHash", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheEvidenceChunkEntity).GetField("<ChunkHash>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
maxLength: 128);
chunkHash.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
chunkHash.AddAnnotation("Relational:ColumnName", "chunk_hash");
var chunkIndex = runtimeEntityType.AddProperty(
"ChunkIndex",
typeof(int),
propertyInfo: typeof(ProvcacheEvidenceChunkEntity).GetProperty("ChunkIndex", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheEvidenceChunkEntity).GetField("<ChunkIndex>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
sentinel: 0);
chunkIndex.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
chunkIndex.AddAnnotation("Relational:ColumnName", "chunk_index");
var contentType = runtimeEntityType.AddProperty(
"ContentType",
typeof(string),
propertyInfo: typeof(ProvcacheEvidenceChunkEntity).GetProperty("ContentType", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheEvidenceChunkEntity).GetField("<ContentType>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
maxLength: 128);
contentType.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
contentType.AddAnnotation("Relational:ColumnName", "content_type");
var createdAt = runtimeEntityType.AddProperty(
"CreatedAt",
typeof(DateTimeOffset),
propertyInfo: typeof(ProvcacheEvidenceChunkEntity).GetProperty("CreatedAt", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheEvidenceChunkEntity).GetField("<CreatedAt>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
sentinel: new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)));
createdAt.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
createdAt.AddAnnotation("Relational:ColumnName", "created_at");
var proofRoot = runtimeEntityType.AddProperty(
"ProofRoot",
typeof(string),
propertyInfo: typeof(ProvcacheEvidenceChunkEntity).GetProperty("ProofRoot", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheEvidenceChunkEntity).GetField("<ProofRoot>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
maxLength: 128);
proofRoot.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
proofRoot.AddAnnotation("Relational:ColumnName", "proof_root");
var key = runtimeEntityType.AddKey(
new[] { chunkId });
runtimeEntityType.SetPrimaryKey(key);
var index = runtimeEntityType.AddIndex(
new[] { proofRoot });
var index0 = runtimeEntityType.AddIndex(
new[] { proofRoot, chunkIndex },
unique: true);
return runtimeEntityType;
}
public static void CreateAnnotations(RuntimeEntityType runtimeEntityType)
{
runtimeEntityType.AddAnnotation("Relational:FunctionName", null);
runtimeEntityType.AddAnnotation("Relational:Schema", "provcache");
runtimeEntityType.AddAnnotation("Relational:SqlQuery", null);
runtimeEntityType.AddAnnotation("Relational:TableName", "prov_evidence_chunks");
runtimeEntityType.AddAnnotation("Relational:ViewName", null);
runtimeEntityType.AddAnnotation("Relational:ViewSchema", null);
Customize(runtimeEntityType);
}
static partial void Customize(RuntimeEntityType runtimeEntityType);
}
}

View File

@@ -0,0 +1,190 @@
// <auto-generated />
using System;
using System.Reflection;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using StellaOps.Provcache.Entities;
#pragma warning disable 219, 612, 618
#nullable disable
namespace StellaOps.Provcache.Postgres.EfCore.CompiledModels
{
[EntityFrameworkInternal]
public partial class ProvcacheItemEntityEntityType
{
public static RuntimeEntityType Create(RuntimeModel model, RuntimeEntityType baseEntityType = null)
{
var runtimeEntityType = model.AddEntityType(
"StellaOps.Provcache.Entities.ProvcacheItemEntity",
typeof(ProvcacheItemEntity),
baseEntityType,
propertyCount: 14,
unnamedIndexCount: 5,
keyCount: 1);
var veriKey = runtimeEntityType.AddProperty(
"VeriKey",
typeof(string),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("VeriKey", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<VeriKey>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
afterSaveBehavior: PropertySaveBehavior.Throw,
maxLength: 512);
veriKey.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
veriKey.AddAnnotation("Relational:ColumnName", "verikey");
var createdAt = runtimeEntityType.AddProperty(
"CreatedAt",
typeof(DateTimeOffset),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("CreatedAt", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<CreatedAt>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
sentinel: new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)));
createdAt.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
createdAt.AddAnnotation("Relational:ColumnName", "created_at");
var digestVersion = runtimeEntityType.AddProperty(
"DigestVersion",
typeof(string),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("DigestVersion", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<DigestVersion>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
maxLength: 16);
digestVersion.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
digestVersion.AddAnnotation("Relational:ColumnName", "digest_version");
var expiresAt = runtimeEntityType.AddProperty(
"ExpiresAt",
typeof(DateTimeOffset),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("ExpiresAt", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<ExpiresAt>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
sentinel: new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)));
expiresAt.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
expiresAt.AddAnnotation("Relational:ColumnName", "expires_at");
var feedEpoch = runtimeEntityType.AddProperty(
"FeedEpoch",
typeof(string),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("FeedEpoch", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<FeedEpoch>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
maxLength: 64);
feedEpoch.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
feedEpoch.AddAnnotation("Relational:ColumnName", "feed_epoch");
var hitCount = runtimeEntityType.AddProperty(
"HitCount",
typeof(long),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("HitCount", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<HitCount>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
sentinel: 0L);
hitCount.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
hitCount.AddAnnotation("Relational:ColumnName", "hit_count");
var lastAccessedAt = runtimeEntityType.AddProperty(
"LastAccessedAt",
typeof(DateTimeOffset?),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("LastAccessedAt", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<LastAccessedAt>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
nullable: true);
lastAccessedAt.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
lastAccessedAt.AddAnnotation("Relational:ColumnName", "last_accessed_at");
var policyHash = runtimeEntityType.AddProperty(
"PolicyHash",
typeof(string),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("PolicyHash", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<PolicyHash>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
maxLength: 128);
policyHash.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
policyHash.AddAnnotation("Relational:ColumnName", "policy_hash");
var proofRoot = runtimeEntityType.AddProperty(
"ProofRoot",
typeof(string),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("ProofRoot", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<ProofRoot>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
maxLength: 128);
proofRoot.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
proofRoot.AddAnnotation("Relational:ColumnName", "proof_root");
var replaySeed = runtimeEntityType.AddProperty(
"ReplaySeed",
typeof(string),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("ReplaySeed", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<ReplaySeed>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly));
replaySeed.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
replaySeed.AddAnnotation("Relational:ColumnName", "replay_seed");
replaySeed.AddAnnotation("Relational:ColumnType", "jsonb");
var signerSetHash = runtimeEntityType.AddProperty(
"SignerSetHash",
typeof(string),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("SignerSetHash", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<SignerSetHash>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
maxLength: 128);
signerSetHash.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
signerSetHash.AddAnnotation("Relational:ColumnName", "signer_set_hash");
var trustScore = runtimeEntityType.AddProperty(
"TrustScore",
typeof(int),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("TrustScore", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<TrustScore>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
sentinel: 0);
trustScore.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
trustScore.AddAnnotation("Relational:ColumnName", "trust_score");
var updatedAt = runtimeEntityType.AddProperty(
"UpdatedAt",
typeof(DateTimeOffset),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("UpdatedAt", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<UpdatedAt>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
sentinel: new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)));
updatedAt.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
updatedAt.AddAnnotation("Relational:ColumnName", "updated_at");
var verdictHash = runtimeEntityType.AddProperty(
"VerdictHash",
typeof(string),
propertyInfo: typeof(ProvcacheItemEntity).GetProperty("VerdictHash", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheItemEntity).GetField("<VerdictHash>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
maxLength: 128);
verdictHash.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
verdictHash.AddAnnotation("Relational:ColumnName", "verdict_hash");
var key = runtimeEntityType.AddKey(
new[] { veriKey });
runtimeEntityType.SetPrimaryKey(key);
var index = runtimeEntityType.AddIndex(
new[] { createdAt });
var index0 = runtimeEntityType.AddIndex(
new[] { expiresAt });
var index1 = runtimeEntityType.AddIndex(
new[] { feedEpoch });
var index2 = runtimeEntityType.AddIndex(
new[] { policyHash });
var index3 = runtimeEntityType.AddIndex(
new[] { signerSetHash });
return runtimeEntityType;
}
public static void CreateAnnotations(RuntimeEntityType runtimeEntityType)
{
runtimeEntityType.AddAnnotation("Relational:FunctionName", null);
runtimeEntityType.AddAnnotation("Relational:Schema", "provcache");
runtimeEntityType.AddAnnotation("Relational:SqlQuery", null);
runtimeEntityType.AddAnnotation("Relational:TableName", "provcache_items");
runtimeEntityType.AddAnnotation("Relational:ViewName", null);
runtimeEntityType.AddAnnotation("Relational:ViewSchema", null);
Customize(runtimeEntityType);
}
static partial void Customize(RuntimeEntityType runtimeEntityType);
}
}

View File

@@ -0,0 +1,121 @@
// <auto-generated />
using System;
using System.Reflection;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Metadata;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using StellaOps.Provcache.Entities;
#pragma warning disable 219, 612, 618
#nullable disable
namespace StellaOps.Provcache.Postgres.EfCore.CompiledModels
{
[EntityFrameworkInternal]
public partial class ProvcacheRevocationEntityEntityType
{
public static RuntimeEntityType Create(RuntimeModel model, RuntimeEntityType baseEntityType = null)
{
var runtimeEntityType = model.AddEntityType(
"StellaOps.Provcache.Entities.ProvcacheRevocationEntity",
typeof(ProvcacheRevocationEntity),
baseEntityType,
propertyCount: 7,
unnamedIndexCount: 2,
keyCount: 1);
var revocationId = runtimeEntityType.AddProperty(
"RevocationId",
typeof(Guid),
propertyInfo: typeof(ProvcacheRevocationEntity).GetProperty("RevocationId", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheRevocationEntity).GetField("<RevocationId>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
valueGenerated: ValueGenerated.OnAdd,
afterSaveBehavior: PropertySaveBehavior.Throw,
sentinel: new Guid("00000000-0000-0000-0000-000000000000"));
revocationId.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
revocationId.AddAnnotation("Relational:ColumnName", "revocation_id");
var actor = runtimeEntityType.AddProperty(
"Actor",
typeof(string),
propertyInfo: typeof(ProvcacheRevocationEntity).GetProperty("Actor", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheRevocationEntity).GetField("<Actor>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
nullable: true,
maxLength: 256);
actor.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
actor.AddAnnotation("Relational:ColumnName", "actor");
var createdAt = runtimeEntityType.AddProperty(
"CreatedAt",
typeof(DateTimeOffset),
propertyInfo: typeof(ProvcacheRevocationEntity).GetProperty("CreatedAt", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheRevocationEntity).GetField("<CreatedAt>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
sentinel: new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)));
createdAt.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
createdAt.AddAnnotation("Relational:ColumnName", "created_at");
var entriesAffected = runtimeEntityType.AddProperty(
"EntriesAffected",
typeof(long),
propertyInfo: typeof(ProvcacheRevocationEntity).GetProperty("EntriesAffected", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheRevocationEntity).GetField("<EntriesAffected>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
sentinel: 0L);
entriesAffected.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
entriesAffected.AddAnnotation("Relational:ColumnName", "entries_affected");
var reason = runtimeEntityType.AddProperty(
"Reason",
typeof(string),
propertyInfo: typeof(ProvcacheRevocationEntity).GetProperty("Reason", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheRevocationEntity).GetField("<Reason>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
nullable: true,
maxLength: 512);
reason.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
reason.AddAnnotation("Relational:ColumnName", "reason");
var revocationType = runtimeEntityType.AddProperty(
"RevocationType",
typeof(string),
propertyInfo: typeof(ProvcacheRevocationEntity).GetProperty("RevocationType", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheRevocationEntity).GetField("<RevocationType>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
maxLength: 64);
revocationType.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
revocationType.AddAnnotation("Relational:ColumnName", "revocation_type");
var targetHash = runtimeEntityType.AddProperty(
"TargetHash",
typeof(string),
propertyInfo: typeof(ProvcacheRevocationEntity).GetProperty("TargetHash", BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly),
fieldInfo: typeof(ProvcacheRevocationEntity).GetField("<TargetHash>k__BackingField", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.DeclaredOnly),
maxLength: 256);
targetHash.AddAnnotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.None);
targetHash.AddAnnotation("Relational:ColumnName", "target_hash");
var key = runtimeEntityType.AddKey(
new[] { revocationId });
runtimeEntityType.SetPrimaryKey(key);
var index = runtimeEntityType.AddIndex(
new[] { createdAt });
var index0 = runtimeEntityType.AddIndex(
new[] { targetHash });
return runtimeEntityType;
}
public static void CreateAnnotations(RuntimeEntityType runtimeEntityType)
{
runtimeEntityType.AddAnnotation("Relational:FunctionName", null);
runtimeEntityType.AddAnnotation("Relational:Schema", "provcache");
runtimeEntityType.AddAnnotation("Relational:SqlQuery", null);
runtimeEntityType.AddAnnotation("Relational:TableName", "prov_revocations");
runtimeEntityType.AddAnnotation("Relational:ViewName", null);
runtimeEntityType.AddAnnotation("Relational:ViewSchema", null);
Customize(runtimeEntityType);
}
static partial void Customize(RuntimeEntityType runtimeEntityType);
}
}

View File

@@ -0,0 +1,32 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Design;
namespace StellaOps.Provcache.Postgres.EfCore.Context;
/// <summary>
/// Design-time DbContext factory for dotnet ef CLI tooling.
/// Used by scaffold and optimize commands.
/// </summary>
public sealed class ProvcacheDesignTimeDbContextFactory : IDesignTimeDbContextFactory<ProvcacheDbContext>
{
private const string DefaultConnectionString =
"Host=localhost;Port=55433;Database=postgres;Username=postgres;Password=postgres;Search Path=provcache,public";
private const string ConnectionStringEnvironmentVariable = "STELLAOPS_PROVCACHE_EF_CONNECTION";
public ProvcacheDbContext CreateDbContext(string[] args)
{
var connectionString = ResolveConnectionString();
var options = new DbContextOptionsBuilder<ProvcacheDbContext>()
.UseNpgsql(connectionString)
.Options;
return new ProvcacheDbContext(options);
}
private static string ResolveConnectionString()
{
var fromEnvironment = Environment.GetEnvironmentVariable(ConnectionStringEnvironmentVariable);
return string.IsNullOrWhiteSpace(fromEnvironment) ? DefaultConnectionString : fromEnvironment;
}
}

View File

@@ -0,0 +1,74 @@
-- ============================================================================
-- Provcache — Initial Schema
-- Extracted from ProvcacheDbContext OnModelCreating
-- ============================================================================
CREATE SCHEMA IF NOT EXISTS provcache;
-- Provcache items (verification cache entries)
CREATE TABLE IF NOT EXISTS provcache.provcache_item_entity (
veri_key VARCHAR(512) PRIMARY KEY,
digest_version VARCHAR(16) NOT NULL,
verdict_hash VARCHAR(128) NOT NULL,
proof_root VARCHAR(128) NOT NULL,
replay_seed JSONB NOT NULL,
policy_hash VARCHAR(128) NOT NULL,
signer_set_hash VARCHAR(128) NOT NULL,
feed_epoch VARCHAR(64) NOT NULL,
trust_score INTEGER NOT NULL DEFAULT 0,
hit_count BIGINT NOT NULL DEFAULT 0,
created_at TIMESTAMPTZ NOT NULL,
expires_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL,
last_accessed_at TIMESTAMPTZ
);
CREATE INDEX IF NOT EXISTS ix_provcache_items_policy_hash
ON provcache.provcache_item_entity (policy_hash);
CREATE INDEX IF NOT EXISTS ix_provcache_items_signer_set_hash
ON provcache.provcache_item_entity (signer_set_hash);
CREATE INDEX IF NOT EXISTS ix_provcache_items_feed_epoch
ON provcache.provcache_item_entity (feed_epoch);
CREATE INDEX IF NOT EXISTS ix_provcache_items_expires_at
ON provcache.provcache_item_entity (expires_at);
CREATE INDEX IF NOT EXISTS ix_provcache_items_created_at
ON provcache.provcache_item_entity (created_at);
-- Evidence chunks
CREATE TABLE IF NOT EXISTS provcache.provcache_evidence_chunk_entity (
chunk_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
proof_root VARCHAR(128) NOT NULL,
chunk_index INTEGER NOT NULL,
chunk_hash VARCHAR(128) NOT NULL,
blob BYTEA NOT NULL,
blob_size INTEGER NOT NULL,
content_type VARCHAR(128) NOT NULL,
created_at TIMESTAMPTZ NOT NULL
);
CREATE INDEX IF NOT EXISTS ix_provcache_evidence_chunks_proof_root
ON provcache.provcache_evidence_chunk_entity (proof_root);
CREATE UNIQUE INDEX IF NOT EXISTS ix_provcache_evidence_chunks_proof_root_chunk_index
ON provcache.provcache_evidence_chunk_entity (proof_root, chunk_index);
-- Revocations
CREATE TABLE IF NOT EXISTS provcache.provcache_revocation_entity (
revocation_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
revocation_type VARCHAR(64) NOT NULL,
target_hash VARCHAR(256) NOT NULL,
reason VARCHAR(512),
actor VARCHAR(256),
entries_affected BIGINT NOT NULL,
created_at TIMESTAMPTZ NOT NULL
);
CREATE INDEX IF NOT EXISTS ix_provcache_revocations_created_at
ON provcache.provcache_revocation_entity (created_at);
CREATE INDEX IF NOT EXISTS ix_provcache_revocations_target_hash
ON provcache.provcache_revocation_entity (target_hash);

View File

@@ -0,0 +1,25 @@
using Microsoft.EntityFrameworkCore;
using Npgsql;
using StellaOps.Provcache.Postgres.EfCore.CompiledModels;
namespace StellaOps.Provcache.Postgres;
internal static class ProvcacheDbContextFactory
{
public static ProvcacheDbContext Create(NpgsqlConnection connection, int commandTimeoutSeconds, string schemaName)
{
var normalizedSchema = string.IsNullOrWhiteSpace(schemaName)
? ProvcacheDbContext.DefaultSchemaName
: schemaName.Trim();
var optionsBuilder = new DbContextOptionsBuilder<ProvcacheDbContext>()
.UseNpgsql(connection, npgsql => npgsql.CommandTimeout(commandTimeoutSeconds));
if (string.Equals(normalizedSchema, ProvcacheDbContext.DefaultSchemaName, StringComparison.Ordinal))
{
optionsBuilder.UseModel(ProvcacheDbContextModel.Instance);
}
return new ProvcacheDbContext(optionsBuilder.Options, normalizedSchema);
}
}

View File

@@ -5,11 +5,20 @@ namespace StellaOps.Provcache.Postgres;
/// <summary>
/// EF Core DbContext for Provcache storage.
/// SQL migrations remain authoritative; EF models are scaffolded FROM schema.
/// </summary>
public class ProvcacheDbContext : DbContext
public partial class ProvcacheDbContext : DbContext
{
public ProvcacheDbContext(DbContextOptions<ProvcacheDbContext> options) : base(options)
public const string DefaultSchemaName = "provcache";
private readonly string _schemaName;
public ProvcacheDbContext(DbContextOptions<ProvcacheDbContext> options, string? schemaName = null)
: base(options)
{
_schemaName = string.IsNullOrWhiteSpace(schemaName)
? DefaultSchemaName
: schemaName.Trim();
}
public DbSet<ProvcacheItemEntity> ProvcacheItems => Set<ProvcacheItemEntity>();
@@ -18,15 +27,15 @@ public class ProvcacheDbContext : DbContext
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
var schema = _schemaName;
modelBuilder.HasDefaultSchema("provcache");
modelBuilder.HasDefaultSchema(schema);
// ProvcacheItemEntity configuration
modelBuilder.Entity<ProvcacheItemEntity>(entity =>
{
entity.HasKey(e => e.VeriKey);
entity.HasIndex(e => e.PolicyHash);
entity.HasIndex(e => e.SignerSetHash);
entity.HasIndex(e => e.FeedEpoch);
@@ -54,5 +63,9 @@ public class ProvcacheDbContext : DbContext
entity.HasIndex(e => e.CreatedAt);
entity.HasIndex(e => e.TargetHash);
});
OnModelCreatingPartial(modelBuilder);
}
partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

View File

@@ -12,8 +12,23 @@
<Description>PostgreSQL storage implementation for StellaOps Provcache</Description>
</PropertyGroup>
<ItemGroup>
<InternalsVisibleTo Include="StellaOps.Provcache.Postgres.Tests" />
</ItemGroup>
<ItemGroup>
<!-- Embed SQL migrations as resources -->
<EmbeddedResource Include="Migrations\**\*.sql" />
</ItemGroup>
<ItemGroup>
<!-- Prevent automatic compiled-model binding so non-default schemas can build runtime models. -->
<Compile Remove="EfCore\CompiledModels\ProvcacheDbContextAssemblyAttributes.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" PrivateAssets="all" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />