feat: enforce tenant isolation and shared question bank

This commit is contained in:
2026-07-27 16:59:12 +08:00
parent 28e9a9fa41
commit db4c7b4496
137 changed files with 6402 additions and 112274 deletions

View File

@@ -89,7 +89,7 @@ public sealed class Payment : AuditableTenantEntity
public JsonElement RawPayload { get; set; } = JsonDefaults.Object();
}
public sealed class PaymentEvent : Entity
public sealed class PaymentEvent : Entity, ITenantOwned
{
public Guid TenantId { get; set; }
public Guid? PaymentId { get; set; }
@@ -103,7 +103,7 @@ public sealed class PaymentEvent : Entity
public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
}
public sealed class Entitlement : Entity
public sealed class Entitlement : Entity, ITenantOwned
{
public Guid TenantId { get; set; }
public Guid UserId { get; set; }
@@ -213,7 +213,7 @@ public sealed class TenantSubscription : AuditableTenantEntity
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
}
public sealed class TenantUsageRecord : Entity
public sealed class TenantUsageRecord : Entity, ITenantOwned
{
public Guid TenantId { get; set; }
public string MetricKey { get; set; } = string.Empty;
@@ -248,7 +248,7 @@ public sealed class CommerceRefundRequest : AuditableTenantEntity
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
}
public sealed class CommerceRefundEvent : Entity
public sealed class CommerceRefundEvent : Entity, ITenantOwned
{
public Guid TenantId { get; set; }
public Guid RefundRequestId { get; set; }
@@ -285,7 +285,7 @@ public sealed class CommerceReconciliationBatch : AuditableTenantEntity
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
}
public sealed class CommerceReconciliationItem : Entity
public sealed class CommerceReconciliationItem : Entity, ITenantOwned
{
public Guid TenantId { get; set; }
public Guid BatchId { get; set; }
@@ -344,7 +344,7 @@ public sealed class CommerceReconciliationIssue : AuditableTenantEntity
public JsonElement Metadata { get; set; } = JsonDefaults.Object();
}
public sealed class CommerceReconciliationIssueEvent : Entity
public sealed class CommerceReconciliationIssueEvent : Entity, ITenantOwned
{
public Guid TenantId { get; set; }
public Guid IssueId { get; set; }