using System; using Microsoft.EntityFrameworkCore.Migrations; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; using Pgvector; #nullable disable #pragma warning disable CA1814 // Prefer jagged arrays over multidimensional namespace NexusReader.Data.Migrations { /// public partial class FinalNormalizedSubscriptionArchitecture : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.DropColumn( name: "CurrentPlan", table: "AspNetUsers"); migrationBuilder.AlterDatabase() .Annotation("Npgsql:PostgresExtension:vector", ",,"); migrationBuilder.AlterColumn( name: "CreatedAt", table: "SemanticKnowledgeCache", type: "timestamp with time zone", nullable: false, oldClrType: typeof(DateTime), oldType: "timestamp without time zone"); migrationBuilder.AddColumn( name: "OriginalText", table: "SemanticKnowledgeCache", type: "text", nullable: false, defaultValue: ""); migrationBuilder.AddColumn( name: "TenantId", table: "SemanticKnowledgeCache", type: "character varying(128)", maxLength: 128, nullable: false, defaultValue: ""); migrationBuilder.AddColumn( name: "Vector", table: "SemanticKnowledgeCache", type: "vector(1536)", nullable: true); migrationBuilder.AlterColumn( name: "CompletedDate", table: "QuizResults", type: "timestamp with time zone", nullable: false, oldClrType: typeof(DateTime), oldType: "timestamp without time zone"); migrationBuilder.AddColumn( name: "TenantId", table: "QuizResults", type: "character varying(128)", maxLength: 128, nullable: false, defaultValue: ""); migrationBuilder.AlterColumn( name: "LastReadDate", table: "Ebooks", type: "timestamp with time zone", nullable: true, oldClrType: typeof(DateTime), oldType: "timestamp without time zone", oldNullable: true); migrationBuilder.AlterColumn( name: "AddedDate", table: "Ebooks", type: "timestamp with time zone", nullable: false, oldClrType: typeof(DateTime), oldType: "timestamp without time zone"); migrationBuilder.AddColumn( name: "TenantId", table: "Ebooks", type: "character varying(128)", maxLength: 128, nullable: false, defaultValue: ""); migrationBuilder.AlterColumn( name: "TenantId", table: "AspNetUsers", type: "character varying(128)", maxLength: 128, nullable: false, oldClrType: typeof(Guid), oldType: "uuid"); migrationBuilder.AddColumn( name: "DisplayName", table: "AspNetUsers", type: "character varying(100)", maxLength: 100, nullable: true); migrationBuilder.AddColumn( name: "LastAiActionDate", table: "AspNetUsers", type: "timestamp with time zone", nullable: true); migrationBuilder.AddColumn( name: "LastReadAt", table: "AspNetUsers", type: "timestamp with time zone", nullable: true); migrationBuilder.AddColumn( name: "LastReadPageId", table: "AspNetUsers", type: "character varying(255)", maxLength: 255, nullable: true); migrationBuilder.AddColumn( name: "SubscriptionPlanId", table: "AspNetUsers", type: "integer", nullable: false, defaultValue: 1); migrationBuilder.CreateTable( name: "KnowledgeUnits", columns: table => new { Id = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), SourceId = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), Version = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), Type = table.Column(type: "integer", nullable: false), Content = table.Column(type: "text", nullable: false), MetadataJson = table.Column(type: "text", nullable: true), TenantId = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), Vector = table.Column(type: "vector(768)", nullable: true), CreatedAt = table.Column(type: "timestamp with time zone", nullable: false) }, constraints: table => { table.PrimaryKey("PK_KnowledgeUnits", x => x.Id); }); migrationBuilder.CreateTable( name: "SubscriptionPlans", columns: table => new { Id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), PlanName = table.Column(type: "character varying(50)", maxLength: 50, nullable: false), AITokenLimit = table.Column(type: "integer", nullable: false), MonthlyPrice = table.Column(type: "numeric", nullable: false), StripeProductId = table.Column(type: "character varying(50)", maxLength: 50, nullable: false) }, constraints: table => { table.PrimaryKey("PK_SubscriptionPlans", x => x.Id); }); migrationBuilder.CreateTable( name: "KnowledgeUnitLinks", columns: table => new { Id = table.Column(type: "integer", nullable: false) .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), SourceUnitId = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), TargetUnitId = table.Column(type: "character varying(128)", maxLength: 128, nullable: false), RelationType = table.Column(type: "character varying(50)", maxLength: 50, nullable: false) }, constraints: table => { table.PrimaryKey("PK_KnowledgeUnitLinks", x => x.Id); table.ForeignKey( name: "FK_KnowledgeUnitLinks_KnowledgeUnits_SourceUnitId", column: x => x.SourceUnitId, principalTable: "KnowledgeUnits", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_KnowledgeUnitLinks_KnowledgeUnits_TargetUnitId", column: x => x.TargetUnitId, principalTable: "KnowledgeUnits", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.InsertData( table: "SubscriptionPlans", columns: new[] { "Id", "AITokenLimit", "MonthlyPrice", "PlanName", "StripeProductId" }, values: new object[,] { { 1, 1000, 0m, "Free", "" }, { 2, 10000, 9.99m, "Basic", "prod_basic_placeholder" }, { 3, 50000, 19.99m, "Pro", "prod_pro_placeholder" }, { 4, 500000, 99.99m, "Enterprise", "prod_enterprise_placeholder" } }); migrationBuilder.CreateIndex( name: "IX_SemanticKnowledgeCache_TenantId", table: "SemanticKnowledgeCache", column: "TenantId"); migrationBuilder.CreateIndex( name: "IX_QuizResults_TenantId", table: "QuizResults", column: "TenantId"); migrationBuilder.CreateIndex( name: "IX_Ebooks_TenantId", table: "Ebooks", column: "TenantId"); migrationBuilder.CreateIndex( name: "IX_AspNetUsers_SubscriptionPlanId", table: "AspNetUsers", column: "SubscriptionPlanId"); migrationBuilder.CreateIndex( name: "IX_AspNetUsers_TenantId", table: "AspNetUsers", column: "TenantId"); migrationBuilder.CreateIndex( name: "IX_KnowledgeUnitLinks_SourceUnitId", table: "KnowledgeUnitLinks", column: "SourceUnitId"); migrationBuilder.CreateIndex( name: "IX_KnowledgeUnitLinks_TargetUnitId", table: "KnowledgeUnitLinks", column: "TargetUnitId"); migrationBuilder.CreateIndex( name: "IX_KnowledgeUnits_SourceId", table: "KnowledgeUnits", column: "SourceId"); migrationBuilder.CreateIndex( name: "IX_KnowledgeUnits_TenantId", table: "KnowledgeUnits", column: "TenantId"); migrationBuilder.CreateIndex( name: "IX_SubscriptionPlans_PlanName", table: "SubscriptionPlans", column: "PlanName", unique: true); migrationBuilder.AddForeignKey( name: "FK_AspNetUsers_SubscriptionPlans_SubscriptionPlanId", table: "AspNetUsers", column: "SubscriptionPlanId", principalTable: "SubscriptionPlans", principalColumn: "Id", onDelete: ReferentialAction.Restrict); } /// protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropForeignKey( name: "FK_AspNetUsers_SubscriptionPlans_SubscriptionPlanId", table: "AspNetUsers"); migrationBuilder.DropTable( name: "KnowledgeUnitLinks"); migrationBuilder.DropTable( name: "SubscriptionPlans"); migrationBuilder.DropTable( name: "KnowledgeUnits"); migrationBuilder.DropIndex( name: "IX_SemanticKnowledgeCache_TenantId", table: "SemanticKnowledgeCache"); migrationBuilder.DropIndex( name: "IX_QuizResults_TenantId", table: "QuizResults"); migrationBuilder.DropIndex( name: "IX_Ebooks_TenantId", table: "Ebooks"); migrationBuilder.DropIndex( name: "IX_AspNetUsers_SubscriptionPlanId", table: "AspNetUsers"); migrationBuilder.DropIndex( name: "IX_AspNetUsers_TenantId", table: "AspNetUsers"); migrationBuilder.DropColumn( name: "OriginalText", table: "SemanticKnowledgeCache"); migrationBuilder.DropColumn( name: "TenantId", table: "SemanticKnowledgeCache"); migrationBuilder.DropColumn( name: "Vector", table: "SemanticKnowledgeCache"); migrationBuilder.DropColumn( name: "TenantId", table: "QuizResults"); migrationBuilder.DropColumn( name: "TenantId", table: "Ebooks"); migrationBuilder.DropColumn( name: "DisplayName", table: "AspNetUsers"); migrationBuilder.DropColumn( name: "LastAiActionDate", table: "AspNetUsers"); migrationBuilder.DropColumn( name: "LastReadAt", table: "AspNetUsers"); migrationBuilder.DropColumn( name: "LastReadPageId", table: "AspNetUsers"); migrationBuilder.DropColumn( name: "SubscriptionPlanId", table: "AspNetUsers"); migrationBuilder.AlterDatabase() .OldAnnotation("Npgsql:PostgresExtension:vector", ",,"); migrationBuilder.AlterColumn( name: "CreatedAt", table: "SemanticKnowledgeCache", type: "timestamp without time zone", nullable: false, oldClrType: typeof(DateTime), oldType: "timestamp with time zone"); migrationBuilder.AlterColumn( name: "CompletedDate", table: "QuizResults", type: "timestamp without time zone", nullable: false, oldClrType: typeof(DateTime), oldType: "timestamp with time zone"); migrationBuilder.AlterColumn( name: "LastReadDate", table: "Ebooks", type: "timestamp without time zone", nullable: true, oldClrType: typeof(DateTime), oldType: "timestamp with time zone", oldNullable: true); migrationBuilder.AlterColumn( name: "AddedDate", table: "Ebooks", type: "timestamp without time zone", nullable: false, oldClrType: typeof(DateTime), oldType: "timestamp with time zone"); migrationBuilder.AlterColumn( name: "TenantId", table: "AspNetUsers", type: "uuid", nullable: false, oldClrType: typeof(string), oldType: "character varying(128)", oldMaxLength: 128); migrationBuilder.AddColumn( name: "CurrentPlan", table: "AspNetUsers", type: "text", nullable: false, defaultValue: ""); } } }