feat: add content platform operations persistence

This commit is contained in:
xiong
2026-07-26 05:58:38 +08:00
parent 3eb9f111ed
commit 9fd8708fa5
9 changed files with 15299 additions and 1 deletions

View File

@@ -2816,6 +2816,105 @@ namespace Tiku.Infrastructure.Persistence.Migrations
b.ToTable("tenant_usage_records", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Content.AiRecommendationReport", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<JsonElement>("ContextPayload")
.ValueGeneratedOnAdd()
.HasColumnType("jsonb")
.HasColumnName("context_payload")
.HasDefaultValueSql("'{}'::jsonb");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<string>("ErrorMessage")
.HasColumnType("text")
.HasColumnName("error_message");
b.Property<DateTimeOffset?>("GeneratedAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("generated_at");
b.Property<JsonElement>("InputPayload")
.ValueGeneratedOnAdd()
.HasColumnType("jsonb")
.HasColumnName("input_payload")
.HasDefaultValueSql("'{}'::jsonb");
b.Property<string>("Model")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("model");
b.Property<string>("PromptVersion")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("prompt_version");
b.Property<string>("Provider")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("provider");
b.Property<Guid?>("RegionId")
.HasColumnType("uuid")
.HasColumnName("region_id");
b.Property<JsonElement>("ResultPayload")
.ValueGeneratedOnAdd()
.HasColumnType("jsonb")
.HasColumnName("result_payload")
.HasDefaultValueSql("'{}'::jsonb");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("status");
b.Property<Guid>("TenantId")
.HasColumnType("uuid")
.HasColumnName("tenant_id");
b.Property<DateTimeOffset>("UpdatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at")
.HasDefaultValueSql("now()");
b.Property<Guid>("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.HasKey("Id")
.HasName("pk_ai_recommendation_reports");
b.HasAlternateKey("TenantId", "Id")
.HasName("ak_ai_recommendation_reports_tenant_id_id");
b.HasIndex("UserId")
.HasDatabaseName("ix_ai_recommendation_reports_user_id");
b.HasIndex("TenantId", "RegionId", "CreatedAt")
.HasDatabaseName("ix_ai_recommendation_reports_tenant_id_region_id_created_at");
b.HasIndex("TenantId", "UserId", "CreatedAt")
.HasDatabaseName("ix_ai_recommendation_reports_tenant_id_user_id_created_at");
b.ToTable("ai_recommendation_reports", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Content.AppAsset", b =>
{
b.Property<Guid>("Id")
@@ -3015,6 +3114,29 @@ namespace Tiku.Infrastructure.Persistence.Migrations
.HasColumnName("security_flags")
.HasDefaultValueSql("'{}'::jsonb");
b.Property<string>("SecurityScanProvider")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("security_scan_provider");
b.Property<string>("SecurityScanStatus")
.IsRequired()
.ValueGeneratedOnAdd()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasDefaultValue("not_required")
.HasColumnName("security_scan_status");
b.Property<JsonElement>("SecurityScanSummary")
.ValueGeneratedOnAdd()
.HasColumnType("jsonb")
.HasColumnName("security_scan_summary")
.HasDefaultValueSql("'{}'::jsonb");
b.Property<DateTimeOffset?>("SecurityScannedAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("security_scanned_at");
b.Property<int>("SortOrder")
.HasColumnType("integer")
.HasColumnName("sort_order");
@@ -3140,6 +3262,9 @@ namespace Tiku.Infrastructure.Persistence.Migrations
b.HasIndex("TenantId", "UploadStatus", "Status", "UpdatedAt")
.HasDatabaseName("ix_content_assets_tenant_id_upload_status_status_updated_at");
b.HasIndex("TenantId", "SecurityScanStatus", "UploadStatus", "Status", "UpdatedAt")
.HasDatabaseName("ix_content_assets_tenant_id_security_scan_status_upload_status~");
b.HasIndex("TenantId", "Status", "Visibility", "AssetType", "RegionId", "SubjectId", "CategoryId", "SortOrder")
.HasDatabaseName("ix_content_assets_tenant_id_status_visibility_asset_type_regio~");
@@ -3155,6 +3280,193 @@ namespace Tiku.Infrastructure.Persistence.Migrations
});
});
modelBuilder.Entity("Tiku.Domain.Content.ContentAssetAccessEvent", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<string>("AccessType")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("access_type");
b.Property<string>("ActorRole")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("actor_role");
b.Property<Guid?>("AssetId")
.HasColumnType("uuid")
.HasColumnName("asset_id");
b.Property<string>("AssetType")
.HasMaxLength(50)
.HasColumnType("character varying(50)")
.HasColumnName("asset_type");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<string>("DenyCode")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("deny_code");
b.Property<string>("Disposition")
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("disposition");
b.Property<int?>("ExpiresInSeconds")
.HasColumnType("integer")
.HasColumnName("expires_in_seconds");
b.Property<string>("IpAddress")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("ip_address");
b.Property<JsonElement>("Metadata")
.ValueGeneratedOnAdd()
.HasColumnType("jsonb")
.HasColumnName("metadata")
.HasDefaultValueSql("'{}'::jsonb");
b.Property<string>("Result")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("result");
b.Property<string>("SignatureMode")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("signature_mode");
b.Property<string>("StorageProvider")
.HasMaxLength(50)
.HasColumnType("character varying(50)")
.HasColumnName("storage_provider");
b.Property<Guid>("TenantId")
.HasColumnType("uuid")
.HasColumnName("tenant_id");
b.Property<string>("UserAgent")
.HasMaxLength(1024)
.HasColumnType("character varying(1024)")
.HasColumnName("user_agent");
b.Property<Guid?>("UserId")
.HasColumnType("uuid")
.HasColumnName("user_id");
b.Property<string>("Visibility")
.HasMaxLength(50)
.HasColumnType("character varying(50)")
.HasColumnName("visibility");
b.HasKey("Id")
.HasName("pk_content_asset_access_events");
b.HasAlternateKey("TenantId", "Id")
.HasName("ak_content_asset_access_events_tenant_id_id");
b.HasIndex("UserId")
.HasDatabaseName("ix_content_asset_access_events_user_id");
b.HasIndex("TenantId", "AssetId", "CreatedAt")
.HasDatabaseName("ix_content_asset_access_events_tenant_id_asset_id_created_at");
b.HasIndex("TenantId", "UserId", "CreatedAt")
.HasDatabaseName("ix_content_asset_access_events_tenant_id_user_id_created_at")
.HasFilter("user_id is not null");
b.HasIndex("TenantId", "AccessType", "Result", "CreatedAt")
.HasDatabaseName("ix_content_asset_access_events_tenant_id_access_type_result_cr~");
b.ToTable("content_asset_access_events", null, t =>
{
t.HasCheckConstraint("ck_content_asset_access_events_expiry", "expires_in_seconds is null or expires_in_seconds > 0");
});
});
modelBuilder.Entity("Tiku.Domain.Content.ContentAssetSecurityScanEvent", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<Guid?>("AssetId")
.HasColumnType("uuid")
.HasColumnName("asset_id");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<JsonElement>("Details")
.ValueGeneratedOnAdd()
.HasColumnType("jsonb")
.HasColumnName("details")
.HasDefaultValueSql("'{}'::jsonb");
b.PrimitiveCollection<string[]>("IssueCodes")
.IsRequired()
.ValueGeneratedOnAdd()
.HasColumnType("text[]")
.HasColumnName("issue_codes")
.HasDefaultValueSql("'{}'::text[]");
b.Property<string>("Provider")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("provider");
b.Property<string>("RiskLevel")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("risk_level");
b.Property<string>("ScanStatus")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("scan_status");
b.Property<Guid>("TenantId")
.HasColumnType("uuid")
.HasColumnName("tenant_id");
b.HasKey("Id")
.HasName("pk_content_asset_security_scan_events");
b.HasAlternateKey("TenantId", "Id")
.HasName("ak_content_asset_security_scan_events_tenant_id_id");
b.HasIndex("TenantId", "AssetId", "CreatedAt")
.HasDatabaseName("ix_content_asset_security_scan_events_tenant_id_asset_id_creat~");
b.HasIndex("TenantId", "ScanStatus", "RiskLevel", "CreatedAt")
.HasDatabaseName("ix_content_asset_security_scan_events_tenant_id_scan_status_ri~");
b.ToTable("content_asset_security_scan_events", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Content.ContentEntry", b =>
{
b.Property<Guid>("Id")
@@ -4332,6 +4644,117 @@ namespace Tiku.Infrastructure.Persistence.Migrations
});
});
modelBuilder.Entity("Tiku.Domain.Content.QuestionBankGrant", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.PrimitiveCollection<string[]>("AllowedPlanCodes")
.IsRequired()
.ValueGeneratedOnAdd()
.HasColumnType("text[]")
.HasColumnName("allowed_plan_codes")
.HasDefaultValueSql("'{}'::text[]");
b.PrimitiveCollection<Guid[]>("AllowedRegionIds")
.IsRequired()
.ValueGeneratedOnAdd()
.HasColumnType("uuid[]")
.HasColumnName("allowed_region_ids")
.HasDefaultValueSql("'{}'::uuid[]");
b.PrimitiveCollection<Guid[]>("AllowedSubjectIds")
.IsRequired()
.ValueGeneratedOnAdd()
.HasColumnType("uuid[]")
.HasColumnName("allowed_subject_ids")
.HasDefaultValueSql("'{}'::uuid[]");
b.PrimitiveCollection<Guid[]>("AllowedTenantIds")
.IsRequired()
.ValueGeneratedOnAdd()
.HasColumnType("uuid[]")
.HasColumnName("allowed_tenant_ids")
.HasDefaultValueSql("'{}'::uuid[]");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<Guid?>("CreatedBy")
.HasColumnType("uuid")
.HasColumnName("created_by");
b.Property<DateTimeOffset?>("ExpiresAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("expires_at");
b.Property<string>("GrantScope")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("grant_scope");
b.Property<JsonElement>("Metadata")
.ValueGeneratedOnAdd()
.HasColumnType("jsonb")
.HasColumnName("metadata")
.HasDefaultValueSql("'{}'::jsonb");
b.Property<Guid>("SourceQuestionBankId")
.HasColumnType("uuid")
.HasColumnName("source_question_bank_id");
b.Property<DateTimeOffset?>("StartsAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("starts_at");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("status");
b.Property<DateTimeOffset>("UpdatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at")
.HasDefaultValueSql("now()");
b.Property<Guid?>("UpdatedBy")
.HasColumnType("uuid")
.HasColumnName("updated_by");
b.HasKey("Id")
.HasName("pk_question_bank_grants");
b.HasIndex("AllowedPlanCodes")
.HasDatabaseName("ix_question_bank_grants_allowed_plan_codes");
NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("AllowedPlanCodes"), "gin");
b.HasIndex("AllowedTenantIds")
.HasDatabaseName("ix_question_bank_grants_allowed_tenant_ids");
NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("AllowedTenantIds"), "gin");
b.HasIndex("CreatedBy")
.HasDatabaseName("ix_question_bank_grants_created_by");
b.HasIndex("UpdatedBy")
.HasDatabaseName("ix_question_bank_grants_updated_by");
b.HasIndex("SourceQuestionBankId", "Status", "StartsAt", "ExpiresAt")
.HasDatabaseName("ix_question_bank_grants_source_question_bank_id_status_starts_~");
b.ToTable("question_bank_grants", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Content.QuestionCollection", b =>
{
b.Property<Guid>("Id")
@@ -4770,6 +5193,136 @@ namespace Tiku.Infrastructure.Persistence.Migrations
b.ToTable("subject_shares", (string)null);
});
modelBuilder.Entity("Tiku.Domain.Content.TenantQuestionBankAdoption", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid")
.HasColumnName("id")
.HasDefaultValueSql("gen_random_uuid()");
b.Property<string>("AdoptionMode")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("adoption_mode");
b.Property<int>("CopiedQuestionCount")
.HasColumnType("integer")
.HasColumnName("copied_question_count");
b.Property<DateTimeOffset>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("created_at")
.HasDefaultValueSql("now()");
b.Property<Guid?>("CreatedBy")
.HasColumnType("uuid")
.HasColumnName("created_by");
b.Property<Guid?>("GrantId")
.HasColumnType("uuid")
.HasColumnName("grant_id");
b.Property<DateTimeOffset?>("LastSyncedAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("last_synced_at");
b.Property<JsonElement>("Metadata")
.ValueGeneratedOnAdd()
.HasColumnType("jsonb")
.HasColumnName("metadata")
.HasDefaultValueSql("'{}'::jsonb");
b.Property<Guid>("SourceQuestionBankId")
.HasColumnType("uuid")
.HasColumnName("source_question_bank_id");
b.Property<JsonElement>("SourceSnapshot")
.ValueGeneratedOnAdd()
.HasColumnType("jsonb")
.HasColumnName("source_snapshot")
.HasDefaultValueSql("'{}'::jsonb");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("status");
b.Property<string>("SyncStatus")
.IsRequired()
.HasMaxLength(32)
.HasColumnType("character varying(32)")
.HasColumnName("sync_status");
b.Property<Guid?>("TargetCollectionId")
.HasColumnType("uuid")
.HasColumnName("target_collection_id");
b.Property<Guid?>("TargetEntryId")
.HasColumnType("uuid")
.HasColumnName("target_entry_id");
b.Property<Guid?>("TargetQuestionBankId")
.HasColumnType("uuid")
.HasColumnName("target_question_bank_id");
b.Property<Guid>("TenantId")
.HasColumnType("uuid")
.HasColumnName("tenant_id");
b.Property<DateTimeOffset>("UpdatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("timestamp with time zone")
.HasColumnName("updated_at")
.HasDefaultValueSql("now()");
b.Property<Guid?>("UpdatedBy")
.HasColumnType("uuid")
.HasColumnName("updated_by");
b.HasKey("Id")
.HasName("pk_tenant_question_bank_adoptions");
b.HasAlternateKey("TenantId", "Id")
.HasName("ak_tenant_question_bank_adoptions_tenant_id_id");
b.HasIndex("CreatedBy")
.HasDatabaseName("ix_tenant_question_bank_adoptions_created_by");
b.HasIndex("GrantId")
.HasDatabaseName("ix_tenant_question_bank_adoptions_grant_id");
b.HasIndex("SourceQuestionBankId")
.HasDatabaseName("ix_tenant_question_bank_adoptions_source_question_bank_id");
b.HasIndex("UpdatedBy")
.HasDatabaseName("ix_tenant_question_bank_adoptions_updated_by");
b.HasIndex("TenantId", "SourceQuestionBankId")
.IsUnique()
.HasDatabaseName("ix_tenant_question_bank_adoptions_tenant_id_source_question_ba~");
b.HasIndex("TenantId", "TargetCollectionId")
.HasDatabaseName("ix_tenant_question_bank_adoptions_tenant_id_target_collection_~");
b.HasIndex("TenantId", "TargetEntryId")
.HasDatabaseName("ix_tenant_question_bank_adoptions_tenant_id_target_entry_id");
b.HasIndex("TenantId", "TargetQuestionBankId")
.HasDatabaseName("ix_tenant_question_bank_adoptions_tenant_id_target_question_ba~");
b.HasIndex("TenantId", "Status", "UpdatedAt")
.HasDatabaseName("ix_tenant_question_bank_adoptions_tenant_id_status_updated_at");
b.ToTable("tenant_question_bank_adoptions", null, t =>
{
t.HasCheckConstraint("ck_tenant_question_bank_adoptions_copied_count", "copied_question_count >= 0");
});
});
modelBuilder.Entity("Tiku.Domain.Content.UserWordFavorite", b =>
{
b.Property<Guid>("Id")
@@ -11228,6 +11781,30 @@ namespace Tiku.Infrastructure.Persistence.Migrations
.HasConstraintName("fk_tenant_usage_records_tenants_tenant_id");
});
modelBuilder.Entity("Tiku.Domain.Content.AiRecommendationReport", b =>
{
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
.WithMany()
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_ai_recommendation_reports_tenants_tenant_id");
b.HasOne("Tiku.Domain.Identity.User", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_ai_recommendation_reports_users_user_id");
b.HasOne("Tiku.Domain.Catalog.Region", null)
.WithMany()
.HasForeignKey("TenantId", "RegionId")
.HasPrincipalKey("TenantId", "Id")
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("fk_ai_recommendation_reports_regions_tenant_id_region_id");
});
modelBuilder.Entity("Tiku.Domain.Content.AppAsset", b =>
{
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
@@ -11294,6 +11871,46 @@ namespace Tiku.Infrastructure.Persistence.Migrations
.HasConstraintName("fk_content_assets_subjects_tenant_id_subject_id");
});
modelBuilder.Entity("Tiku.Domain.Content.ContentAssetAccessEvent", b =>
{
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
.WithMany()
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_content_asset_access_events_tenants_tenant_id");
b.HasOne("Tiku.Domain.Identity.User", null)
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.SetNull)
.HasConstraintName("fk_content_asset_access_events_users_user_id");
b.HasOne("Tiku.Domain.Content.ContentAsset", null)
.WithMany()
.HasForeignKey("TenantId", "AssetId")
.HasPrincipalKey("TenantId", "Id")
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("fk_content_asset_access_events_content_assets_tenant_id_asset_~");
});
modelBuilder.Entity("Tiku.Domain.Content.ContentAssetSecurityScanEvent", b =>
{
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
.WithMany()
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_content_asset_security_scan_events_tenants_tenant_id");
b.HasOne("Tiku.Domain.Content.ContentAsset", null)
.WithMany()
.HasForeignKey("TenantId", "AssetId")
.HasPrincipalKey("TenantId", "Id")
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("fk_content_asset_security_scan_events_content_assets_tenant_id~");
});
modelBuilder.Entity("Tiku.Domain.Content.ContentEntry", b =>
{
b.HasOne("Tiku.Domain.Identity.User", null)
@@ -11628,6 +12245,28 @@ namespace Tiku.Infrastructure.Persistence.Migrations
.HasConstraintName("fk_practice_blueprints_regions_tenant_id_region_id");
});
modelBuilder.Entity("Tiku.Domain.Content.QuestionBankGrant", b =>
{
b.HasOne("Tiku.Domain.Identity.User", null)
.WithMany()
.HasForeignKey("CreatedBy")
.OnDelete(DeleteBehavior.SetNull)
.HasConstraintName("fk_question_bank_grants_users_created_by");
b.HasOne("Tiku.Domain.QuestionBanks.QuestionBank", null)
.WithMany()
.HasForeignKey("SourceQuestionBankId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_question_bank_grants_question_banks_source_question_bank_id");
b.HasOne("Tiku.Domain.Identity.User", null)
.WithMany()
.HasForeignKey("UpdatedBy")
.OnDelete(DeleteBehavior.SetNull)
.HasConstraintName("fk_question_bank_grants_users_updated_by");
});
modelBuilder.Entity("Tiku.Domain.Content.QuestionCollection", b =>
{
b.HasOne("Tiku.Domain.Identity.User", null)
@@ -11785,6 +12424,62 @@ namespace Tiku.Infrastructure.Persistence.Migrations
.HasConstraintName("fk_subject_shares_subjects_tenant_id_target_subject_id");
});
modelBuilder.Entity("Tiku.Domain.Content.TenantQuestionBankAdoption", b =>
{
b.HasOne("Tiku.Domain.Identity.User", null)
.WithMany()
.HasForeignKey("CreatedBy")
.OnDelete(DeleteBehavior.SetNull)
.HasConstraintName("fk_tenant_question_bank_adoptions_users_created_by");
b.HasOne("Tiku.Domain.Content.QuestionBankGrant", null)
.WithMany()
.HasForeignKey("GrantId")
.OnDelete(DeleteBehavior.SetNull)
.HasConstraintName("fk_tenant_question_bank_adoptions_question_bank_grants_grant_id");
b.HasOne("Tiku.Domain.QuestionBanks.QuestionBank", null)
.WithMany()
.HasForeignKey("SourceQuestionBankId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_tenant_question_bank_adoptions_question_banks_source_questi~");
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
.WithMany()
.HasForeignKey("TenantId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_tenant_question_bank_adoptions_tenants_tenant_id");
b.HasOne("Tiku.Domain.Identity.User", null)
.WithMany()
.HasForeignKey("UpdatedBy")
.OnDelete(DeleteBehavior.SetNull)
.HasConstraintName("fk_tenant_question_bank_adoptions_users_updated_by");
b.HasOne("Tiku.Domain.Content.QuestionCollection", null)
.WithMany()
.HasForeignKey("TenantId", "TargetCollectionId")
.HasPrincipalKey("TenantId", "Id")
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("fk_tenant_question_bank_adoptions_question_collections_tenant_~");
b.HasOne("Tiku.Domain.Content.ContentEntry", null)
.WithMany()
.HasForeignKey("TenantId", "TargetEntryId")
.HasPrincipalKey("TenantId", "Id")
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("fk_tenant_question_bank_adoptions_content_entries_tenant_id_ta~");
b.HasOne("Tiku.Domain.QuestionBanks.QuestionBank", null)
.WithMany()
.HasForeignKey("TenantId", "TargetQuestionBankId")
.HasPrincipalKey("TenantId", "Id")
.OnDelete(DeleteBehavior.Restrict)
.HasConstraintName("fk_tenant_question_bank_adoptions_question_banks_tenant_id_tar~");
});
modelBuilder.Entity("Tiku.Domain.Content.UserWordFavorite", b =>
{
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)