forked from xiongyuxing/tiku-backend.net
8041 lines
346 KiB
C#
8041 lines
346 KiB
C#
// <auto-generated />
|
|
using System;
|
|
using System.Text.Json;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|
using Tiku.Infrastructure.Persistence;
|
|
|
|
#nullable disable
|
|
|
|
namespace Tiku.Infrastructure.Persistence.Migrations
|
|
{
|
|
[DbContext(typeof(TikuDbContext))]
|
|
partial class TikuDbContextModelSnapshot : ModelSnapshot
|
|
{
|
|
protected override void BuildModel(ModelBuilder modelBuilder)
|
|
{
|
|
#pragma warning disable 612, 618
|
|
modelBuilder
|
|
.HasAnnotation("ProductVersion", "10.0.10")
|
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
|
|
|
NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "citext");
|
|
NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "ltree");
|
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.Category", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("CategoryType")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("category_type");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("NodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("node_id");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<Guid?>("SubjectId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("subject_id");
|
|
|
|
b.Property<int?>("SvipQuestionLimit")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("svip_question_limit");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_categories");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_categories_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_categories_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "NodeId")
|
|
.HasDatabaseName("ix_categories_tenant_id_node_id");
|
|
|
|
b.HasIndex("TenantId", "SubjectId")
|
|
.HasDatabaseName("ix_categories_tenant_id_subject_id");
|
|
|
|
b.ToTable("categories", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.Major", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<Guid?>("SchoolId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("school_id");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<string>("StudyTips")
|
|
.HasColumnType("text")
|
|
.HasColumnName("study_tips");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_majors");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_majors_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_majors_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_majors_tenant_id_region_id");
|
|
|
|
b.HasIndex("TenantId", "SchoolId")
|
|
.HasDatabaseName("ix_majors_tenant_id_school_id");
|
|
|
|
b.ToTable("majors", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.ModuleNode", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("LegacyModuleId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_module_id");
|
|
|
|
b.Property<string>("LegacyParentId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_parent_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid?>("ModuleId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("module_id");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("ParentId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("parent_id");
|
|
|
|
b.Property<string>("Path")
|
|
.HasMaxLength(1000)
|
|
.HasColumnType("character varying(1000)")
|
|
.HasColumnName("path");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("Type")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("type");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_module_nodes");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_module_nodes_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_module_nodes_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "ModuleId")
|
|
.HasDatabaseName("ix_module_nodes_tenant_id_module_id");
|
|
|
|
b.HasIndex("TenantId", "ParentId")
|
|
.HasDatabaseName("ix_module_nodes_tenant_id_parent_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_module_nodes_tenant_id_region_id");
|
|
|
|
b.ToTable("module_nodes", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.Region", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("Code")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("code");
|
|
|
|
b.Property<JsonElement>("Config")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("config")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("FullName")
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("full_name");
|
|
|
|
b.Property<string>("Icon")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("icon");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<bool>("IsHot")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_hot");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<string>("Pinyin")
|
|
.HasMaxLength(255)
|
|
.HasColumnType("character varying(255)")
|
|
.HasColumnName("pinyin");
|
|
|
|
b.Property<string>("ShortName")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("short_name");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_regions");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_regions_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_regions_tenant_id_legacy_id");
|
|
|
|
b.ToTable("regions", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.RegionModule", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("Color")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("color");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<string>("Icon")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("icon");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<bool>("IsPrimarySchoolModule")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_primary_school_module");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<string>("Route")
|
|
.HasMaxLength(500)
|
|
.HasColumnType("character varying(500)")
|
|
.HasColumnName("route");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("TextColor")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("text_color");
|
|
|
|
b.Property<string>("Type")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("type");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_region_modules");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_region_modules_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_region_modules_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_region_modules_tenant_id_region_id");
|
|
|
|
b.ToTable("region_modules", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.School", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid?>("ModuleId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("module_id");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<string>("ProfessionalExamDate")
|
|
.HasMaxLength(255)
|
|
.HasColumnType("character varying(255)")
|
|
.HasColumnName("professional_exam_date");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_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.HasKey("Id")
|
|
.HasName("pk_schools");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_schools_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_schools_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "ModuleId")
|
|
.HasDatabaseName("ix_schools_tenant_id_module_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_schools_tenant_id_region_id");
|
|
|
|
b.ToTable("schools", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.Subject", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<string>("Icon")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("icon");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<Guid?>("MajorId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("major_id");
|
|
|
|
b.Property<JsonElement>("MajorLegacyIds")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("major_legacy_ids")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<Guid?>("ModuleId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("module_id");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("NodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("node_id");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<Guid?>("SchoolId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("school_id");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<JsonElement>("Stats")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("stats")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("Type")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("type");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_subjects");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_subjects_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_subjects_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "MajorId")
|
|
.HasDatabaseName("ix_subjects_tenant_id_major_id");
|
|
|
|
b.HasIndex("TenantId", "ModuleId")
|
|
.HasDatabaseName("ix_subjects_tenant_id_module_id");
|
|
|
|
b.HasIndex("TenantId", "NodeId")
|
|
.HasDatabaseName("ix_subjects_tenant_id_node_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_subjects_tenant_id_region_id");
|
|
|
|
b.HasIndex("TenantId", "SchoolId")
|
|
.HasDatabaseName("ix_subjects_tenant_id_school_id");
|
|
|
|
b.ToTable("subjects", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.AppAsset", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("AssetKey")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("asset_key");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Description")
|
|
.HasMaxLength(1000)
|
|
.HasColumnType("character varying(1000)")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<string>("FileName")
|
|
.HasMaxLength(500)
|
|
.HasColumnType("character varying(500)")
|
|
.HasColumnName("file_name");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_app_assets");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_app_assets_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "AssetKey")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_app_assets_tenant_id_asset_key");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_app_assets_tenant_id_legacy_id");
|
|
|
|
b.ToTable("app_assets", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ContentAsset", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<JsonElement>("AccessRules")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("access_rules")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("AssetKey")
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("asset_key");
|
|
|
|
b.Property<string>("AssetType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("asset_type");
|
|
|
|
b.Property<string>("Bucket")
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("bucket");
|
|
|
|
b.Property<string>("Category")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("category");
|
|
|
|
b.Property<Guid?>("CategoryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("category_id");
|
|
|
|
b.Property<string>("CdnUrl")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("cdn_url");
|
|
|
|
b.Property<string>("ChecksumSha256")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("checksum_sha256");
|
|
|
|
b.Property<Guid?>("ContentNodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("content_node_id");
|
|
|
|
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<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<int>("DownloadCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("download_count");
|
|
|
|
b.Property<string>("FileName")
|
|
.HasMaxLength(500)
|
|
.HasColumnType("character varying(500)")
|
|
.HasColumnName("file_name");
|
|
|
|
b.Property<long?>("FileSizeBytes")
|
|
.HasColumnType("bigint")
|
|
.HasColumnName("file_size_bytes");
|
|
|
|
b.Property<bool>("IsPublic")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_public");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("MimeType")
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("mime_type");
|
|
|
|
b.Property<string>("ObjectKey")
|
|
.HasMaxLength(1000)
|
|
.HasColumnType("character varying(1000)")
|
|
.HasColumnName("object_key");
|
|
|
|
b.Property<string>("PreviewObjectKey")
|
|
.HasMaxLength(1000)
|
|
.HasColumnType("character varying(1000)")
|
|
.HasColumnName("preview_object_key");
|
|
|
|
b.Property<string>("PreviewStatus")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("preview_status");
|
|
|
|
b.Property<string>("PreviewUrl")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("preview_url");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<JsonElement>("SecurityFlags")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("security_flags")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<string>("Source")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("source");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("status");
|
|
|
|
b.Property<string>("StorageProvider")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("storage_provider");
|
|
|
|
b.Property<Guid?>("SubjectId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("subject_id");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("Title")
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("title");
|
|
|
|
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.Property<string>("UploadStatus")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("upload_status");
|
|
|
|
b.Property<JsonElement>("VerificationDetails")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("verification_details")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<DateTimeOffset?>("VerifiedAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("verified_at");
|
|
|
|
b.Property<Guid?>("VerifiedBy")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("verified_by");
|
|
|
|
b.Property<string>("VerifiedChecksumSha256")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("verified_checksum_sha256");
|
|
|
|
b.Property<long?>("VerifiedSizeBytes")
|
|
.HasColumnType("bigint")
|
|
.HasColumnName("verified_size_bytes");
|
|
|
|
b.Property<string>("Visibility")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("visibility");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_content_assets");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_content_assets_tenant_id_id");
|
|
|
|
b.HasIndex("CreatedBy")
|
|
.HasDatabaseName("ix_content_assets_created_by");
|
|
|
|
b.HasIndex("UpdatedBy")
|
|
.HasDatabaseName("ix_content_assets_updated_by");
|
|
|
|
b.HasIndex("VerifiedBy")
|
|
.HasDatabaseName("ix_content_assets_verified_by");
|
|
|
|
b.HasIndex("TenantId", "CategoryId")
|
|
.HasDatabaseName("ix_content_assets_tenant_id_category_id");
|
|
|
|
b.HasIndex("TenantId", "ChecksumSha256")
|
|
.HasDatabaseName("ix_content_assets_tenant_id_checksum_sha256")
|
|
.HasFilter("checksum_sha256 is not null");
|
|
|
|
b.HasIndex("TenantId", "ContentNodeId")
|
|
.HasDatabaseName("ix_content_assets_tenant_id_content_node_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_content_assets_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "PreviewStatus")
|
|
.HasDatabaseName("ix_content_assets_tenant_id_preview_status")
|
|
.HasFilter("preview_status <> 'none'");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_content_assets_tenant_id_region_id");
|
|
|
|
b.HasIndex("TenantId", "SubjectId")
|
|
.HasDatabaseName("ix_content_assets_tenant_id_subject_id");
|
|
|
|
b.HasIndex("TenantId", "StorageProvider", "Bucket", "ObjectKey")
|
|
.HasDatabaseName("ix_content_assets_tenant_id_storage_provider_bucket_object_key");
|
|
|
|
b.HasIndex("TenantId", "UploadStatus", "Status", "UpdatedAt")
|
|
.HasDatabaseName("ix_content_assets_tenant_id_upload_status_status_updated_at");
|
|
|
|
b.HasIndex("TenantId", "Status", "Visibility", "AssetType", "RegionId", "SubjectId", "CategoryId", "SortOrder")
|
|
.HasDatabaseName("ix_content_assets_tenant_id_status_visibility_asset_type_regio~");
|
|
|
|
b.ToTable("content_assets", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_content_assets_download_count", "download_count >= 0");
|
|
|
|
t.HasCheckConstraint("ck_content_assets_file_size", "file_size_bytes is null or file_size_bytes >= 0");
|
|
|
|
t.HasCheckConstraint("ck_content_assets_verified_checksum", "verified_checksum_sha256 is null or verified_checksum_sha256 ~ '^[a-f0-9]{64}$'");
|
|
|
|
t.HasCheckConstraint("ck_content_assets_verified_size", "verified_size_bytes is null or verified_size_bytes >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ContentEntry", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<JsonElement>("AccessRules")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("access_rules")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
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<string>("Description")
|
|
.HasMaxLength(2000)
|
|
.HasColumnType("character varying(2000)")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<string>("EntryKey")
|
|
.IsRequired()
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("entry_key");
|
|
|
|
b.Property<string>("EntryType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("entry_type");
|
|
|
|
b.Property<string>("Icon")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("icon");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<JsonElement>("LayoutConfig")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("layout_config")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<string>("Route")
|
|
.HasMaxLength(500)
|
|
.HasColumnType("character varying(500)")
|
|
.HasColumnName("route");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
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.Property<string>("Visibility")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("visibility");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_content_entries");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_content_entries_tenant_id_id");
|
|
|
|
b.HasIndex("CreatedBy")
|
|
.HasDatabaseName("ix_content_entries_created_by");
|
|
|
|
b.HasIndex("UpdatedBy")
|
|
.HasDatabaseName("ix_content_entries_updated_by");
|
|
|
|
b.HasIndex("TenantId", "EntryKey")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_content_entries_tenant_id_entry_key");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_content_entries_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId", "EntryType", "IsActive", "SortOrder")
|
|
.HasDatabaseName("ix_content_entries_tenant_id_region_id_entry_type_is_active_so~");
|
|
|
|
b.ToTable("content_entries", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ContentImportIssue", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("Code")
|
|
.IsRequired()
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("code");
|
|
|
|
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.Property<string>("FieldPath")
|
|
.HasMaxLength(500)
|
|
.HasColumnType("character varying(500)")
|
|
.HasColumnName("field_path");
|
|
|
|
b.Property<Guid?>("ItemId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("item_id");
|
|
|
|
b.Property<Guid>("JobId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("job_id");
|
|
|
|
b.Property<string>("Message")
|
|
.IsRequired()
|
|
.HasMaxLength(2000)
|
|
.HasColumnType("character varying(2000)")
|
|
.HasColumnName("message");
|
|
|
|
b.Property<int?>("RowNo")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("row_no");
|
|
|
|
b.Property<string>("Severity")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("severity");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_content_import_issues");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_content_import_issues_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "ItemId")
|
|
.HasDatabaseName("ix_content_import_issues_tenant_id_item_id");
|
|
|
|
b.HasIndex("TenantId", "JobId", "Severity", "RowNo")
|
|
.HasDatabaseName("ix_content_import_issues_tenant_id_job_id_severity_row_no");
|
|
|
|
b.ToTable("content_import_issues", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ContentImportItem", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("ContentHash")
|
|
.HasMaxLength(128)
|
|
.HasColumnType("character varying(128)")
|
|
.HasColumnName("content_hash");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("ExternalId")
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("external_id");
|
|
|
|
b.Property<int>("IssuesCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("issues_count");
|
|
|
|
b.Property<Guid>("JobId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("job_id");
|
|
|
|
b.Property<JsonElement>("NormalizedPayload")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("normalized_payload")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<int>("RowNo")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("row_no");
|
|
|
|
b.Property<JsonElement>("SourcePayload")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("source_payload")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("status");
|
|
|
|
b.Property<Guid?>("TargetId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("target_id");
|
|
|
|
b.Property<string>("TargetType")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("target_type");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_content_import_items");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_content_import_items_tenant_id_id");
|
|
|
|
b.HasIndex("JobId", "RowNo")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_content_import_items_job_id_row_no");
|
|
|
|
b.HasIndex("TenantId", "JobId", "Status", "RowNo")
|
|
.HasDatabaseName("ix_content_import_items_tenant_id_job_id_status_row_no");
|
|
|
|
b.ToTable("content_import_items", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_content_import_items_issues_count", "issues_count >= 0");
|
|
|
|
t.HasCheckConstraint("ck_content_import_items_row_no", "row_no >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ContentImportJob", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_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<bool>("DryRun")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("dry_run");
|
|
|
|
b.Property<int>("ErrorCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("error_count");
|
|
|
|
b.Property<string>("ErrorMessage")
|
|
.HasColumnType("text")
|
|
.HasColumnName("error_message");
|
|
|
|
b.Property<DateTimeOffset?>("FinishedAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("finished_at");
|
|
|
|
b.Property<string>("ImportType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("import_type");
|
|
|
|
b.Property<int>("InsertedCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("inserted_count");
|
|
|
|
b.Property<JsonElement>("NormalizedPayload")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("normalized_payload")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<JsonElement>("RawPayload")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("raw_payload")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<int>("SkippedCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("skipped_count");
|
|
|
|
b.Property<string>("SourceFormat")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("source_format");
|
|
|
|
b.Property<string>("SourceHash")
|
|
.HasMaxLength(128)
|
|
.HasColumnType("character varying(128)")
|
|
.HasColumnName("source_hash");
|
|
|
|
b.Property<string>("SourceName")
|
|
.HasMaxLength(500)
|
|
.HasColumnType("character varying(500)")
|
|
.HasColumnName("source_name");
|
|
|
|
b.Property<DateTimeOffset?>("StartedAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("started_at");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("status");
|
|
|
|
b.Property<JsonElement>("Summary")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("summary")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid?>("TargetCategoryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("target_category_id");
|
|
|
|
b.Property<Guid?>("TargetContentNodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("target_content_node_id");
|
|
|
|
b.Property<Guid?>("TargetQuestionBankId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("target_question_bank_id");
|
|
|
|
b.Property<Guid?>("TargetRegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("target_region_id");
|
|
|
|
b.Property<Guid?>("TargetSubjectId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("target_subject_id");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<int>("TotalCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("total_count");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<int>("UpdatedCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("updated_count");
|
|
|
|
b.Property<int>("ValidCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("valid_count");
|
|
|
|
b.Property<int>("WarningCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("warning_count");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_content_import_jobs");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_content_import_jobs_tenant_id_id");
|
|
|
|
b.HasIndex("CreatedBy")
|
|
.HasDatabaseName("ix_content_import_jobs_created_by");
|
|
|
|
b.HasIndex("TenantId", "TargetCategoryId")
|
|
.HasDatabaseName("ix_content_import_jobs_tenant_id_target_category_id");
|
|
|
|
b.HasIndex("TenantId", "TargetContentNodeId")
|
|
.HasDatabaseName("ix_content_import_jobs_tenant_id_target_content_node_id");
|
|
|
|
b.HasIndex("TenantId", "TargetQuestionBankId")
|
|
.HasDatabaseName("ix_content_import_jobs_tenant_id_target_question_bank_id");
|
|
|
|
b.HasIndex("TenantId", "TargetRegionId")
|
|
.HasDatabaseName("ix_content_import_jobs_tenant_id_target_region_id");
|
|
|
|
b.HasIndex("TenantId", "TargetSubjectId")
|
|
.HasDatabaseName("ix_content_import_jobs_tenant_id_target_subject_id");
|
|
|
|
b.HasIndex("TenantId", "ImportType", "Status", "CreatedAt")
|
|
.HasDatabaseName("ix_content_import_jobs_tenant_id_import_type_status_created_at");
|
|
|
|
b.ToTable("content_import_jobs", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_content_import_jobs_counts", "total_count >= 0 and valid_count >= 0 and error_count >= 0 and warning_count >= 0 and inserted_count >= 0 and updated_count >= 0 and skipped_count >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ContentNode", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<JsonElement>("AccessRules")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("access_rules")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
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<int>("Depth")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("depth");
|
|
|
|
b.Property<Guid>("EntryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("entry_id");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<bool>("IsLeaf")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_leaf");
|
|
|
|
b.Property<bool>("IsSelectable")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_selectable");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("MarkerConfig")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("marker_config")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("MarkerType")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("marker_type");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<string>("NodeKey")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("node_key");
|
|
|
|
b.Property<string>("NodeType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("node_type");
|
|
|
|
b.Property<Guid?>("ParentId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("parent_id");
|
|
|
|
b.Property<string>("Path")
|
|
.HasColumnType("ltree")
|
|
.HasColumnName("path");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
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_content_nodes");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_content_nodes_tenant_id_id");
|
|
|
|
b.HasIndex("CreatedBy")
|
|
.HasDatabaseName("ix_content_nodes_created_by");
|
|
|
|
b.HasIndex("Path")
|
|
.HasDatabaseName("ix_content_nodes_path");
|
|
|
|
NpgsqlIndexBuilderExtensions.HasMethod(b.HasIndex("Path"), "gist");
|
|
|
|
b.HasIndex("UpdatedBy")
|
|
.HasDatabaseName("ix_content_nodes_updated_by");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_content_nodes_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "MarkerType")
|
|
.HasDatabaseName("ix_content_nodes_tenant_id_marker_type")
|
|
.HasFilter("marker_type is not null");
|
|
|
|
b.HasIndex("TenantId", "ParentId")
|
|
.HasDatabaseName("ix_content_nodes_tenant_id_parent_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_content_nodes_tenant_id_region_id");
|
|
|
|
b.HasIndex("TenantId", "EntryId", "NodeKey")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_content_nodes_tenant_id_entry_id_node_key");
|
|
|
|
b.HasIndex("TenantId", "EntryId", "ParentId", "SortOrder")
|
|
.HasDatabaseName("ix_content_nodes_tenant_id_entry_id_parent_id_sort_order");
|
|
|
|
b.ToTable("content_nodes", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_content_nodes_depth", "depth >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.HandbookChapter", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<Guid?>("ContentNodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("content_node_id");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<Guid?>("EntryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("entry_id");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<string>("SourceHash")
|
|
.HasMaxLength(128)
|
|
.HasColumnType("character varying(128)")
|
|
.HasColumnName("source_hash");
|
|
|
|
b.Property<Guid?>("SubjectId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("subject_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.HasKey("Id")
|
|
.HasName("pk_handbook_chapters");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_handbook_chapters_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "ContentNodeId")
|
|
.HasDatabaseName("ix_handbook_chapters_tenant_id_content_node_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_handbook_chapters_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "SubjectId")
|
|
.HasDatabaseName("ix_handbook_chapters_tenant_id_subject_id");
|
|
|
|
b.HasIndex("TenantId", "EntryId", "ContentNodeId", "SubjectId", "IsActive", "SortOrder")
|
|
.HasDatabaseName("ix_handbook_chapters_tenant_id_entry_id_content_node_id_subjec~");
|
|
|
|
b.ToTable("handbook_chapters", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.HandbookEntry", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<Guid?>("ChapterId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("chapter_id");
|
|
|
|
b.Property<string>("Content")
|
|
.HasColumnType("text")
|
|
.HasColumnName("content");
|
|
|
|
b.Property<Guid?>("ContentNodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("content_node_id");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<Guid?>("EntryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("entry_id");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<string>("SourceHash")
|
|
.HasMaxLength(128)
|
|
.HasColumnType("character varying(128)")
|
|
.HasColumnName("source_hash");
|
|
|
|
b.Property<string>("Summary")
|
|
.HasColumnType("text")
|
|
.HasColumnName("summary");
|
|
|
|
b.Property<JsonElement>("Tags")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("tags")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("Title")
|
|
.IsRequired()
|
|
.HasMaxLength(500)
|
|
.HasColumnType("character varying(500)")
|
|
.HasColumnName("title");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_handbook_entries");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_handbook_entries_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "ChapterId")
|
|
.HasDatabaseName("ix_handbook_entries_tenant_id_chapter_id");
|
|
|
|
b.HasIndex("TenantId", "ContentNodeId")
|
|
.HasDatabaseName("ix_handbook_entries_tenant_id_content_node_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_handbook_entries_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "EntryId", "ContentNodeId", "ChapterId", "IsActive", "SortOrder")
|
|
.HasDatabaseName("ix_handbook_entries_tenant_id_entry_id_content_node_id_chapter~");
|
|
|
|
b.ToTable("handbook_entries", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.HandbookSubject", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("Color")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("color");
|
|
|
|
b.Property<Guid?>("ContentNodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("content_node_id");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<Guid?>("EntryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("entry_id");
|
|
|
|
b.Property<string>("Icon")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("icon");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<Guid?>("MajorId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("major_id");
|
|
|
|
b.Property<JsonElement>("MajorLegacyIds")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("major_legacy_ids")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<Guid?>("SchoolId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("school_id");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<string>("SourceHash")
|
|
.HasMaxLength(128)
|
|
.HasColumnType("character varying(128)")
|
|
.HasColumnName("source_hash");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("Type")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("type");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_handbook_subjects");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_handbook_subjects_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "ContentNodeId")
|
|
.HasDatabaseName("ix_handbook_subjects_tenant_id_content_node_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_handbook_subjects_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "MajorId")
|
|
.HasDatabaseName("ix_handbook_subjects_tenant_id_major_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_handbook_subjects_tenant_id_region_id");
|
|
|
|
b.HasIndex("TenantId", "SchoolId")
|
|
.HasDatabaseName("ix_handbook_subjects_tenant_id_school_id");
|
|
|
|
b.HasIndex("TenantId", "EntryId", "ContentNodeId", "RegionId", "IsActive", "SortOrder")
|
|
.HasDatabaseName("ix_handbook_subjects_tenant_id_entry_id_content_node_id_region~");
|
|
|
|
b.ToTable("handbook_subjects", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ImageAsset", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("Category")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("category");
|
|
|
|
b.Property<string>("CdnUrl")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("cdn_url");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("FileName")
|
|
.HasMaxLength(500)
|
|
.HasColumnType("character varying(500)")
|
|
.HasColumnName("file_name");
|
|
|
|
b.Property<bool>("IsPublic")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_public");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("Title")
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("title");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_images");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_images_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_images_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "Category", "IsPublic")
|
|
.HasDatabaseName("ix_images_tenant_id_category_is_public");
|
|
|
|
b.ToTable("images", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.PracticeBlueprint", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<JsonElement>("AccessRules")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("access_rules")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("AssemblyType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("assembly_type");
|
|
|
|
b.Property<Guid?>("CollectionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("collection_id");
|
|
|
|
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<int?>("DurationMinutes")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("duration_minutes");
|
|
|
|
b.Property<Guid?>("EntryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("entry_id");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("Mode")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("mode");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("NodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("node_id");
|
|
|
|
b.Property<decimal?>("PassScore")
|
|
.HasPrecision(8, 2)
|
|
.HasColumnType("numeric(8,2)")
|
|
.HasColumnName("pass_score");
|
|
|
|
b.Property<int?>("QuestionLimit")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("question_limit");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<JsonElement>("Rules")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("rules")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<JsonElement>("Sections")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("sections")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("status");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<decimal?>("TotalScore")
|
|
.HasPrecision(8, 2)
|
|
.HasColumnType("numeric(8,2)")
|
|
.HasColumnName("total_score");
|
|
|
|
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_practice_blueprints");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_practice_blueprints_tenant_id_id");
|
|
|
|
b.HasIndex("CreatedBy")
|
|
.HasDatabaseName("ix_practice_blueprints_created_by");
|
|
|
|
b.HasIndex("UpdatedBy")
|
|
.HasDatabaseName("ix_practice_blueprints_updated_by");
|
|
|
|
b.HasIndex("TenantId", "CollectionId")
|
|
.HasDatabaseName("ix_practice_blueprints_tenant_id_collection_id");
|
|
|
|
b.HasIndex("TenantId", "EntryId")
|
|
.HasDatabaseName("ix_practice_blueprints_tenant_id_entry_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_practice_blueprints_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_practice_blueprints_tenant_id_region_id");
|
|
|
|
b.HasIndex("TenantId", "NodeId", "CollectionId", "Mode", "Status", "SortOrder")
|
|
.HasDatabaseName("ix_practice_blueprints_tenant_id_node_id_collection_id_mode_st~");
|
|
|
|
b.ToTable("practice_blueprints", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_practice_blueprints_duration", "duration_minutes is null or duration_minutes > 0");
|
|
|
|
t.HasCheckConstraint("ck_practice_blueprints_question_limit", "question_limit is null or question_limit > 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.QuestionCollection", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<JsonElement>("AccessRules")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("access_rules")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid?>("CategoryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("category_id");
|
|
|
|
b.Property<string>("CollectionType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("collection_type");
|
|
|
|
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<int?>("DurationMinutes")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("duration_minutes");
|
|
|
|
b.Property<Guid?>("EntryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("entry_id");
|
|
|
|
b.Property<JsonElement>("Filters")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("filters")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("NodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("node_id");
|
|
|
|
b.Property<Guid?>("QuestionBankId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("question_bank_id");
|
|
|
|
b.Property<int>("QuestionCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("question_count");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<string>("SourceType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("source_type");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("status");
|
|
|
|
b.Property<Guid?>("SubjectId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("subject_id");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<decimal?>("TotalScore")
|
|
.HasPrecision(8, 2)
|
|
.HasColumnType("numeric(8,2)")
|
|
.HasColumnName("total_score");
|
|
|
|
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_collections");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_question_collections_tenant_id_id");
|
|
|
|
b.HasIndex("CreatedBy")
|
|
.HasDatabaseName("ix_question_collections_created_by");
|
|
|
|
b.HasIndex("UpdatedBy")
|
|
.HasDatabaseName("ix_question_collections_updated_by");
|
|
|
|
b.HasIndex("TenantId", "CategoryId")
|
|
.HasDatabaseName("ix_question_collections_tenant_id_category_id");
|
|
|
|
b.HasIndex("TenantId", "EntryId")
|
|
.HasDatabaseName("ix_question_collections_tenant_id_entry_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_question_collections_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "QuestionBankId")
|
|
.HasDatabaseName("ix_question_collections_tenant_id_question_bank_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_question_collections_tenant_id_region_id");
|
|
|
|
b.HasIndex("TenantId", "SubjectId")
|
|
.HasDatabaseName("ix_question_collections_tenant_id_subject_id");
|
|
|
|
b.HasIndex("TenantId", "NodeId", "Status", "SortOrder")
|
|
.HasDatabaseName("ix_question_collections_tenant_id_node_id_status_sort_order");
|
|
|
|
b.ToTable("question_collections", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_question_collections_duration", "duration_minutes is null or duration_minutes > 0");
|
|
|
|
t.HasCheckConstraint("ck_question_collections_question_count", "question_count >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.QuestionCollectionItem", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<Guid>("CollectionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("collection_id");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid>("QuestionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("question_id");
|
|
|
|
b.Property<bool>("Required")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("required");
|
|
|
|
b.Property<decimal?>("Score")
|
|
.HasPrecision(8, 2)
|
|
.HasColumnType("numeric(8,2)")
|
|
.HasColumnName("score");
|
|
|
|
b.Property<string>("SectionKey")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("section_key");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_question_collection_items");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_question_collection_items_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "QuestionId")
|
|
.HasDatabaseName("ix_question_collection_items_tenant_id_question_id");
|
|
|
|
b.HasIndex("TenantId", "CollectionId", "QuestionId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_question_collection_items_tenant_id_collection_id_question_~");
|
|
|
|
b.HasIndex("TenantId", "CollectionId", "SectionKey", "SortOrder")
|
|
.HasDatabaseName("ix_question_collection_items_tenant_id_collection_id_section_k~");
|
|
|
|
b.ToTable("question_collection_items", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.QuestionTypeGroup", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("DisplayName")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("display_name");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<Guid?>("SubjectId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("subject_id");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<JsonElement>("Types")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("types")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_question_type_groups");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_question_type_groups_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_question_type_groups_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "SubjectId", "IsActive", "SortOrder")
|
|
.HasDatabaseName("ix_question_type_groups_tenant_id_subject_id_is_active_sort_or~");
|
|
|
|
b.ToTable("question_type_groups", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.QuestionVideo", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("LegacyQuestionId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_question_id");
|
|
|
|
b.Property<string>("LegacyVideoId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_video_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid?>("QuestionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("question_id");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
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?>("VideoId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("video_id");
|
|
|
|
b.Property<string>("VideoType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("video_type");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_question_videos");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_question_videos_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_question_videos_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "VideoId")
|
|
.HasDatabaseName("ix_question_videos_tenant_id_video_id");
|
|
|
|
b.HasIndex("TenantId", "QuestionId", "VideoId", "VideoType")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_question_videos_tenant_id_question_id_video_id_video_type");
|
|
|
|
b.ToTable("question_videos", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.SubjectShare", b =>
|
|
{
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<Guid>("SourceSubjectId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("source_subject_id");
|
|
|
|
b.Property<Guid>("TargetSubjectId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("target_subject_id");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<Guid>("Id")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasColumnType("text")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("LegacySourceSubjectId")
|
|
.HasColumnType("text")
|
|
.HasColumnName("legacy_source_subject_id");
|
|
|
|
b.Property<string>("LegacyTargetSubjectId")
|
|
.HasColumnType("text")
|
|
.HasColumnName("legacy_target_subject_id");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at");
|
|
|
|
b.HasKey("TenantId", "SourceSubjectId", "TargetSubjectId")
|
|
.HasName("pk_subject_shares");
|
|
|
|
b.HasIndex("TenantId", "TargetSubjectId")
|
|
.HasDatabaseName("ix_subject_shares_tenant_id_target_subject_id");
|
|
|
|
b.ToTable("subject_shares", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.UserWordFavorite", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<DateTimeOffset?>("FavoritedAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("favorited_at");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasColumnType("text")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("LegacyUserId")
|
|
.HasColumnType("text")
|
|
.HasColumnName("legacy_user_id");
|
|
|
|
b.Property<string>("LegacyWordId")
|
|
.HasColumnType("text")
|
|
.HasColumnName("legacy_word_id");
|
|
|
|
b.Property<string>("Note")
|
|
.HasMaxLength(1000)
|
|
.HasColumnType("character varying(1000)")
|
|
.HasColumnName("note");
|
|
|
|
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.Property<Guid>("WordId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("word_id");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_user_word_favorites");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_user_word_favorites_tenant_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_user_word_favorites_user_id");
|
|
|
|
b.HasIndex("TenantId", "WordId")
|
|
.HasDatabaseName("ix_user_word_favorites_tenant_id_word_id");
|
|
|
|
b.HasIndex("TenantId", "UserId", "WordId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_user_word_favorites_tenant_id_user_id_word_id");
|
|
|
|
b.ToTable("user_word_favorites", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.UserWordProgress", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<int>("CorrectCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("correct_count");
|
|
|
|
b.Property<int>("CorrectStreak")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("correct_streak");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("DueLevel")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("due_level");
|
|
|
|
b.Property<decimal>("EaseFactor")
|
|
.ValueGeneratedOnAdd()
|
|
.HasPrecision(4, 2)
|
|
.HasColumnType("numeric(4,2)")
|
|
.HasDefaultValue(2.50m)
|
|
.HasColumnName("ease_factor");
|
|
|
|
b.Property<string>("LastResult")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("last_result");
|
|
|
|
b.Property<DateTimeOffset?>("LastReviewAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("last_review_at");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasColumnType("text")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("LegacyUserId")
|
|
.HasColumnType("text")
|
|
.HasColumnName("legacy_user_id");
|
|
|
|
b.Property<string>("LegacyWordId")
|
|
.HasColumnType("text")
|
|
.HasColumnName("legacy_word_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<DateTimeOffset?>("NextReviewAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("next_review_at");
|
|
|
|
b.Property<int>("ReviewCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("review_count");
|
|
|
|
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.Property<Guid>("WordId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("word_id");
|
|
|
|
b.Property<int>("WrongCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("wrong_count");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_user_word_progress");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_user_word_progress_tenant_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_user_word_progress_user_id");
|
|
|
|
b.HasIndex("TenantId", "WordId")
|
|
.HasDatabaseName("ix_user_word_progress_tenant_id_word_id");
|
|
|
|
b.HasIndex("TenantId", "UserId", "WordId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_user_word_progress_tenant_id_user_id_word_id");
|
|
|
|
b.HasIndex("TenantId", "UserId", "NextReviewAt", "Status", "DueLevel")
|
|
.HasDatabaseName("ix_user_word_progress_tenant_id_user_id_next_review_at_status_~");
|
|
|
|
b.ToTable("user_word_progress", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_user_word_progress_correct_streak", "correct_streak >= 0");
|
|
|
|
t.HasCheckConstraint("ck_user_word_progress_ease_factor", "ease_factor >= 1.30 and ease_factor <= 3.00");
|
|
|
|
t.HasCheckConstraint("ck_user_word_progress_review_count", "review_count >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.VideoExplanation", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<int?>("Difficulty")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("difficulty");
|
|
|
|
b.Property<int?>("DurationSeconds")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("duration_seconds");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<bool>("IsGeneral")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_general");
|
|
|
|
b.Property<JsonElement>("KnowledgeTags")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("knowledge_tags")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("LegacySubjectId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_subject_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<string>("SourceHash")
|
|
.HasMaxLength(128)
|
|
.HasColumnType("character varying(128)")
|
|
.HasColumnName("source_hash");
|
|
|
|
b.Property<Guid?>("SubjectId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("subject_id");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("ThumbnailUrl")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("thumbnail_url");
|
|
|
|
b.Property<string>("Title")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("title");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("VideoUrl")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("video_url");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_video_explanations");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_video_explanations_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_video_explanations_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "SourceHash")
|
|
.HasDatabaseName("ix_video_explanations_tenant_id_source_hash")
|
|
.HasFilter("source_hash is not null");
|
|
|
|
b.HasIndex("TenantId", "SubjectId", "IsActive", "SortOrder")
|
|
.HasDatabaseName("ix_video_explanations_tenant_id_subject_id_is_active_sort_order");
|
|
|
|
b.ToTable("video_explanations", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.VocabularyUnit", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<Guid?>("ContentNodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("content_node_id");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<Guid?>("EntryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("entry_id");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<string>("SourceHash")
|
|
.HasMaxLength(128)
|
|
.HasColumnType("character varying(128)")
|
|
.HasColumnName("source_hash");
|
|
|
|
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<int?>("WordCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("word_count");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_vocabulary_units");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_vocabulary_units_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "ContentNodeId")
|
|
.HasDatabaseName("ix_vocabulary_units_tenant_id_content_node_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_vocabulary_units_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_vocabulary_units_tenant_id_region_id");
|
|
|
|
b.HasIndex("TenantId", "EntryId", "ContentNodeId", "RegionId", "IsActive", "SortOrder")
|
|
.HasDatabaseName("ix_vocabulary_units_tenant_id_entry_id_content_node_id_region_~");
|
|
|
|
b.ToTable("vocabulary_units", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.VocabularyWord", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<Guid?>("ContentNodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("content_node_id");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<int?>("Difficulty")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("difficulty");
|
|
|
|
b.Property<Guid?>("EntryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("entry_id");
|
|
|
|
b.Property<string>("Example")
|
|
.HasColumnType("text")
|
|
.HasColumnName("example");
|
|
|
|
b.Property<string>("ExampleTranslation")
|
|
.HasColumnType("text")
|
|
.HasColumnName("example_translation");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("Meaning")
|
|
.HasColumnType("text")
|
|
.HasColumnName("meaning");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Phonetic")
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("phonetic");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<string>("SourceHash")
|
|
.HasMaxLength(128)
|
|
.HasColumnType("character varying(128)")
|
|
.HasColumnName("source_hash");
|
|
|
|
b.Property<JsonElement>("Tags")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("tags")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<Guid?>("UnitId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("unit_id");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Word")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("word");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_vocabulary_words");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_vocabulary_words_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "ContentNodeId")
|
|
.HasDatabaseName("ix_vocabulary_words_tenant_id_content_node_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_vocabulary_words_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "UnitId", "IsActive", "SortOrder", "CreatedAt")
|
|
.HasDatabaseName("ix_vocabulary_words_tenant_id_unit_id_is_active_sort_order_cre~");
|
|
|
|
b.HasIndex("TenantId", "EntryId", "ContentNodeId", "UnitId", "IsActive", "SortOrder")
|
|
.HasDatabaseName("ix_vocabulary_words_tenant_id_entry_id_content_node_id_unit_id~");
|
|
|
|
b.ToTable("vocabulary_words", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Identity.StudentProfile", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<DateOnly?>("LastCheckInDate")
|
|
.HasColumnType("date")
|
|
.HasColumnName("last_check_in_date");
|
|
|
|
b.Property<string>("LegacyUserId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_user_id");
|
|
|
|
b.Property<int>("MasteredWordsCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("mastered_words_count");
|
|
|
|
b.Property<JsonElement>("ModuleSelections")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("module_selections")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<JsonElement>("Progress")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("progress")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<int>("QuestionsAnsweredToday")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("questions_answered_today");
|
|
|
|
b.Property<JsonElement>("RecentActivities")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("recent_activities")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<Guid?>("SelectedMajorId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("selected_major_id");
|
|
|
|
b.Property<Guid?>("SelectedSchoolId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("selected_school_id");
|
|
|
|
b.Property<JsonElement>("Stats")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("stats")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
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_student_profiles");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_student_profiles_tenant_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_student_profiles_user_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_student_profiles_tenant_id_region_id");
|
|
|
|
b.HasIndex("TenantId", "SelectedMajorId")
|
|
.HasDatabaseName("ix_student_profiles_tenant_id_selected_major_id");
|
|
|
|
b.HasIndex("TenantId", "SelectedSchoolId")
|
|
.HasDatabaseName("ix_student_profiles_tenant_id_selected_school_id");
|
|
|
|
b.HasIndex("TenantId", "UserId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_student_profiles_tenant_id_user_id");
|
|
|
|
b.ToTable("student_profiles", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Identity.User", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("AvatarUrl")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("avatar_url");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Email")
|
|
.HasMaxLength(320)
|
|
.HasColumnType("citext")
|
|
.HasColumnName("email");
|
|
|
|
b.Property<DateTimeOffset?>("LastSeenAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("last_seen_at");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("LegacyPasswordHash")
|
|
.HasMaxLength(512)
|
|
.HasColumnType("character varying(512)")
|
|
.HasColumnName("legacy_password_hash");
|
|
|
|
b.Property<string>("Name")
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<bool>("PasswordMigrationRequired")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("password_migration_required");
|
|
|
|
b.Property<string>("Phone")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("phone");
|
|
|
|
b.Property<string>("PrimaryRole")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("primary_role");
|
|
|
|
b.Property<JsonElement>("RawProfile")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("raw_profile")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<int>("Score")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("score");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Username")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("username");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_users");
|
|
|
|
b.HasIndex("Email")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_users_email");
|
|
|
|
b.HasIndex("LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_users_legacy_id");
|
|
|
|
b.HasIndex("Phone")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_users_phone");
|
|
|
|
b.HasIndex("Username")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_users_username");
|
|
|
|
b.ToTable("users", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Identity.UserIdentity", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Email")
|
|
.HasMaxLength(320)
|
|
.HasColumnType("citext")
|
|
.HasColumnName("email");
|
|
|
|
b.Property<string>("OpenId")
|
|
.HasMaxLength(255)
|
|
.HasColumnType("character varying(255)")
|
|
.HasColumnName("open_id");
|
|
|
|
b.Property<string>("Phone")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("phone");
|
|
|
|
b.Property<string>("Provider")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("provider");
|
|
|
|
b.Property<string>("ProviderSubject")
|
|
.IsRequired()
|
|
.HasMaxLength(255)
|
|
.HasColumnType("character varying(255)")
|
|
.HasColumnName("provider_subject");
|
|
|
|
b.Property<JsonElement>("SecretPayload")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("secret_payload")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("UnionId")
|
|
.HasMaxLength(255)
|
|
.HasColumnType("character varying(255)")
|
|
.HasColumnName("union_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_user_identities");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_user_identities_user_id");
|
|
|
|
b.HasIndex("Provider", "ProviderSubject")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_user_identities_provider_provider_subject");
|
|
|
|
b.ToTable("user_identities", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.AnswerRecord", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("AnswerText")
|
|
.HasColumnType("text")
|
|
.HasColumnName("answer_text");
|
|
|
|
b.Property<DateTimeOffset>("AnsweredAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("answered_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<bool?>("IsCorrect")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_correct");
|
|
|
|
b.Property<string>("LegacyCategoryId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_category_id");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("LegacyQuestionId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_question_id");
|
|
|
|
b.Property<Guid?>("PracticeSessionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("practice_session_id");
|
|
|
|
b.Property<Guid?>("QuestionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("question_id");
|
|
|
|
b.Property<Guid?>("QuestionVersionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("question_version_id");
|
|
|
|
b.Property<JsonElement>("SelectedOptions")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("selected_options")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("user_id");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_answer_records");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_answer_records_tenant_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_answer_records_user_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_answer_records_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "QuestionId")
|
|
.HasDatabaseName("ix_answer_records_tenant_id_question_id");
|
|
|
|
b.HasIndex("TenantId", "QuestionId", "QuestionVersionId")
|
|
.HasDatabaseName("ix_answer_records_tenant_id_question_id_question_version_id");
|
|
|
|
b.HasIndex("TenantId", "UserId", "PracticeSessionId")
|
|
.HasDatabaseName("ix_answer_records_tenant_id_user_id_practice_session_id");
|
|
|
|
b.ToTable("answer_records", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_answer_records_version_requires_question", "question_version_id is null or question_id is not null");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.DashboardDailyStat", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<int>("ActiveUsers")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("active_users");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("LegacyRegionId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_region_id");
|
|
|
|
b.Property<int>("NewOrders")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("new_orders");
|
|
|
|
b.Property<int>("NewQuestions")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("new_questions");
|
|
|
|
b.Property<int>("NewRevenueCents")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("new_revenue_cents");
|
|
|
|
b.Property<int>("NewUsers")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("new_users");
|
|
|
|
b.Property<DateTimeOffset?>("RebuiltAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("rebuilt_at");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<DateOnly>("StatDate")
|
|
.HasColumnType("date")
|
|
.HasColumnName("stat_date");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_dashboard_daily_stats");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_dashboard_daily_stats_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_dashboard_daily_stats_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_dashboard_daily_stats_tenant_id_region_id");
|
|
|
|
b.HasIndex("TenantId", "StatDate", "RegionId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_dashboard_daily_stats_tenant_id_stat_date_region_id");
|
|
|
|
NpgsqlIndexBuilderExtensions.AreNullsDistinct(b.HasIndex("TenantId", "StatDate", "RegionId"), false);
|
|
|
|
b.ToTable("dashboard_daily_stats", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.ExamDate", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<DateTimeOffset?>("ExamAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("exam_at");
|
|
|
|
b.Property<string>("ExamName")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("exam_name");
|
|
|
|
b.Property<string>("ExamType")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("exam_type");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_active");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<Guid?>("SchoolId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("school_id");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_exam_dates");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_exam_dates_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_exam_dates_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_exam_dates_tenant_id_region_id");
|
|
|
|
b.HasIndex("TenantId", "SchoolId", "ExamAt")
|
|
.HasDatabaseName("ix_exam_dates_tenant_id_school_id_exam_at");
|
|
|
|
b.ToTable("exam_dates", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.FavoriteQuestion", b =>
|
|
{
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("user_id");
|
|
|
|
b.Property<Guid>("QuestionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("question_id");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Source")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("source");
|
|
|
|
b.HasKey("TenantId", "UserId", "QuestionId")
|
|
.HasName("pk_favorite_questions");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_favorite_questions_user_id");
|
|
|
|
b.HasIndex("TenantId", "QuestionId")
|
|
.HasDatabaseName("ix_favorite_questions_tenant_id_question_id");
|
|
|
|
b.ToTable("favorite_questions", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.PracticeAccessEvent", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("AccessMode")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("access_mode");
|
|
|
|
b.Property<int>("ConsumedFreeQuota")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("consumed_free_quota");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<Guid?>("EntitlementId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("entitlement_id");
|
|
|
|
b.Property<string>("EventType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("event_type");
|
|
|
|
b.Property<int>("GrantedCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("granted_count");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid?>("PracticeSessionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("practice_session_id");
|
|
|
|
b.Property<string>("Reason")
|
|
.HasMaxLength(1000)
|
|
.HasColumnType("character varying(1000)")
|
|
.HasColumnName("reason");
|
|
|
|
b.Property<int>("RequestedCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("requested_count");
|
|
|
|
b.Property<Guid?>("ScopeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("scope_id");
|
|
|
|
b.Property<string>("ScopeType")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("scope_type");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<Guid?>("UserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("user_id");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_practice_access_events");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_practice_access_events_tenant_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_practice_access_events_user_id");
|
|
|
|
b.HasIndex("TenantId", "PracticeSessionId")
|
|
.HasDatabaseName("ix_practice_access_events_tenant_id_practice_session_id");
|
|
|
|
b.HasIndex("TenantId", "UserId", "CreatedAt")
|
|
.HasDatabaseName("ix_practice_access_events_tenant_id_user_id_created_at");
|
|
|
|
b.ToTable("practice_access_events", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_practice_access_events_consumed_free_quota", "consumed_free_quota >= 0");
|
|
|
|
t.HasCheckConstraint("ck_practice_access_events_granted_count", "granted_count >= 0");
|
|
|
|
t.HasCheckConstraint("ck_practice_access_events_requested_count", "requested_count >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.PracticeDailyUsage", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<int>("FreeLimit")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("free_limit");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid?>("ScopeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("scope_id");
|
|
|
|
b.Property<string>("ScopeType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("scope_type");
|
|
|
|
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<DateOnly>("UsageDate")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("date")
|
|
.HasColumnName("usage_date")
|
|
.HasDefaultValueSql("current_date");
|
|
|
|
b.Property<int>("UsedCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("used_count");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("user_id");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_practice_daily_usage");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_practice_daily_usage_tenant_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_practice_daily_usage_user_id");
|
|
|
|
b.HasIndex("TenantId", "UserId", "UsageDate")
|
|
.HasDatabaseName("ix_practice_daily_usage_tenant_id_user_id_usage_date");
|
|
|
|
b.HasIndex("TenantId", "UserId", "UsageDate", "ScopeType", "ScopeId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_practice_daily_usage_tenant_id_user_id_usage_date_scope_typ~");
|
|
|
|
NpgsqlIndexBuilderExtensions.AreNullsDistinct(b.HasIndex("TenantId", "UserId", "UsageDate", "ScopeType", "ScopeId"), false);
|
|
|
|
b.ToTable("practice_daily_usage", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_practice_daily_usage_free_limit", "free_limit >= 0");
|
|
|
|
t.HasCheckConstraint("ck_practice_daily_usage_used_count", "used_count >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.PracticeSession", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<Guid?>("AccessEntitlementId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("access_entitlement_id");
|
|
|
|
b.Property<string>("AccessMode")
|
|
.IsRequired()
|
|
.ValueGeneratedOnAdd()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasDefaultValue("free")
|
|
.HasColumnName("access_mode");
|
|
|
|
b.Property<JsonElement>("AccessSnapshot")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("access_snapshot")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid?>("BlueprintId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("blueprint_id");
|
|
|
|
b.Property<Guid?>("CollectionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("collection_id");
|
|
|
|
b.Property<int>("ConsumedFreeQuota")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("consumed_free_quota");
|
|
|
|
b.Property<Guid?>("ContentNodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("content_node_id");
|
|
|
|
b.Property<int?>("DurationMinutes")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("duration_minutes");
|
|
|
|
b.Property<Guid?>("EntryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("entry_id");
|
|
|
|
b.Property<DateTimeOffset?>("ExpiresAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("expires_at");
|
|
|
|
b.Property<DateTimeOffset?>("FinishedAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("finished_at");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Mode")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("mode");
|
|
|
|
b.Property<int>("QuestionCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("question_count");
|
|
|
|
b.Property<JsonElement>("QuestionIds")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("question_ids")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<DateTimeOffset>("StartedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("started_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<Guid?>("TargetId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("target_id");
|
|
|
|
b.Property<string>("TargetType")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("target_type");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<decimal?>("TotalScore")
|
|
.HasPrecision(8, 2)
|
|
.HasColumnType("numeric(8,2)")
|
|
.HasColumnName("total_score");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("user_id");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_practice_sessions");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_practice_sessions_tenant_id_id");
|
|
|
|
b.HasAlternateKey("TenantId", "UserId", "Id")
|
|
.HasName("ak_practice_sessions_tenant_id_user_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_practice_sessions_user_id");
|
|
|
|
b.HasIndex("TenantId", "BlueprintId")
|
|
.HasDatabaseName("ix_practice_sessions_tenant_id_blueprint_id");
|
|
|
|
b.HasIndex("TenantId", "CollectionId")
|
|
.HasDatabaseName("ix_practice_sessions_tenant_id_collection_id");
|
|
|
|
b.HasIndex("TenantId", "ContentNodeId")
|
|
.HasDatabaseName("ix_practice_sessions_tenant_id_content_node_id");
|
|
|
|
b.HasIndex("TenantId", "EntryId")
|
|
.HasDatabaseName("ix_practice_sessions_tenant_id_entry_id");
|
|
|
|
b.HasIndex("TenantId", "UserId", "StartedAt")
|
|
.HasDatabaseName("ix_practice_sessions_tenant_id_user_id_started_at");
|
|
|
|
b.ToTable("practice_sessions", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_practice_sessions_consumed_free_quota", "consumed_free_quota >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.PracticeSessionReport", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<decimal>("Accuracy")
|
|
.HasPrecision(6, 4)
|
|
.HasColumnType("numeric(6,4)")
|
|
.HasColumnName("accuracy");
|
|
|
|
b.Property<int>("AnsweredCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("answered_count");
|
|
|
|
b.Property<Guid?>("BlueprintId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("blueprint_id");
|
|
|
|
b.Property<Guid?>("CollectionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("collection_id");
|
|
|
|
b.Property<int>("CorrectCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("correct_count");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<int>("DurationSeconds")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("duration_seconds");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Mode")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("mode");
|
|
|
|
b.Property<Guid>("PracticeSessionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("practice_session_id");
|
|
|
|
b.Property<JsonElement>("QuestionResults")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("question_results")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<decimal>("Score")
|
|
.HasPrecision(10, 2)
|
|
.HasColumnType("numeric(10,2)")
|
|
.HasColumnName("score");
|
|
|
|
b.Property<JsonElement>("SectionStats")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("section_stats")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<DateTimeOffset?>("StartedAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("started_at");
|
|
|
|
b.Property<DateTimeOffset>("SubmittedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("submitted_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<int>("TotalQuestions")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("total_questions");
|
|
|
|
b.Property<decimal>("TotalScore")
|
|
.HasPrecision(10, 2)
|
|
.HasColumnType("numeric(10,2)")
|
|
.HasColumnName("total_score");
|
|
|
|
b.Property<int>("UnansweredCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("unanswered_count");
|
|
|
|
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.Property<int>("WrongCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("wrong_count");
|
|
|
|
b.Property<JsonElement>("WrongQuestionIds")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("wrong_question_ids")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_practice_session_reports");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_practice_session_reports_tenant_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_practice_session_reports_user_id");
|
|
|
|
b.HasIndex("TenantId", "CollectionId")
|
|
.HasDatabaseName("ix_practice_session_reports_tenant_id_collection_id");
|
|
|
|
b.HasIndex("TenantId", "PracticeSessionId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_practice_session_reports_tenant_id_practice_session_id");
|
|
|
|
b.HasIndex("TenantId", "BlueprintId", "SubmittedAt")
|
|
.HasDatabaseName("ix_practice_session_reports_tenant_id_blueprint_id_submitted_at")
|
|
.HasFilter("blueprint_id is not null");
|
|
|
|
b.HasIndex("TenantId", "UserId", "SubmittedAt")
|
|
.HasDatabaseName("ix_practice_session_reports_tenant_id_user_id_submitted_at");
|
|
|
|
b.ToTable("practice_session_reports", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_practice_session_reports_accuracy", "accuracy >= 0 and accuracy <= 1");
|
|
|
|
t.HasCheckConstraint("ck_practice_session_reports_counts", "total_questions >= 0 and answered_count >= 0 and correct_count >= 0 and wrong_count >= 0 and unanswered_count >= 0");
|
|
|
|
t.HasCheckConstraint("ck_practice_session_reports_duration", "duration_seconds >= 0");
|
|
|
|
t.HasCheckConstraint("ck_practice_session_reports_scores", "score >= 0 and total_score >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.PracticeSessionReportSection", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<decimal>("Accuracy")
|
|
.HasPrecision(6, 4)
|
|
.HasColumnType("numeric(6,4)")
|
|
.HasColumnName("accuracy");
|
|
|
|
b.Property<int>("AnsweredCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("answered_count");
|
|
|
|
b.Property<int>("CorrectCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("correct_count");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<Guid>("PracticeSessionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("practice_session_id");
|
|
|
|
b.Property<int>("QuestionCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("question_count");
|
|
|
|
b.Property<string>("QuestionType")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("question_type");
|
|
|
|
b.Property<Guid>("ReportId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("report_id");
|
|
|
|
b.Property<decimal>("Score")
|
|
.HasPrecision(10, 2)
|
|
.HasColumnType("numeric(10,2)")
|
|
.HasColumnName("score");
|
|
|
|
b.Property<string>("SectionKey")
|
|
.IsRequired()
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("section_key");
|
|
|
|
b.Property<string>("SectionName")
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("section_name");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<decimal>("TotalScore")
|
|
.HasPrecision(10, 2)
|
|
.HasColumnType("numeric(10,2)")
|
|
.HasColumnName("total_score");
|
|
|
|
b.Property<int>("UnansweredCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("unanswered_count");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<int>("WrongCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("wrong_count");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_practice_session_report_sections");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_practice_session_report_sections_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "PracticeSessionId")
|
|
.HasDatabaseName("ix_practice_session_report_sections_tenant_id_practice_session~");
|
|
|
|
b.HasIndex("TenantId", "ReportId", "SectionKey")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_practice_session_report_sections_tenant_id_report_id_sectio~");
|
|
|
|
b.HasIndex("TenantId", "ReportId", "SortOrder")
|
|
.HasDatabaseName("ix_practice_session_report_sections_tenant_id_report_id_sort_o~");
|
|
|
|
b.ToTable("practice_session_report_sections", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_practice_session_report_sections_accuracy", "accuracy >= 0 and accuracy <= 1");
|
|
|
|
t.HasCheckConstraint("ck_practice_session_report_sections_counts", "question_count >= 0 and answered_count >= 0 and correct_count >= 0 and wrong_count >= 0 and unanswered_count >= 0");
|
|
|
|
t.HasCheckConstraint("ck_practice_session_report_sections_scores", "score >= 0 and total_score >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.RecentPractice", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("Color")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("color");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<DateTimeOffset?>("LastAccessAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("last_access_at");
|
|
|
|
b.Property<DateTimeOffset?>("LastPracticeAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("last_practice_at");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("PracticeType")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("practice_type");
|
|
|
|
b.Property<int>("Progress")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("progress");
|
|
|
|
b.Property<string>("TargetLegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("target_legacy_id");
|
|
|
|
b.Property<string>("TargetName")
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("target_name");
|
|
|
|
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_recent_practices");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_recent_practices_tenant_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_recent_practices_user_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_recent_practices_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "UserId", "LastAccessAt")
|
|
.HasDatabaseName("ix_recent_practices_tenant_id_user_id_last_access_at");
|
|
|
|
b.ToTable("recent_practices", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.Report", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<JsonElement>("Attachments")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("attachments")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<string>("Category")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("category");
|
|
|
|
b.Property<string>("Contact")
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("contact");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<DateTimeOffset?>("HandledAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("handled_at");
|
|
|
|
b.Property<Guid?>("HandledBy")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("handled_by");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Priority")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("priority");
|
|
|
|
b.Property<Guid?>("QuestionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("question_id");
|
|
|
|
b.Property<string>("Resolution")
|
|
.HasColumnType("text")
|
|
.HasColumnName("resolution");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("status");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("Title")
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("title");
|
|
|
|
b.Property<string>("Type")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("type");
|
|
|
|
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_reports");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_reports_tenant_id_id");
|
|
|
|
b.HasIndex("HandledBy")
|
|
.HasDatabaseName("ix_reports_handled_by");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_reports_user_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_reports_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "QuestionId", "CreatedAt")
|
|
.HasDatabaseName("ix_reports_tenant_id_question_id_created_at")
|
|
.HasFilter("question_id is not null");
|
|
|
|
b.HasIndex("TenantId", "Status", "CreatedAt")
|
|
.HasDatabaseName("ix_reports_tenant_id_status_created_at");
|
|
|
|
b.ToTable("reports", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.ReportStatusEvent", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<Guid?>("ActorUserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("actor_user_id");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("FromStatus")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("from_status");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Note")
|
|
.HasColumnType("text")
|
|
.HasColumnName("note");
|
|
|
|
b.Property<Guid>("ReportId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("report_id");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("ToStatus")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("to_status");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_report_status_events");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_report_status_events_tenant_id_id");
|
|
|
|
b.HasIndex("ActorUserId")
|
|
.HasDatabaseName("ix_report_status_events_actor_user_id");
|
|
|
|
b.HasIndex("TenantId", "ReportId", "CreatedAt")
|
|
.HasDatabaseName("ix_report_status_events_tenant_id_report_id_created_at");
|
|
|
|
b.ToTable("report_status_events", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.RevenueDailyStat", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<int>("CodeCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("code_count");
|
|
|
|
b.Property<int>("CodeEstimated")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("code_estimated");
|
|
|
|
b.Property<int>("CodeUsed")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("code_used");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<int>("EstimatedRevenueCents")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("estimated_revenue_cents");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("LegacyRegionId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_region_id");
|
|
|
|
b.Property<int>("OrderCount")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("order_count");
|
|
|
|
b.Property<int>("RealRevenueCents")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("real_revenue_cents");
|
|
|
|
b.Property<DateTimeOffset?>("RebuiltAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("rebuilt_at");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<string>("SaleType")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("sale_type");
|
|
|
|
b.Property<DateOnly>("StatDate")
|
|
.HasColumnType("date")
|
|
.HasColumnName("stat_date");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_revenue_daily_stats");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_revenue_daily_stats_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_revenue_daily_stats_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_revenue_daily_stats_tenant_id_region_id");
|
|
|
|
b.HasIndex("TenantId", "StatDate", "RegionId", "SaleType")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_revenue_daily_stats_tenant_id_stat_date_region_id_sale_type");
|
|
|
|
NpgsqlIndexBuilderExtensions.AreNullsDistinct(b.HasIndex("TenantId", "StatDate", "RegionId", "SaleType"), false);
|
|
|
|
b.ToTable("revenue_daily_stats", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.UserScoreEvent", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<int>("BalanceAfter")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("balance_after");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("EventType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("event_type");
|
|
|
|
b.Property<string>("IdempotencyKey")
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("idempotency_key");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<int>("Points")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("points");
|
|
|
|
b.Property<Guid?>("SourceId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("source_id");
|
|
|
|
b.Property<string>("SourceType")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("source_type");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("user_id");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_user_score_events");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_user_score_events_tenant_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_user_score_events_user_id");
|
|
|
|
b.HasIndex("TenantId", "IdempotencyKey")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_user_score_events_tenant_id_idempotency_key");
|
|
|
|
b.HasIndex("TenantId", "UserId", "CreatedAt")
|
|
.HasDatabaseName("ix_user_score_events_tenant_id_user_id_created_at");
|
|
|
|
b.ToTable("user_score_events", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.WrongQuestion", b =>
|
|
{
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("user_id");
|
|
|
|
b.Property<Guid>("QuestionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("question_id");
|
|
|
|
b.Property<DateTimeOffset>("LastWrongAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("last_wrong_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<DateTimeOffset?>("ResolvedAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("resolved_at");
|
|
|
|
b.Property<int>("WrongCount")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("integer")
|
|
.HasDefaultValue(1)
|
|
.HasColumnName("wrong_count");
|
|
|
|
b.HasKey("TenantId", "UserId", "QuestionId")
|
|
.HasName("pk_wrong_questions");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_wrong_questions_user_id");
|
|
|
|
b.HasIndex("TenantId", "QuestionId")
|
|
.HasDatabaseName("ix_wrong_questions_tenant_id_question_id");
|
|
|
|
b.ToTable("wrong_questions", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.QuestionBanks.Question", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<Guid?>("CategoryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("category_id");
|
|
|
|
b.Property<Guid?>("ContentNodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("content_node_id");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<Guid?>("CurrentVersionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("current_version_id");
|
|
|
|
b.Property<int?>("Difficulty")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("difficulty");
|
|
|
|
b.Property<Guid?>("EntryId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("entry_id");
|
|
|
|
b.Property<JsonElement>("ExamMarkers")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("exam_markers")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<bool>("HasVideoExplanation")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("has_video_explanation");
|
|
|
|
b.Property<string>("LegacyCategoryId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_category_id");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("LegacyNodeId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_node_id");
|
|
|
|
b.Property<string>("LegacySubjectId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_subject_id");
|
|
|
|
b.Property<string>("MediaUrl")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("media_url");
|
|
|
|
b.Property<Guid?>("NodeId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("node_id");
|
|
|
|
b.Property<Guid?>("PrimaryCollectionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("primary_collection_id");
|
|
|
|
b.Property<Guid?>("QuestionBankId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("question_bank_id");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("status");
|
|
|
|
b.Property<Guid?>("SubjectId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("subject_id");
|
|
|
|
b.Property<JsonElement>("Tags")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("tags")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("Type")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("type");
|
|
|
|
b.Property<string>("TypeLabel")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("type_label");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_questions");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_questions_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "CategoryId")
|
|
.HasDatabaseName("ix_questions_tenant_id_category_id");
|
|
|
|
b.HasIndex("TenantId", "ContentNodeId")
|
|
.HasDatabaseName("ix_questions_tenant_id_content_node_id");
|
|
|
|
b.HasIndex("TenantId", "EntryId")
|
|
.HasDatabaseName("ix_questions_tenant_id_entry_id");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_questions_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "NodeId")
|
|
.HasDatabaseName("ix_questions_tenant_id_node_id");
|
|
|
|
b.HasIndex("TenantId", "PrimaryCollectionId")
|
|
.HasDatabaseName("ix_questions_tenant_id_primary_collection_id");
|
|
|
|
b.HasIndex("TenantId", "QuestionBankId")
|
|
.HasDatabaseName("ix_questions_tenant_id_question_bank_id");
|
|
|
|
b.HasIndex("TenantId", "SubjectId")
|
|
.HasDatabaseName("ix_questions_tenant_id_subject_id");
|
|
|
|
b.HasIndex("TenantId", "Id", "CurrentVersionId")
|
|
.HasDatabaseName("ix_questions_tenant_id_id_current_version_id");
|
|
|
|
b.ToTable("questions", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.QuestionBanks.QuestionBank", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<string>("SourceScope")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("source_scope");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_question_banks");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_question_banks_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_question_banks_tenant_id_region_id");
|
|
|
|
b.ToTable("question_banks", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.QuestionBanks.QuestionVersion", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("AnswerText")
|
|
.HasColumnType("text")
|
|
.HasColumnName("answer_text");
|
|
|
|
b.Property<string>("CodeLang")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("code_lang");
|
|
|
|
b.Property<string>("CodeTemplate")
|
|
.HasColumnType("text")
|
|
.HasColumnName("code_template");
|
|
|
|
b.Property<string>("Content")
|
|
.HasColumnType("text")
|
|
.HasColumnName("content");
|
|
|
|
b.Property<int?>("CorrectOptionIndex")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("correct_option_index");
|
|
|
|
b.Property<JsonElement>("CorrectOptionIndices")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("correct_option_indices")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
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<string>("Explanation")
|
|
.HasColumnType("text")
|
|
.HasColumnName("explanation");
|
|
|
|
b.Property<JsonElement>("Options")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("options")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<Guid>("QuestionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("question_id");
|
|
|
|
b.Property<string>("SourceHash")
|
|
.HasMaxLength(128)
|
|
.HasColumnType("character varying(128)")
|
|
.HasColumnName("source_hash");
|
|
|
|
b.Property<JsonElement>("SubQuestions")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("sub_questions")
|
|
.HasDefaultValueSql("'[]'::jsonb");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<int>("VersionNo")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("version_no");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_question_versions");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_question_versions_tenant_id_id");
|
|
|
|
b.HasAlternateKey("TenantId", "QuestionId", "Id")
|
|
.HasName("ak_question_versions_tenant_id_question_id_id");
|
|
|
|
b.HasIndex("CreatedBy")
|
|
.HasDatabaseName("ix_question_versions_created_by");
|
|
|
|
b.HasIndex("QuestionId", "VersionNo")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_question_versions_question_id_version_no");
|
|
|
|
b.ToTable("question_versions", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.AuthLoginEvent", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("FailureCode")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("failure_code");
|
|
|
|
b.Property<string>("Identifier")
|
|
.HasMaxLength(320)
|
|
.HasColumnType("character varying(320)")
|
|
.HasColumnName("identifier");
|
|
|
|
b.Property<string>("IpAddress")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("ip_address");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Provider")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("provider");
|
|
|
|
b.Property<string>("Result")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("result");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("UserAgent")
|
|
.HasMaxLength(1000)
|
|
.HasColumnType("character varying(1000)")
|
|
.HasColumnName("user_agent");
|
|
|
|
b.Property<Guid?>("UserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("user_id");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_auth_login_events");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_auth_login_events_tenant_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_auth_login_events_user_id");
|
|
|
|
b.HasIndex("TenantId", "UserId", "CreatedAt")
|
|
.HasDatabaseName("ix_auth_login_events_tenant_id_user_id_created_at");
|
|
|
|
b.ToTable("auth_login_events", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.AuthSession", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<DateTimeOffset>("ExpiresAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("expires_at");
|
|
|
|
b.Property<string>("IpAddress")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("ip_address");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Provider")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("provider");
|
|
|
|
b.Property<DateTimeOffset?>("RevokedAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("revoked_at");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("TokenHash")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("character varying(256)")
|
|
.HasColumnName("token_hash");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("UserAgent")
|
|
.HasMaxLength(1000)
|
|
.HasColumnType("character varying(1000)")
|
|
.HasColumnName("user_agent");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("user_id");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_auth_sessions");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_auth_sessions_tenant_id_id");
|
|
|
|
b.HasIndex("TokenHash")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_auth_sessions_token_hash");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_auth_sessions_user_id");
|
|
|
|
b.HasIndex("TenantId", "UserId", "ExpiresAt")
|
|
.HasDatabaseName("ix_auth_sessions_tenant_id_user_id_expires_at")
|
|
.HasFilter("revoked_at is null");
|
|
|
|
b.ToTable("auth_sessions", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.SmsSendRateLimit", b =>
|
|
{
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("Dimension")
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("dimension");
|
|
|
|
b.Property<string>("ScopeHash")
|
|
.HasMaxLength(128)
|
|
.HasColumnType("character varying(128)")
|
|
.HasColumnName("scope_hash");
|
|
|
|
b.Property<DateTimeOffset>("BucketStart")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("bucket_start");
|
|
|
|
b.Property<int>("RequestCount")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("integer")
|
|
.HasDefaultValue(0)
|
|
.HasColumnName("request_count");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.HasKey("TenantId", "Dimension", "ScopeHash", "BucketStart")
|
|
.HasName("pk_sms_send_rate_limits");
|
|
|
|
b.HasIndex("UpdatedAt")
|
|
.HasDatabaseName("ix_sms_send_rate_limits_updated_at");
|
|
|
|
b.ToTable("sms_send_rate_limits", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_sms_send_rate_limits_request_count", "request_count >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.SmsVerificationCode", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<int>("Attempts")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("attempts");
|
|
|
|
b.Property<string>("CodeHash")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("character varying(256)")
|
|
.HasColumnName("code_hash");
|
|
|
|
b.Property<DateTimeOffset?>("ConsumedAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("consumed_at");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<DateTimeOffset>("ExpiresAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("expires_at");
|
|
|
|
b.Property<string>("IpAddress")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("ip_address");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Phone")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("phone");
|
|
|
|
b.Property<string>("Provider")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("provider");
|
|
|
|
b.Property<string>("Purpose")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("purpose");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("status");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("UserAgent")
|
|
.HasMaxLength(1000)
|
|
.HasColumnType("character varying(1000)")
|
|
.HasColumnName("user_agent");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_sms_verification_codes");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_sms_verification_codes_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "Phone", "Purpose")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_sms_verification_codes_tenant_id_phone_purpose")
|
|
.HasFilter("consumed_at is null and status in ('pending', 'sent')");
|
|
|
|
b.HasIndex("TenantId", "Phone", "Purpose", "CreatedAt")
|
|
.HasDatabaseName("ix_sms_verification_codes_tenant_id_phone_purpose_created_at")
|
|
.HasFilter("consumed_at is null and status in ('pending', 'sent')");
|
|
|
|
b.HasIndex("TenantId", "Phone", "Purpose", "ExpiresAt")
|
|
.HasDatabaseName("ix_sms_verification_codes_tenant_id_phone_purpose_expires_at");
|
|
|
|
b.ToTable("sms_verification_codes", null, t =>
|
|
{
|
|
t.HasCheckConstraint("ck_sms_verification_codes_attempts", "attempts >= 0");
|
|
});
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.Tenant", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("BillingStatus")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("billing_status");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<string>("LegalName")
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("legal_name");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Mode")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("mode");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("OwnerUserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("owner_user_id");
|
|
|
|
b.Property<string>("Slug")
|
|
.IsRequired()
|
|
.HasMaxLength(100)
|
|
.HasColumnType("citext")
|
|
.HasColumnName("slug");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_tenants");
|
|
|
|
b.HasIndex("LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_tenants_legacy_id");
|
|
|
|
b.HasIndex("OwnerUserId")
|
|
.HasDatabaseName("ix_tenants_owner_user_id");
|
|
|
|
b.HasIndex("Slug")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_tenants_slug");
|
|
|
|
b.ToTable("tenants", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantAuthProvider", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<JsonElement>("ConfigPublic")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("config_public")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("DisplayName")
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("display_name");
|
|
|
|
b.Property<string>("Provider")
|
|
.IsRequired()
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("provider");
|
|
|
|
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.HasKey("Id")
|
|
.HasName("pk_tenant_auth_providers");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_tenant_auth_providers_tenant_id_id");
|
|
|
|
b.HasIndex("TenantId", "Provider")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_tenant_auth_providers_tenant_id_provider");
|
|
|
|
b.HasIndex("TenantId", "Provider", "Status")
|
|
.HasDatabaseName("ix_tenant_auth_providers_tenant_id_provider_status");
|
|
|
|
b.ToTable("tenant_auth_providers", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantBranding", b =>
|
|
{
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("BrandName")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("brand_name");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("FaviconUrl")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("favicon_url");
|
|
|
|
b.Property<string>("LogoUrl")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)")
|
|
.HasColumnName("logo_url");
|
|
|
|
b.Property<string>("OrganizationName")
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("organization_name");
|
|
|
|
b.Property<JsonElement>("PublicAssets")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("public_assets")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("ServiceAccountName")
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("service_account_name");
|
|
|
|
b.Property<string>("ServiceWechat")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("service_wechat");
|
|
|
|
b.Property<string>("ShortName")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("short_name");
|
|
|
|
b.Property<string>("Slogan")
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("slogan");
|
|
|
|
b.Property<JsonElement>("Theme")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("theme")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.HasKey("TenantId")
|
|
.HasName("pk_tenant_branding");
|
|
|
|
b.ToTable("tenant_branding", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantClass", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("Code")
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("code");
|
|
|
|
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<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<string>("LegacyId")
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)")
|
|
.HasColumnName("legacy_id");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<Guid?>("RegionId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("region_id");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
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?>("UpdatedBy")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("updated_by");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_tenant_classes");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_tenant_classes_tenant_id_id");
|
|
|
|
b.HasIndex("CreatedBy")
|
|
.HasDatabaseName("ix_tenant_classes_created_by");
|
|
|
|
b.HasIndex("UpdatedBy")
|
|
.HasDatabaseName("ix_tenant_classes_updated_by");
|
|
|
|
b.HasIndex("TenantId", "Code")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_tenant_classes_tenant_id_code")
|
|
.HasFilter("code is not null and code <> ''");
|
|
|
|
b.HasIndex("TenantId", "LegacyId")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_tenant_classes_tenant_id_legacy_id");
|
|
|
|
b.HasIndex("TenantId", "RegionId")
|
|
.HasDatabaseName("ix_tenant_classes_tenant_id_region_id")
|
|
.HasFilter("region_id is not null");
|
|
|
|
b.HasIndex("TenantId", "Status", "SortOrder", "CreatedAt")
|
|
.HasDatabaseName("ix_tenant_classes_tenant_id_status_sort_order_created_at");
|
|
|
|
b.ToTable("tenant_classes", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantClassMember", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<Guid>("ClassId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("class_id");
|
|
|
|
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>("JoinedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("joined_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<DateTimeOffset?>("LeftAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("left_at");
|
|
|
|
b.Property<string>("MemberType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("member_type");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.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?>("UpdatedBy")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("updated_by");
|
|
|
|
b.Property<Guid>("UserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("user_id");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_tenant_class_members");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_tenant_class_members_tenant_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_tenant_class_members_user_id");
|
|
|
|
b.HasIndex("TenantId", "ClassId", "Status", "MemberType")
|
|
.HasDatabaseName("ix_tenant_class_members_tenant_id_class_id_status_member_type");
|
|
|
|
b.HasIndex("TenantId", "ClassId", "UserId", "MemberType")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_tenant_class_members_tenant_id_class_id_user_id_member_type");
|
|
|
|
b.HasIndex("TenantId", "UserId", "Status", "MemberType")
|
|
.HasDatabaseName("ix_tenant_class_members_tenant_id_user_id_status_member_type");
|
|
|
|
b.ToTable("tenant_class_members", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantDomain", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("DomainType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("domain_type");
|
|
|
|
b.Property<string>("Host")
|
|
.IsRequired()
|
|
.HasMaxLength(253)
|
|
.HasColumnType("citext")
|
|
.HasColumnName("host");
|
|
|
|
b.Property<bool>("IsPrimary")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_primary");
|
|
|
|
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<string>("VerificationToken")
|
|
.HasMaxLength(256)
|
|
.HasColumnType("character varying(256)")
|
|
.HasColumnName("verification_token");
|
|
|
|
b.Property<DateTimeOffset?>("VerifiedAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("verified_at");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_tenant_domains");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_tenant_domains_tenant_id_id");
|
|
|
|
b.HasIndex("Host")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_tenant_domains_host");
|
|
|
|
b.HasIndex("TenantId", "IsPrimary")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_tenant_domains_tenant_id_is_primary")
|
|
.HasFilter("is_primary");
|
|
|
|
b.ToTable("tenant_domains", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantMembership", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<string>("LegacyRole")
|
|
.HasMaxLength(50)
|
|
.HasColumnType("character varying(50)")
|
|
.HasColumnName("legacy_role");
|
|
|
|
b.Property<JsonElement>("Permissions")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("permissions")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Role")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("role");
|
|
|
|
b.Property<Guid?>("RoleTemplateId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("role_template_id");
|
|
|
|
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_tenant_memberships");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_tenant_memberships_tenant_id_id");
|
|
|
|
b.HasIndex("UserId")
|
|
.HasDatabaseName("ix_tenant_memberships_user_id");
|
|
|
|
b.HasIndex("TenantId", "RoleTemplateId")
|
|
.HasDatabaseName("ix_tenant_memberships_tenant_id_role_template_id");
|
|
|
|
b.HasIndex("TenantId", "UserId", "Role")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_tenant_memberships_tenant_id_user_id_role");
|
|
|
|
b.ToTable("tenant_memberships", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantRoleTemplate", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("BaseRole")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("base_role");
|
|
|
|
b.Property<string>("Code")
|
|
.IsRequired()
|
|
.HasMaxLength(100)
|
|
.HasColumnType("character varying(100)")
|
|
.HasColumnName("code");
|
|
|
|
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<JsonElement>("DataScope")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("data_scope")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<JsonElement>("FieldPermissions")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("field_permissions")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<bool>("IsSystem")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_system");
|
|
|
|
b.Property<JsonElement>("MenuPermissions")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("menu_permissions")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<JsonElement>("ModulePermissions")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("module_permissions")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(200)
|
|
.HasColumnType("character varying(200)")
|
|
.HasColumnName("name");
|
|
|
|
b.Property<JsonElement>("Permissions")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("permissions")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer")
|
|
.HasColumnName("sort_order");
|
|
|
|
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?>("UpdatedBy")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("updated_by");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_tenant_role_templates");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_tenant_role_templates_tenant_id_id");
|
|
|
|
b.HasIndex("CreatedBy")
|
|
.HasDatabaseName("ix_tenant_role_templates_created_by");
|
|
|
|
b.HasIndex("UpdatedBy")
|
|
.HasDatabaseName("ix_tenant_role_templates_updated_by");
|
|
|
|
b.HasIndex("TenantId", "Code")
|
|
.IsUnique()
|
|
.HasDatabaseName("ix_tenant_role_templates_tenant_id_code");
|
|
|
|
b.HasIndex("TenantId", "Status", "SortOrder")
|
|
.HasDatabaseName("ix_tenant_role_templates_tenant_id_status_sort_order");
|
|
|
|
b.ToTable("tenant_role_templates", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantSettings", b =>
|
|
{
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<JsonElement>("AdminFeatureFlags")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("admin_feature_flags")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("created_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.Property<JsonElement>("FeatureFlags")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("feature_flags")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<JsonElement>("PublicConfig")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("public_config")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("updated_at")
|
|
.HasDefaultValueSql("now()");
|
|
|
|
b.HasKey("TenantId")
|
|
.HasName("pk_tenant_settings");
|
|
|
|
b.ToTable("tenant_settings", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantStudentFollowup", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<Guid?>("AssignedToUserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("assigned_to_user_id");
|
|
|
|
b.Property<Guid?>("ClassId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("class_id");
|
|
|
|
b.Property<DateTimeOffset?>("CompletedAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("completed_at");
|
|
|
|
b.Property<Guid?>("CompletedBy")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("completed_by");
|
|
|
|
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<string>("Description")
|
|
.HasColumnType("text")
|
|
.HasColumnName("description");
|
|
|
|
b.Property<DateTimeOffset?>("DueAt")
|
|
.HasColumnType("timestamp with time zone")
|
|
.HasColumnName("due_at");
|
|
|
|
b.Property<string>("FollowupType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("followup_type");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("Priority")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("priority");
|
|
|
|
b.Property<string>("Status")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("status");
|
|
|
|
b.Property<Guid>("StudentUserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("student_user_id");
|
|
|
|
b.Property<Guid>("TenantId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("tenant_id");
|
|
|
|
b.Property<string>("Title")
|
|
.IsRequired()
|
|
.HasMaxLength(300)
|
|
.HasColumnType("character varying(300)")
|
|
.HasColumnName("title");
|
|
|
|
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_student_followups");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_tenant_student_followups_tenant_id_id");
|
|
|
|
b.HasIndex("AssignedToUserId")
|
|
.HasDatabaseName("ix_tenant_student_followups_assigned_to_user_id");
|
|
|
|
b.HasIndex("CompletedBy")
|
|
.HasDatabaseName("ix_tenant_student_followups_completed_by");
|
|
|
|
b.HasIndex("StudentUserId")
|
|
.HasDatabaseName("ix_tenant_student_followups_student_user_id");
|
|
|
|
b.HasIndex("TenantId", "AssignedToUserId", "Status", "DueAt")
|
|
.HasDatabaseName("ix_tenant_student_followups_tenant_id_assigned_to_user_id_stat~")
|
|
.HasFilter("assigned_to_user_id is not null");
|
|
|
|
b.HasIndex("TenantId", "ClassId", "Status", "DueAt")
|
|
.HasDatabaseName("ix_tenant_student_followups_tenant_id_class_id_status_due_at")
|
|
.HasFilter("class_id is not null");
|
|
|
|
b.HasIndex("TenantId", "StudentUserId", "Status", "DueAt", "CreatedAt")
|
|
.HasDatabaseName("ix_tenant_student_followups_tenant_id_student_user_id_status_d~");
|
|
|
|
b.ToTable("tenant_student_followups", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantStudentNote", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("id")
|
|
.HasDefaultValueSql("gen_random_uuid()");
|
|
|
|
b.Property<string>("Content")
|
|
.IsRequired()
|
|
.HasColumnType("text")
|
|
.HasColumnName("content");
|
|
|
|
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<bool>("IsPinned")
|
|
.HasColumnType("boolean")
|
|
.HasColumnName("is_pinned");
|
|
|
|
b.Property<JsonElement>("Metadata")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("jsonb")
|
|
.HasColumnName("metadata")
|
|
.HasDefaultValueSql("'{}'::jsonb");
|
|
|
|
b.Property<string>("NoteType")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("note_type");
|
|
|
|
b.Property<Guid>("StudentUserId")
|
|
.HasColumnType("uuid")
|
|
.HasColumnName("student_user_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.Property<string>("Visibility")
|
|
.IsRequired()
|
|
.HasMaxLength(32)
|
|
.HasColumnType("character varying(32)")
|
|
.HasColumnName("visibility");
|
|
|
|
b.HasKey("Id")
|
|
.HasName("pk_tenant_student_notes");
|
|
|
|
b.HasAlternateKey("TenantId", "Id")
|
|
.HasName("ak_tenant_student_notes_tenant_id_id");
|
|
|
|
b.HasIndex("CreatedBy")
|
|
.HasDatabaseName("ix_tenant_student_notes_created_by");
|
|
|
|
b.HasIndex("StudentUserId")
|
|
.HasDatabaseName("ix_tenant_student_notes_student_user_id");
|
|
|
|
b.HasIndex("UpdatedBy")
|
|
.HasDatabaseName("ix_tenant_student_notes_updated_by");
|
|
|
|
b.HasIndex("TenantId", "CreatedBy", "CreatedAt")
|
|
.HasDatabaseName("ix_tenant_student_notes_tenant_id_created_by_created_at")
|
|
.HasFilter("created_by is not null");
|
|
|
|
b.HasIndex("TenantId", "StudentUserId", "IsPinned", "CreatedAt")
|
|
.HasDatabaseName("ix_tenant_student_notes_tenant_id_student_user_id_is_pinned_cr~");
|
|
|
|
b.ToTable("tenant_student_notes", (string)null);
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.Category", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_categories_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.ModuleNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "NodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_categories_module_nodes_tenant_id_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Subject", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SubjectId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_categories_subjects_tenant_id_subject_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.Major", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_majors_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_majors_regions_tenant_id_region_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.School", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SchoolId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_majors_schools_tenant_id_school_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.ModuleNode", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_module_nodes_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.RegionModule", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ModuleId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_module_nodes_region_modules_tenant_id_module_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.ModuleNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ParentId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_module_nodes_module_nodes_tenant_id_parent_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_module_nodes_regions_tenant_id_region_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.Region", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_regions_tenants_tenant_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.RegionModule", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_region_modules_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_region_modules_regions_tenant_id_region_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.School", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_schools_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.RegionModule", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ModuleId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_schools_region_modules_tenant_id_module_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_schools_regions_tenant_id_region_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Catalog.Subject", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_subjects_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Major", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "MajorId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_subjects_majors_tenant_id_major_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.RegionModule", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ModuleId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_subjects_region_modules_tenant_id_module_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.ModuleNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "NodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_subjects_module_nodes_tenant_id_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_subjects_regions_tenant_id_region_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.School", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SchoolId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_subjects_schools_tenant_id_school_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.AppAsset", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_app_assets_tenants_tenant_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ContentAsset", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("CreatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_content_assets_users_created_by");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_content_assets_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UpdatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_content_assets_users_updated_by");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("VerifiedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_content_assets_users_verified_by");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Category", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "CategoryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_content_assets_categories_tenant_id_category_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ContentNodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_content_assets_content_nodes_tenant_id_content_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_content_assets_regions_tenant_id_region_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Subject", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SubjectId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_content_assets_subjects_tenant_id_subject_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ContentEntry", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("CreatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_content_entries_users_created_by");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_content_entries_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UpdatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_content_entries_users_updated_by");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_content_entries_regions_tenant_id_region_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ContentImportIssue", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_content_import_issues_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentImportItem", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ItemId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.HasConstraintName("fk_content_import_issues_content_import_items_tenant_id_item_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentImportJob", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "JobId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_content_import_issues_content_import_jobs_tenant_id_job_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ContentImportItem", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_content_import_items_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentImportJob", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "JobId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_content_import_items_content_import_jobs_tenant_id_job_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ContentImportJob", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("CreatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_content_import_jobs_users_created_by");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_content_import_jobs_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Category", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "TargetCategoryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_content_import_jobs_categories_tenant_id_target_category_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "TargetContentNodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_content_import_jobs_content_nodes_tenant_id_target_content_~");
|
|
|
|
b.HasOne("Tiku.Domain.QuestionBanks.QuestionBank", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "TargetQuestionBankId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_content_import_jobs_question_banks_tenant_id_target_questio~");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "TargetRegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_content_import_jobs_regions_tenant_id_target_region_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Subject", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "TargetSubjectId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_content_import_jobs_subjects_tenant_id_target_subject_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ContentNode", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("CreatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_content_nodes_users_created_by");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_content_nodes_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UpdatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_content_nodes_users_updated_by");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentEntry", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "EntryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_content_nodes_content_entries_tenant_id_entry_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ParentId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.HasConstraintName("fk_content_nodes_content_nodes_tenant_id_parent_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_content_nodes_regions_tenant_id_region_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.HandbookChapter", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_handbook_chapters_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ContentNodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_handbook_chapters_content_nodes_tenant_id_content_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentEntry", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "EntryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_handbook_chapters_content_entries_tenant_id_entry_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.HandbookSubject", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SubjectId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.HasConstraintName("fk_handbook_chapters_handbook_subjects_tenant_id_subject_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.HandbookEntry", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_handbook_entries_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.HandbookChapter", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ChapterId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.HasConstraintName("fk_handbook_entries_handbook_chapters_tenant_id_chapter_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ContentNodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_handbook_entries_content_nodes_tenant_id_content_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentEntry", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "EntryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_handbook_entries_content_entries_tenant_id_entry_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.HandbookSubject", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_handbook_subjects_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ContentNodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_handbook_subjects_content_nodes_tenant_id_content_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentEntry", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "EntryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_handbook_subjects_content_entries_tenant_id_entry_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Major", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "MajorId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_handbook_subjects_majors_tenant_id_major_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_handbook_subjects_regions_tenant_id_region_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.School", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SchoolId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_handbook_subjects_schools_tenant_id_school_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.ImageAsset", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_images_tenants_tenant_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.PracticeBlueprint", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("CreatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_practice_blueprints_users_created_by");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_practice_blueprints_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UpdatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_practice_blueprints_users_updated_by");
|
|
|
|
b.HasOne("Tiku.Domain.Content.QuestionCollection", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "CollectionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_practice_blueprints_question_collections_tenant_id_collecti~");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentEntry", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "EntryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_practice_blueprints_content_entries_tenant_id_entry_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "NodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_practice_blueprints_content_nodes_tenant_id_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_practice_blueprints_regions_tenant_id_region_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.QuestionCollection", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("CreatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_question_collections_users_created_by");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_question_collections_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UpdatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_question_collections_users_updated_by");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Category", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "CategoryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_question_collections_categories_tenant_id_category_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentEntry", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "EntryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_question_collections_content_entries_tenant_id_entry_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "NodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_question_collections_content_nodes_tenant_id_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.QuestionBanks.QuestionBank", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "QuestionBankId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_question_collections_question_banks_tenant_id_question_bank~");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_question_collections_regions_tenant_id_region_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Subject", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SubjectId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_question_collections_subjects_tenant_id_subject_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.QuestionCollectionItem", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_question_collection_items_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.QuestionCollection", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "CollectionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_question_collection_items_question_collections_tenant_id_co~");
|
|
|
|
b.HasOne("Tiku.Domain.QuestionBanks.Question", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "QuestionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_question_collection_items_questions_tenant_id_question_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.QuestionTypeGroup", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_question_type_groups_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Subject", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SubjectId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.HasConstraintName("fk_question_type_groups_subjects_tenant_id_subject_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.QuestionVideo", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_question_videos_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.QuestionBanks.Question", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "QuestionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.HasConstraintName("fk_question_videos_questions_tenant_id_question_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.VideoExplanation", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "VideoId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.HasConstraintName("fk_question_videos_video_explanations_tenant_id_video_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.SubjectShare", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_subject_shares_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Subject", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SourceSubjectId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_subject_shares_subjects_tenant_id_source_subject_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Subject", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "TargetSubjectId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_subject_shares_subjects_tenant_id_target_subject_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.UserWordFavorite", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_user_word_favorites_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_user_word_favorites_users_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.VocabularyWord", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "WordId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_user_word_favorites_vocabulary_words_tenant_id_word_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.UserWordProgress", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_user_word_progress_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_user_word_progress_users_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.VocabularyWord", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "WordId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_user_word_progress_vocabulary_words_tenant_id_word_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.VideoExplanation", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_video_explanations_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Subject", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SubjectId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_video_explanations_subjects_tenant_id_subject_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.VocabularyUnit", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_vocabulary_units_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ContentNodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_vocabulary_units_content_nodes_tenant_id_content_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentEntry", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "EntryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_vocabulary_units_content_entries_tenant_id_entry_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_vocabulary_units_regions_tenant_id_region_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Content.VocabularyWord", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_vocabulary_words_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ContentNodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_vocabulary_words_content_nodes_tenant_id_content_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentEntry", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "EntryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_vocabulary_words_content_entries_tenant_id_entry_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.VocabularyUnit", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "UnitId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_vocabulary_words_vocabulary_units_tenant_id_unit_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Identity.StudentProfile", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_student_profiles_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_student_profiles_users_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_student_profiles_regions_tenant_id_region_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Major", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SelectedMajorId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_student_profiles_majors_tenant_id_selected_major_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.School", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SelectedSchoolId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_student_profiles_schools_tenant_id_selected_school_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Identity.UserIdentity", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_user_identities_users_user_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.AnswerRecord", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_answer_records_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_answer_records_users_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.QuestionBanks.Question", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "QuestionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_answer_records_questions_tenant_id_question_id");
|
|
|
|
b.HasOne("Tiku.Domain.QuestionBanks.QuestionVersion", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "QuestionId", "QuestionVersionId")
|
|
.HasPrincipalKey("TenantId", "QuestionId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_answer_records_question_versions_tenant_id_question_id_ques~");
|
|
|
|
b.HasOne("Tiku.Domain.Learning.PracticeSession", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "UserId", "PracticeSessionId")
|
|
.HasPrincipalKey("TenantId", "UserId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_answer_records_practice_sessions_tenant_id_user_id_practice~");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.DashboardDailyStat", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_dashboard_daily_stats_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_dashboard_daily_stats_regions_tenant_id_region_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.ExamDate", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_exam_dates_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_exam_dates_regions_tenant_id_region_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.School", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SchoolId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_exam_dates_schools_tenant_id_school_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.FavoriteQuestion", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_favorite_questions_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_favorite_questions_users_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.QuestionBanks.Question", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "QuestionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_favorite_questions_questions_tenant_id_question_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.PracticeAccessEvent", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_practice_access_events_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_practice_access_events_users_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.Learning.PracticeSession", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "PracticeSessionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_practice_access_events_practice_sessions_tenant_id_practice~");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.PracticeDailyUsage", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_practice_daily_usage_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_practice_daily_usage_users_user_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.PracticeSession", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_practice_sessions_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_practice_sessions_users_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.PracticeBlueprint", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "BlueprintId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_practice_sessions_practice_blueprints_tenant_id_blueprint_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.QuestionCollection", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "CollectionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_practice_sessions_question_collections_tenant_id_collection~");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ContentNodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_practice_sessions_content_nodes_tenant_id_content_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentEntry", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "EntryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_practice_sessions_content_entries_tenant_id_entry_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.PracticeSessionReport", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_practice_session_reports_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_practice_session_reports_users_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.PracticeBlueprint", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "BlueprintId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_practice_session_reports_practice_blueprints_tenant_id_blue~");
|
|
|
|
b.HasOne("Tiku.Domain.Content.QuestionCollection", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "CollectionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_practice_session_reports_question_collections_tenant_id_col~");
|
|
|
|
b.HasOne("Tiku.Domain.Learning.PracticeSession", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "PracticeSessionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_practice_session_reports_practice_sessions_tenant_id_practi~");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.PracticeSessionReportSection", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_practice_session_report_sections_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Learning.PracticeSession", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "PracticeSessionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_practice_session_report_sections_practice_sessions_tenant_i~");
|
|
|
|
b.HasOne("Tiku.Domain.Learning.PracticeSessionReport", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ReportId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_practice_session_report_sections_practice_session_reports_t~");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.RecentPractice", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_recent_practices_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.HasConstraintName("fk_recent_practices_users_user_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.Report", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("HandledBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_reports_users_handled_by");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_reports_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_reports_users_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.QuestionBanks.Question", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "QuestionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_reports_questions_tenant_id_question_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.ReportStatusEvent", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("ActorUserId")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_report_status_events_users_actor_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_report_status_events_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Learning.Report", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ReportId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_report_status_events_reports_tenant_id_report_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.RevenueDailyStat", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_revenue_daily_stats_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_revenue_daily_stats_regions_tenant_id_region_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.UserScoreEvent", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_user_score_events_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_user_score_events_users_user_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Learning.WrongQuestion", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_wrong_questions_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_wrong_questions_users_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.QuestionBanks.Question", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "QuestionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_wrong_questions_questions_tenant_id_question_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.QuestionBanks.Question", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_questions_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Category", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "CategoryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_questions_categories_tenant_id_category_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ContentNodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_questions_content_nodes_tenant_id_content_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.ContentEntry", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "EntryId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_questions_content_entries_tenant_id_entry_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.ModuleNode", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "NodeId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_questions_module_nodes_tenant_id_node_id");
|
|
|
|
b.HasOne("Tiku.Domain.Content.QuestionCollection", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "PrimaryCollectionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_questions_question_collections_tenant_id_primary_collection~");
|
|
|
|
b.HasOne("Tiku.Domain.QuestionBanks.QuestionBank", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "QuestionBankId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_questions_question_banks_tenant_id_question_bank_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Subject", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "SubjectId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_questions_subjects_tenant_id_subject_id");
|
|
|
|
b.HasOne("Tiku.Domain.QuestionBanks.QuestionVersion", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "Id", "CurrentVersionId")
|
|
.HasPrincipalKey("TenantId", "QuestionId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_questions_question_versions_tenant_id_id_current_version_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.QuestionBanks.QuestionBank", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_question_banks_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_question_banks_regions_tenant_id_region_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.QuestionBanks.QuestionVersion", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("CreatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_question_versions_users_created_by");
|
|
|
|
b.HasOne("Tiku.Domain.QuestionBanks.Question", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "QuestionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_question_versions_questions_tenant_id_question_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.AuthLoginEvent", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_auth_login_events_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_auth_login_events_users_user_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.AuthSession", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_auth_sessions_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_auth_sessions_users_user_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.SmsSendRateLimit", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_sms_send_rate_limits_tenants_tenant_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.SmsVerificationCode", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_sms_verification_codes_tenants_tenant_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.Tenant", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("OwnerUserId")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_tenants_users_owner_user_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantAuthProvider", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_auth_providers_tenants_tenant_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantBranding", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithOne()
|
|
.HasForeignKey("Tiku.Domain.Tenancy.TenantBranding", "TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_branding_tenants_tenant_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantClass", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("CreatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_tenant_classes_users_created_by");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_classes_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UpdatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_tenant_classes_users_updated_by");
|
|
|
|
b.HasOne("Tiku.Domain.Catalog.Region", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RegionId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_tenant_classes_regions_tenant_id_region_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantClassMember", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_class_members_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_class_members_users_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.TenantClass", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ClassId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_class_members_tenant_classes_tenant_id_class_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantDomain", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_domains_tenants_tenant_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantMembership", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_memberships_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_memberships_users_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.TenantRoleTemplate", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "RoleTemplateId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.Restrict)
|
|
.HasConstraintName("fk_tenant_memberships_tenant_role_templates_tenant_id_role_tem~");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantRoleTemplate", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("CreatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_tenant_role_templates_users_created_by");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_role_templates_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UpdatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_tenant_role_templates_users_updated_by");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantSettings", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithOne()
|
|
.HasForeignKey("Tiku.Domain.Tenancy.TenantSettings", "TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_settings_tenants_tenant_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantStudentFollowup", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("AssignedToUserId")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_tenant_student_followups_users_assigned_to_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("CompletedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_tenant_student_followups_users_completed_by");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("StudentUserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_student_followups_users_student_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_student_followups_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.TenantClass", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId", "ClassId")
|
|
.HasPrincipalKey("TenantId", "Id")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_tenant_student_followups_tenant_classes_tenant_id_class_id");
|
|
});
|
|
|
|
modelBuilder.Entity("Tiku.Domain.Tenancy.TenantStudentNote", b =>
|
|
{
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("CreatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_tenant_student_notes_users_created_by");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("StudentUserId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_student_notes_users_student_user_id");
|
|
|
|
b.HasOne("Tiku.Domain.Tenancy.Tenant", null)
|
|
.WithMany()
|
|
.HasForeignKey("TenantId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired()
|
|
.HasConstraintName("fk_tenant_student_notes_tenants_tenant_id");
|
|
|
|
b.HasOne("Tiku.Domain.Identity.User", null)
|
|
.WithMany()
|
|
.HasForeignKey("UpdatedBy")
|
|
.OnDelete(DeleteBehavior.SetNull)
|
|
.HasConstraintName("fk_tenant_student_notes_users_updated_by");
|
|
});
|
|
#pragma warning restore 612, 618
|
|
}
|
|
}
|
|
}
|