using System; using Microsoft.EntityFrameworkCore.Migrations; #nullable disable namespace DramaLing.Api.Migrations { /// public partial class AddSentenceAnalysisCache : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "SentenceAnalysisCache", columns: table => new { Id = table.Column(type: "TEXT", nullable: false), InputTextHash = table.Column(type: "TEXT", maxLength: 64, nullable: false), InputText = table.Column(type: "TEXT", maxLength: 1000, nullable: false), CorrectedText = table.Column(type: "TEXT", maxLength: 1000, nullable: true), HasGrammarErrors = table.Column(type: "INTEGER", nullable: false), GrammarCorrections = table.Column(type: "TEXT", nullable: true), AnalysisResult = table.Column(type: "TEXT", nullable: false), HighValueWords = table.Column(type: "TEXT", nullable: true), PhrasesDetected = table.Column(type: "TEXT", nullable: true), CreatedAt = table.Column(type: "TEXT", nullable: false), ExpiresAt = table.Column(type: "TEXT", nullable: false), AccessCount = table.Column(type: "INTEGER", nullable: false), LastAccessedAt = table.Column(type: "TEXT", nullable: true) }, constraints: table => { table.PrimaryKey("PK_SentenceAnalysisCache", x => x.Id); }); migrationBuilder.CreateTable( name: "user_profiles", columns: table => new { Id = table.Column(type: "TEXT", nullable: false), username = table.Column(type: "TEXT", maxLength: 50, nullable: false), email = table.Column(type: "TEXT", maxLength: 255, nullable: false), password_hash = table.Column(type: "TEXT", maxLength: 255, nullable: false), display_name = table.Column(type: "TEXT", maxLength: 100, nullable: true), avatar_url = table.Column(type: "TEXT", nullable: true), subscription_type = table.Column(type: "TEXT", maxLength: 20, nullable: false), preferences = table.Column(type: "TEXT", nullable: false), created_at = table.Column(type: "TEXT", nullable: false), updated_at = table.Column(type: "TEXT", nullable: false) }, constraints: table => { table.PrimaryKey("PK_user_profiles", x => x.Id); }); migrationBuilder.CreateTable( name: "card_sets", columns: table => new { Id = table.Column(type: "TEXT", nullable: false), UserId = table.Column(type: "TEXT", nullable: false), Name = table.Column(type: "TEXT", maxLength: 255, nullable: false), Description = table.Column(type: "TEXT", nullable: true), Color = table.Column(type: "TEXT", maxLength: 50, nullable: false), CardCount = table.Column(type: "INTEGER", nullable: false), IsDefault = table.Column(type: "INTEGER", nullable: false), CreatedAt = table.Column(type: "TEXT", nullable: false), UpdatedAt = table.Column(type: "TEXT", nullable: false) }, constraints: table => { table.PrimaryKey("PK_card_sets", x => x.Id); table.ForeignKey( name: "FK_card_sets_user_profiles_UserId", column: x => x.UserId, principalTable: "user_profiles", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "daily_stats", columns: table => new { Id = table.Column(type: "TEXT", nullable: false), user_id = table.Column(type: "TEXT", nullable: false), Date = table.Column(type: "TEXT", nullable: false), words_studied = table.Column(type: "INTEGER", nullable: false), words_correct = table.Column(type: "INTEGER", nullable: false), study_time_seconds = table.Column(type: "INTEGER", nullable: false), session_count = table.Column(type: "INTEGER", nullable: false), cards_generated = table.Column(type: "INTEGER", nullable: false), ai_api_calls = table.Column(type: "INTEGER", nullable: false), created_at = table.Column(type: "TEXT", nullable: false) }, constraints: table => { table.PrimaryKey("PK_daily_stats", x => x.Id); table.ForeignKey( name: "FK_daily_stats_user_profiles_user_id", column: x => x.user_id, principalTable: "user_profiles", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "study_sessions", columns: table => new { Id = table.Column(type: "TEXT", nullable: false), user_id = table.Column(type: "TEXT", nullable: false), session_type = table.Column(type: "TEXT", maxLength: 50, nullable: false), started_at = table.Column(type: "TEXT", nullable: false), ended_at = table.Column(type: "TEXT", nullable: true), total_cards = table.Column(type: "INTEGER", nullable: false), correct_count = table.Column(type: "INTEGER", nullable: false), duration_seconds = table.Column(type: "INTEGER", nullable: false), average_response_time_ms = table.Column(type: "INTEGER", nullable: false) }, constraints: table => { table.PrimaryKey("PK_study_sessions", x => x.Id); table.ForeignKey( name: "FK_study_sessions_user_profiles_user_id", column: x => x.user_id, principalTable: "user_profiles", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "tags", columns: table => new { Id = table.Column(type: "TEXT", nullable: false), user_id = table.Column(type: "TEXT", nullable: false), Name = table.Column(type: "TEXT", maxLength: 100, nullable: false), Color = table.Column(type: "TEXT", maxLength: 50, nullable: false), usage_count = table.Column(type: "INTEGER", nullable: false), created_at = table.Column(type: "TEXT", nullable: false) }, constraints: table => { table.PrimaryKey("PK_tags", x => x.Id); table.ForeignKey( name: "FK_tags_user_profiles_user_id", column: x => x.user_id, principalTable: "user_profiles", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "user_settings", columns: table => new { Id = table.Column(type: "TEXT", nullable: false), UserId = table.Column(type: "TEXT", nullable: false), DailyGoal = table.Column(type: "INTEGER", nullable: false), ReminderTime = table.Column(type: "TEXT", nullable: false), ReminderEnabled = table.Column(type: "INTEGER", nullable: false), DifficultyPreference = table.Column(type: "TEXT", maxLength: 20, nullable: false), AutoPlayAudio = table.Column(type: "INTEGER", nullable: false), ShowPronunciation = table.Column(type: "INTEGER", nullable: false), CreatedAt = table.Column(type: "TEXT", nullable: false), UpdatedAt = table.Column(type: "TEXT", nullable: false) }, constraints: table => { table.PrimaryKey("PK_user_settings", x => x.Id); table.ForeignKey( name: "FK_user_settings_user_profiles_UserId", column: x => x.UserId, principalTable: "user_profiles", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "flashcards", columns: table => new { Id = table.Column(type: "TEXT", nullable: false), user_id = table.Column(type: "TEXT", nullable: false), card_set_id = table.Column(type: "TEXT", nullable: false), Word = table.Column(type: "TEXT", maxLength: 255, nullable: false), Translation = table.Column(type: "TEXT", nullable: false), Definition = table.Column(type: "TEXT", nullable: false), part_of_speech = table.Column(type: "TEXT", maxLength: 50, nullable: true), Pronunciation = table.Column(type: "TEXT", maxLength: 255, nullable: true), Example = table.Column(type: "TEXT", nullable: true), example_translation = table.Column(type: "TEXT", nullable: true), easiness_factor = table.Column(type: "REAL", nullable: false), Repetitions = table.Column(type: "INTEGER", nullable: false), interval_days = table.Column(type: "INTEGER", nullable: false), next_review_date = table.Column(type: "TEXT", nullable: false), mastery_level = table.Column(type: "INTEGER", nullable: false), times_reviewed = table.Column(type: "INTEGER", nullable: false), times_correct = table.Column(type: "INTEGER", nullable: false), last_reviewed_at = table.Column(type: "TEXT", nullable: true), is_favorite = table.Column(type: "INTEGER", nullable: false), is_archived = table.Column(type: "INTEGER", nullable: false), difficulty_level = table.Column(type: "TEXT", maxLength: 10, nullable: true), created_at = table.Column(type: "TEXT", nullable: false), updated_at = table.Column(type: "TEXT", nullable: false) }, constraints: table => { table.PrimaryKey("PK_flashcards", x => x.Id); table.ForeignKey( name: "FK_flashcards_card_sets_card_set_id", column: x => x.card_set_id, principalTable: "card_sets", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_flashcards_user_profiles_user_id", column: x => x.user_id, principalTable: "user_profiles", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "error_reports", columns: table => new { Id = table.Column(type: "TEXT", nullable: false), user_id = table.Column(type: "TEXT", nullable: false), flashcard_id = table.Column(type: "TEXT", nullable: false), report_type = table.Column(type: "TEXT", maxLength: 100, nullable: false), Description = table.Column(type: "TEXT", nullable: true), study_mode = table.Column(type: "TEXT", maxLength: 50, nullable: true), Status = table.Column(type: "TEXT", maxLength: 50, nullable: false), admin_notes = table.Column(type: "TEXT", nullable: true), resolved_at = table.Column(type: "TEXT", nullable: true), resolved_by = table.Column(type: "TEXT", nullable: true), created_at = table.Column(type: "TEXT", nullable: false) }, constraints: table => { table.PrimaryKey("PK_error_reports", x => x.Id); table.ForeignKey( name: "FK_error_reports_flashcards_flashcard_id", column: x => x.flashcard_id, principalTable: "flashcards", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_error_reports_user_profiles_resolved_by", column: x => x.resolved_by, principalTable: "user_profiles", principalColumn: "Id", onDelete: ReferentialAction.SetNull); table.ForeignKey( name: "FK_error_reports_user_profiles_user_id", column: x => x.user_id, principalTable: "user_profiles", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "flashcard_tags", columns: table => new { flashcard_id = table.Column(type: "TEXT", nullable: false), tag_id = table.Column(type: "TEXT", nullable: false) }, constraints: table => { table.PrimaryKey("PK_flashcard_tags", x => new { x.flashcard_id, x.tag_id }); table.ForeignKey( name: "FK_flashcard_tags_flashcards_flashcard_id", column: x => x.flashcard_id, principalTable: "flashcards", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_flashcard_tags_tags_tag_id", column: x => x.tag_id, principalTable: "tags", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( name: "study_records", columns: table => new { Id = table.Column(type: "TEXT", nullable: false), user_id = table.Column(type: "TEXT", nullable: false), flashcard_id = table.Column(type: "TEXT", nullable: false), session_id = table.Column(type: "TEXT", nullable: false), study_mode = table.Column(type: "TEXT", maxLength: 50, nullable: false), quality_rating = table.Column(type: "INTEGER", nullable: false), response_time_ms = table.Column(type: "INTEGER", nullable: true), user_answer = table.Column(type: "TEXT", nullable: true), is_correct = table.Column(type: "INTEGER", nullable: false), PreviousEasinessFactor = table.Column(type: "REAL", nullable: false), NewEasinessFactor = table.Column(type: "REAL", nullable: false), PreviousIntervalDays = table.Column(type: "INTEGER", nullable: false), NewIntervalDays = table.Column(type: "INTEGER", nullable: false), PreviousRepetitions = table.Column(type: "INTEGER", nullable: false), NewRepetitions = table.Column(type: "INTEGER", nullable: false), NextReviewDate = table.Column(type: "TEXT", nullable: false), studied_at = table.Column(type: "TEXT", nullable: false) }, constraints: table => { table.PrimaryKey("PK_study_records", x => x.Id); table.ForeignKey( name: "FK_study_records_flashcards_flashcard_id", column: x => x.flashcard_id, principalTable: "flashcards", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_study_records_study_sessions_session_id", column: x => x.session_id, principalTable: "study_sessions", principalColumn: "Id", onDelete: ReferentialAction.Cascade); table.ForeignKey( name: "FK_study_records_user_profiles_user_id", column: x => x.user_id, principalTable: "user_profiles", principalColumn: "Id", onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateIndex( name: "IX_card_sets_UserId", table: "card_sets", column: "UserId"); migrationBuilder.CreateIndex( name: "IX_daily_stats_user_id_Date", table: "daily_stats", columns: new[] { "user_id", "Date" }, unique: true); migrationBuilder.CreateIndex( name: "IX_error_reports_flashcard_id", table: "error_reports", column: "flashcard_id"); migrationBuilder.CreateIndex( name: "IX_error_reports_resolved_by", table: "error_reports", column: "resolved_by"); migrationBuilder.CreateIndex( name: "IX_error_reports_user_id", table: "error_reports", column: "user_id"); migrationBuilder.CreateIndex( name: "IX_flashcard_tags_tag_id", table: "flashcard_tags", column: "tag_id"); migrationBuilder.CreateIndex( name: "IX_flashcards_card_set_id", table: "flashcards", column: "card_set_id"); migrationBuilder.CreateIndex( name: "IX_flashcards_user_id", table: "flashcards", column: "user_id"); migrationBuilder.CreateIndex( name: "IX_SentenceAnalysisCache_Expires", table: "SentenceAnalysisCache", column: "ExpiresAt"); migrationBuilder.CreateIndex( name: "IX_SentenceAnalysisCache_Hash", table: "SentenceAnalysisCache", column: "InputTextHash"); migrationBuilder.CreateIndex( name: "IX_SentenceAnalysisCache_Hash_Expires", table: "SentenceAnalysisCache", columns: new[] { "InputTextHash", "ExpiresAt" }); migrationBuilder.CreateIndex( name: "IX_study_records_flashcard_id", table: "study_records", column: "flashcard_id"); migrationBuilder.CreateIndex( name: "IX_study_records_session_id", table: "study_records", column: "session_id"); migrationBuilder.CreateIndex( name: "IX_study_records_user_id", table: "study_records", column: "user_id"); migrationBuilder.CreateIndex( name: "IX_study_sessions_user_id", table: "study_sessions", column: "user_id"); migrationBuilder.CreateIndex( name: "IX_tags_user_id", table: "tags", column: "user_id"); migrationBuilder.CreateIndex( name: "IX_user_profiles_email", table: "user_profiles", column: "email", unique: true); migrationBuilder.CreateIndex( name: "IX_user_profiles_username", table: "user_profiles", column: "username", unique: true); migrationBuilder.CreateIndex( name: "IX_user_settings_UserId", table: "user_settings", column: "UserId", unique: true); } /// protected override void Down(MigrationBuilder migrationBuilder) { migrationBuilder.DropTable( name: "daily_stats"); migrationBuilder.DropTable( name: "error_reports"); migrationBuilder.DropTable( name: "flashcard_tags"); migrationBuilder.DropTable( name: "SentenceAnalysisCache"); migrationBuilder.DropTable( name: "study_records"); migrationBuilder.DropTable( name: "user_settings"); migrationBuilder.DropTable( name: "tags"); migrationBuilder.DropTable( name: "flashcards"); migrationBuilder.DropTable( name: "study_sessions"); migrationBuilder.DropTable( name: "card_sets"); migrationBuilder.DropTable( name: "user_profiles"); } } }