dramaling-vocab-learning/backend/DramaLing.Api/Migrations/20251008170018_UpdatePronun...

1360 lines
52 KiB
C#

// <auto-generated />
using System;
using DramaLing.Api.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
#nullable disable
namespace DramaLing.Api.Migrations
{
[DbContext(typeof(DramaLingDbContext))]
[Migration("20251008170018_UpdatePronunciationAssessmentForAzureSpeech")]
partial class UpdatePronunciationAssessmentForAzureSpeech
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder.HasAnnotation("ProductVersion", "8.0.10");
modelBuilder.Entity("DramaLing.Api.Models.Entities.AudioCache", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<string>("Accent")
.IsRequired()
.HasMaxLength(2)
.HasColumnType("TEXT")
.HasColumnName("accent");
b.Property<int>("AccessCount")
.HasColumnType("INTEGER")
.HasColumnName("access_count");
b.Property<string>("AudioUrl")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("audio_url");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<int?>("DurationMs")
.HasColumnType("INTEGER")
.HasColumnName("duration_ms");
b.Property<int?>("FileSize")
.HasColumnType("INTEGER")
.HasColumnName("file_size");
b.Property<DateTime>("LastAccessed")
.HasColumnType("TEXT")
.HasColumnName("last_accessed");
b.Property<string>("TextContent")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("text_content");
b.Property<string>("TextHash")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("TEXT")
.HasColumnName("text_hash");
b.Property<string>("VoiceId")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("TEXT")
.HasColumnName("voice_id");
b.HasKey("Id");
b.HasIndex("LastAccessed")
.HasDatabaseName("IX_AudioCache_LastAccessed");
b.HasIndex("TextHash")
.IsUnique()
.HasDatabaseName("IX_AudioCache_TextHash");
b.ToTable("audio_cache", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.DailyStats", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<int>("AiApiCalls")
.HasColumnType("INTEGER")
.HasColumnName("ai_api_calls");
b.Property<int>("CardsGenerated")
.HasColumnType("INTEGER")
.HasColumnName("cards_generated");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<DateOnly>("Date")
.HasColumnType("TEXT")
.HasColumnName("date");
b.Property<int>("SessionCount")
.HasColumnType("INTEGER")
.HasColumnName("session_count");
b.Property<int>("StudyTimeSeconds")
.HasColumnType("INTEGER")
.HasColumnName("study_time_seconds");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.Property<int>("WordsCorrect")
.HasColumnType("INTEGER")
.HasColumnName("words_correct");
b.Property<int>("WordsStudied")
.HasColumnType("INTEGER")
.HasColumnName("words_studied");
b.HasKey("Id");
b.HasIndex("UserId", "Date")
.IsUnique();
b.ToTable("daily_stats", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.ErrorReport", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<string>("AdminNotes")
.HasColumnType("TEXT")
.HasColumnName("admin_notes");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<string>("Description")
.HasColumnType("TEXT")
.HasColumnName("description");
b.Property<Guid>("FlashcardId")
.HasColumnType("TEXT")
.HasColumnName("flashcard_id");
b.Property<string>("ReportType")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("TEXT")
.HasColumnName("report_type");
b.Property<DateTime?>("ResolvedAt")
.HasColumnType("TEXT")
.HasColumnName("resolved_at");
b.Property<Guid?>("ResolvedBy")
.HasColumnType("TEXT")
.HasColumnName("resolved_by");
b.Property<string>("Status")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("TEXT")
.HasColumnName("status");
b.Property<string>("StudyMode")
.HasMaxLength(50)
.HasColumnType("TEXT")
.HasColumnName("study_mode");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.HasKey("Id");
b.HasIndex("FlashcardId");
b.HasIndex("ResolvedBy");
b.HasIndex("UserId");
b.ToTable("error_reports", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.ExampleImage", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<int>("AccessCount")
.HasColumnType("INTEGER")
.HasColumnName("access_count");
b.Property<string>("AltText")
.HasMaxLength(200)
.HasColumnType("TEXT")
.HasColumnName("alt_text");
b.Property<string>("ContentHash")
.HasMaxLength(64)
.HasColumnType("TEXT")
.HasColumnName("content_hash");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<int?>("FileSize")
.HasColumnType("INTEGER")
.HasColumnName("file_size");
b.Property<decimal?>("GeminiCost")
.HasColumnType("TEXT")
.HasColumnName("gemini_cost");
b.Property<string>("GeminiDescription")
.HasColumnType("TEXT")
.HasColumnName("gemini_description");
b.Property<string>("GeminiPrompt")
.HasColumnType("TEXT")
.HasColumnName("gemini_prompt");
b.Property<int?>("ImageHeight")
.HasColumnType("INTEGER")
.HasColumnName("image_height");
b.Property<int?>("ImageWidth")
.HasColumnType("INTEGER")
.HasColumnName("image_width");
b.Property<string>("ModerationNotes")
.HasColumnType("TEXT")
.HasColumnName("moderation_notes");
b.Property<string>("ModerationStatus")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("TEXT")
.HasColumnName("moderation_status");
b.Property<decimal?>("QualityScore")
.HasColumnType("TEXT")
.HasColumnName("quality_score");
b.Property<string>("RelativePath")
.IsRequired()
.HasMaxLength(500)
.HasColumnType("TEXT")
.HasColumnName("relative_path");
b.Property<decimal?>("ReplicateCost")
.HasColumnType("TEXT")
.HasColumnName("replicate_cost");
b.Property<string>("ReplicateModel")
.HasMaxLength(100)
.HasColumnType("TEXT")
.HasColumnName("replicate_model");
b.Property<string>("ReplicatePrompt")
.HasColumnType("TEXT")
.HasColumnName("replicate_prompt");
b.Property<string>("ReplicateVersion")
.HasMaxLength(100)
.HasColumnType("TEXT")
.HasColumnName("replicate_version");
b.Property<decimal?>("TotalGenerationCost")
.HasColumnType("TEXT")
.HasColumnName("total_generation_cost");
b.Property<DateTime>("UpdatedAt")
.HasColumnType("TEXT")
.HasColumnName("updated_at");
b.HasKey("Id");
b.HasIndex("AccessCount");
b.HasIndex("ContentHash")
.IsUnique();
b.ToTable("example_images", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.Flashcard", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<string>("Definition")
.HasColumnType("TEXT")
.HasColumnName("definition");
b.Property<int>("DifficultyLevelNumeric")
.HasColumnType("INTEGER")
.HasColumnName("difficulty_level_numeric");
b.Property<string>("Example")
.HasColumnType("TEXT")
.HasColumnName("example");
b.Property<string>("ExampleTranslation")
.HasColumnType("TEXT")
.HasColumnName("example_translation");
b.Property<bool>("IsArchived")
.HasColumnType("INTEGER")
.HasColumnName("is_archived");
b.Property<bool>("IsFavorite")
.HasColumnType("INTEGER")
.HasColumnName("is_favorite");
b.Property<string>("PartOfSpeech")
.HasMaxLength(50)
.HasColumnType("TEXT")
.HasColumnName("part_of_speech");
b.Property<string>("Pronunciation")
.HasMaxLength(255)
.HasColumnType("TEXT")
.HasColumnName("pronunciation");
b.Property<string>("Synonyms")
.HasMaxLength(2000)
.HasColumnType("TEXT")
.HasColumnName("synonyms");
b.Property<string>("Translation")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("translation");
b.Property<DateTime>("UpdatedAt")
.HasColumnType("TEXT")
.HasColumnName("updated_at");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.Property<string>("Word")
.IsRequired()
.HasMaxLength(255)
.HasColumnType("TEXT")
.HasColumnName("word");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("flashcards", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.FlashcardExampleImage", b =>
{
b.Property<Guid>("FlashcardId")
.HasColumnType("TEXT")
.HasColumnName("flashcard_id");
b.Property<Guid>("ExampleImageId")
.HasColumnType("TEXT")
.HasColumnName("example_image_id");
b.Property<decimal?>("ContextRelevance")
.HasColumnType("TEXT")
.HasColumnName("context_relevance");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<int>("DisplayOrder")
.HasColumnType("INTEGER")
.HasColumnName("display_order");
b.Property<bool>("IsPrimary")
.HasColumnType("INTEGER")
.HasColumnName("is_primary");
b.HasKey("FlashcardId", "ExampleImageId");
b.HasIndex("ExampleImageId");
b.ToTable("flashcard_example_images", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.FlashcardReview", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<Guid>("FlashcardId")
.HasColumnType("TEXT")
.HasColumnName("flashcard_id");
b.Property<DateTime?>("LastReviewDate")
.HasColumnType("TEXT")
.HasColumnName("last_review_date");
b.Property<DateTime?>("LastSuccessDate")
.HasColumnType("TEXT")
.HasColumnName("last_success_date");
b.Property<DateTime>("NextReviewDate")
.HasColumnType("TEXT")
.HasColumnName("next_review_date");
b.Property<int>("SuccessCount")
.HasColumnType("INTEGER")
.HasColumnName("success_count");
b.Property<int>("TotalCorrectCount")
.HasColumnType("INTEGER")
.HasColumnName("total_correct_count");
b.Property<int>("TotalSkipCount")
.HasColumnType("INTEGER")
.HasColumnName("total_skip_count");
b.Property<int>("TotalWrongCount")
.HasColumnType("INTEGER")
.HasColumnName("total_wrong_count");
b.Property<DateTime>("UpdatedAt")
.HasColumnType("TEXT")
.HasColumnName("updated_at");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.HasKey("Id");
b.HasIndex("NextReviewDate")
.HasDatabaseName("IX_FlashcardReviews_NextReviewDate");
b.HasIndex("FlashcardId", "UserId")
.IsUnique();
b.HasIndex("UserId", "NextReviewDate")
.HasDatabaseName("IX_FlashcardReviews_UserId_NextReviewDate");
b.ToTable("flashcard_reviews", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.FlashcardTag", b =>
{
b.Property<Guid>("FlashcardId")
.HasColumnType("TEXT")
.HasColumnName("flashcard_id");
b.Property<Guid>("TagId")
.HasColumnType("TEXT")
.HasColumnName("tag_id");
b.HasKey("FlashcardId", "TagId");
b.HasIndex("TagId");
b.ToTable("flashcard_tags", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.ImageGenerationRequest", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<DateTime?>("CompletedAt")
.HasColumnType("TEXT")
.HasColumnName("completed_at");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<string>("FinalReplicatePrompt")
.HasColumnType("TEXT")
.HasColumnName("final_replicate_prompt");
b.Property<Guid>("FlashcardId")
.HasColumnType("TEXT")
.HasColumnName("flashcard_id");
b.Property<DateTime?>("GeminiCompletedAt")
.HasColumnType("TEXT")
.HasColumnName("gemini_completed_at");
b.Property<decimal?>("GeminiCost")
.HasColumnType("TEXT")
.HasColumnName("gemini_cost");
b.Property<string>("GeminiErrorMessage")
.HasColumnType("TEXT")
.HasColumnName("gemini_error_message");
b.Property<int?>("GeminiProcessingTimeMs")
.HasColumnType("INTEGER")
.HasColumnName("gemini_processing_time_ms");
b.Property<string>("GeminiPrompt")
.HasColumnType("TEXT")
.HasColumnName("gemini_prompt");
b.Property<DateTime?>("GeminiStartedAt")
.HasColumnType("TEXT")
.HasColumnName("gemini_started_at");
b.Property<string>("GeminiStatus")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("TEXT")
.HasColumnName("gemini_status");
b.Property<string>("GeneratedDescription")
.HasColumnType("TEXT")
.HasColumnName("generated_description");
b.Property<Guid?>("GeneratedImageId")
.HasColumnType("TEXT")
.HasColumnName("generated_image_id");
b.Property<string>("OriginalRequest")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("original_request");
b.Property<string>("OverallStatus")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("TEXT")
.HasColumnName("overall_status");
b.Property<DateTime?>("ReplicateCompletedAt")
.HasColumnType("TEXT")
.HasColumnName("replicate_completed_at");
b.Property<decimal?>("ReplicateCost")
.HasColumnType("TEXT")
.HasColumnName("replicate_cost");
b.Property<string>("ReplicateErrorMessage")
.HasColumnType("TEXT")
.HasColumnName("replicate_error_message");
b.Property<int?>("ReplicateProcessingTimeMs")
.HasColumnType("INTEGER")
.HasColumnName("replicate_processing_time_ms");
b.Property<DateTime?>("ReplicateStartedAt")
.HasColumnType("TEXT")
.HasColumnName("replicate_started_at");
b.Property<string>("ReplicateStatus")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("TEXT")
.HasColumnName("replicate_status");
b.Property<decimal?>("TotalCost")
.HasColumnType("TEXT")
.HasColumnName("total_cost");
b.Property<int?>("TotalProcessingTimeMs")
.HasColumnType("INTEGER")
.HasColumnName("total_processing_time_ms");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.HasKey("Id");
b.HasIndex("FlashcardId");
b.HasIndex("GeneratedImageId");
b.HasIndex("UserId");
b.ToTable("image_generation_requests", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.OptionsVocabulary", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<string>("CEFRLevel")
.IsRequired()
.HasMaxLength(2)
.HasColumnType("TEXT")
.HasColumnName("cefr_level");
b.Property<DateTime>("CreatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("created_at")
.HasDefaultValueSql("CURRENT_TIMESTAMP");
b.Property<bool>("IsActive")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasDefaultValue(true)
.HasColumnName("is_active");
b.Property<string>("PartOfSpeech")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("TEXT")
.HasColumnName("part_of_speech");
b.Property<DateTime>("UpdatedAt")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("updated_at")
.HasDefaultValueSql("CURRENT_TIMESTAMP");
b.Property<string>("Word")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("TEXT")
.HasColumnName("word");
b.Property<int>("WordLength")
.HasColumnType("INTEGER")
.HasColumnName("word_length");
b.HasKey("Id");
b.HasIndex(new[] { "IsActive" }, "IX_OptionsVocabulary_Active");
b.HasIndex(new[] { "CEFRLevel" }, "IX_OptionsVocabulary_CEFR");
b.HasIndex(new[] { "CEFRLevel", "PartOfSpeech", "WordLength" }, "IX_OptionsVocabulary_Core_Matching");
b.HasIndex(new[] { "PartOfSpeech" }, "IX_OptionsVocabulary_PartOfSpeech");
b.HasIndex(new[] { "Word" }, "IX_OptionsVocabulary_Word")
.IsUnique();
b.HasIndex(new[] { "WordLength" }, "IX_OptionsVocabulary_WordLength");
b.ToTable("options_vocabularies", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.PronunciationAssessment", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<decimal>("AccuracyScore")
.HasColumnType("TEXT")
.HasColumnName("accuracy_score");
b.Property<decimal>("AudioDuration")
.HasColumnType("TEXT")
.HasColumnName("audio_duration");
b.Property<string>("AzureRequestId")
.HasColumnType("TEXT")
.HasColumnName("azure_request_id");
b.Property<decimal>("CompletenessScore")
.HasColumnType("TEXT")
.HasColumnName("completeness_score");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<string>("Feedback")
.HasColumnType("TEXT")
.HasColumnName("feedback");
b.Property<Guid?>("FlashcardId")
.HasColumnType("TEXT")
.HasColumnName("flashcard_id");
b.Property<decimal>("FluencyScore")
.HasColumnType("TEXT")
.HasColumnName("fluency_score");
b.Property<decimal>("OverallScore")
.HasColumnType("TEXT")
.HasColumnName("overall_score");
b.Property<string>("PracticeMode")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("TEXT")
.HasColumnName("practice_mode");
b.Property<decimal>("ProcessingTime")
.HasColumnType("TEXT")
.HasColumnName("processing_time");
b.Property<decimal>("ProsodyScore")
.HasColumnType("TEXT")
.HasColumnName("prosody_score");
b.Property<string>("ReferenceText")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("reference_text");
b.Property<string>("TranscribedText")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("transcribed_text");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.Property<string>("WordLevelResults")
.HasColumnType("TEXT")
.HasColumnName("word_level_results");
b.HasKey("Id");
b.HasIndex("FlashcardId");
b.HasIndex("UserId", "FlashcardId")
.HasDatabaseName("IX_PronunciationAssessment_UserFlashcard");
b.ToTable("pronunciation_assessments", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.SentenceAnalysisCache", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<int>("AccessCount")
.HasColumnType("INTEGER")
.HasColumnName("access_count");
b.Property<string>("AnalysisResult")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("analysis_result");
b.Property<string>("CorrectedText")
.HasMaxLength(1000)
.HasColumnType("TEXT")
.HasColumnName("corrected_text");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<DateTime>("ExpiresAt")
.HasColumnType("TEXT")
.HasColumnName("expires_at");
b.Property<string>("GrammarCorrections")
.HasColumnType("TEXT")
.HasColumnName("grammar_corrections");
b.Property<bool>("HasGrammarErrors")
.HasColumnType("INTEGER")
.HasColumnName("has_grammar_errors");
b.Property<string>("HighValueWords")
.HasColumnType("TEXT")
.HasColumnName("high_value_words");
b.Property<string>("IdiomsDetected")
.HasColumnType("TEXT")
.HasColumnName("idioms_detected");
b.Property<string>("InputText")
.IsRequired()
.HasMaxLength(1000)
.HasColumnType("TEXT")
.HasColumnName("input_text");
b.Property<string>("InputTextHash")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("TEXT")
.HasColumnName("input_text_hash");
b.Property<DateTime?>("LastAccessedAt")
.HasColumnType("TEXT")
.HasColumnName("last_accessed_at");
b.HasKey("Id");
b.HasIndex("ExpiresAt")
.HasDatabaseName("IX_SentenceAnalysisCache_Expires");
b.HasIndex("InputTextHash")
.HasDatabaseName("IX_SentenceAnalysisCache_Hash");
b.HasIndex("InputTextHash", "ExpiresAt")
.HasDatabaseName("IX_SentenceAnalysisCache_Hash_Expires");
b.ToTable("sentence_analysis_cache", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.Tag", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<string>("Color")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("TEXT")
.HasColumnName("color");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(100)
.HasColumnType("TEXT")
.HasColumnName("name");
b.Property<int>("UsageCount")
.HasColumnType("INTEGER")
.HasColumnName("usage_count");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.HasKey("Id");
b.HasIndex("UserId");
b.ToTable("tags", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.User", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<string>("AvatarUrl")
.HasColumnType("TEXT")
.HasColumnName("avatar_url");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<string>("DisplayName")
.HasMaxLength(100)
.HasColumnType("TEXT")
.HasColumnName("display_name");
b.Property<string>("Email")
.IsRequired()
.HasMaxLength(255)
.HasColumnType("TEXT")
.HasColumnName("email");
b.Property<string>("EnglishLevel")
.IsRequired()
.HasMaxLength(10)
.HasColumnType("TEXT")
.HasColumnName("english_level");
b.Property<int>("EnglishLevelNumeric")
.ValueGeneratedOnAdd()
.HasColumnType("INTEGER")
.HasDefaultValue(2)
.HasColumnName("english_level_numeric");
b.Property<bool>("IsLevelVerified")
.HasColumnType("INTEGER")
.HasColumnName("is_level_verified");
b.Property<string>("LevelNotes")
.HasMaxLength(500)
.HasColumnType("TEXT")
.HasColumnName("level_notes");
b.Property<DateTime>("LevelUpdatedAt")
.HasColumnType("TEXT")
.HasColumnName("level_updated_at");
b.Property<string>("PasswordHash")
.IsRequired()
.HasMaxLength(255)
.HasColumnType("TEXT")
.HasColumnName("password_hash");
b.Property<string>("Preferences")
.IsRequired()
.HasColumnType("TEXT")
.HasColumnName("preferences");
b.Property<string>("SubscriptionType")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("TEXT")
.HasColumnName("subscription_type");
b.Property<DateTime>("UpdatedAt")
.HasColumnType("TEXT")
.HasColumnName("updated_at");
b.Property<string>("Username")
.IsRequired()
.HasMaxLength(50)
.HasColumnType("TEXT")
.HasColumnName("username");
b.HasKey("Id");
b.HasIndex("Email")
.IsUnique();
b.HasIndex("Username")
.IsUnique();
b.ToTable("user_profiles", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.UserAudioPreferences", b =>
{
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.Property<bool>("AutoPlayEnabled")
.HasColumnType("INTEGER")
.HasColumnName("auto_play_enabled");
b.Property<decimal>("DefaultSpeed")
.HasColumnType("TEXT")
.HasColumnName("default_speed");
b.Property<bool>("EnableDetailedFeedback")
.HasColumnType("INTEGER")
.HasColumnName("enable_detailed_feedback");
b.Property<string>("PreferredAccent")
.IsRequired()
.HasMaxLength(2)
.HasColumnType("TEXT")
.HasColumnName("preferred_accent");
b.Property<string>("PreferredVoiceFemale")
.HasMaxLength(50)
.HasColumnType("TEXT")
.HasColumnName("preferred_voice_female");
b.Property<string>("PreferredVoiceMale")
.HasMaxLength(50)
.HasColumnType("TEXT")
.HasColumnName("preferred_voice_male");
b.Property<string>("PronunciationDifficulty")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("TEXT")
.HasColumnName("pronunciation_difficulty");
b.Property<int>("TargetScoreThreshold")
.HasColumnType("INTEGER")
.HasColumnName("target_score_threshold");
b.Property<DateTime>("UpdatedAt")
.HasColumnType("TEXT")
.HasColumnName("updated_at");
b.HasKey("UserId");
b.ToTable("user_audio_preferences", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.UserSettings", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<bool>("AutoPlayAudio")
.HasColumnType("INTEGER")
.HasColumnName("auto_play_audio");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<int>("DailyGoal")
.HasColumnType("INTEGER")
.HasColumnName("daily_goal");
b.Property<string>("DifficultyPreference")
.IsRequired()
.HasMaxLength(20)
.HasColumnType("TEXT")
.HasColumnName("difficulty_preference");
b.Property<bool>("ReminderEnabled")
.HasColumnType("INTEGER")
.HasColumnName("reminder_enabled");
b.Property<TimeOnly>("ReminderTime")
.HasColumnType("TEXT")
.HasColumnName("reminder_time");
b.Property<bool>("ShowPronunciation")
.HasColumnType("INTEGER")
.HasColumnName("show_pronunciation");
b.Property<DateTime>("UpdatedAt")
.HasColumnType("TEXT")
.HasColumnName("updated_at");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.HasKey("Id");
b.HasIndex("UserId")
.IsUnique();
b.ToTable("user_settings", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.WordQueryUsageStats", b =>
{
b.Property<Guid>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("TEXT")
.HasColumnName("id");
b.Property<DateTime>("CreatedAt")
.HasColumnType("TEXT")
.HasColumnName("created_at");
b.Property<DateOnly>("Date")
.HasColumnType("TEXT")
.HasColumnName("date");
b.Property<int>("HighValueWordClicks")
.HasColumnType("INTEGER")
.HasColumnName("high_value_word_clicks");
b.Property<int>("LowValueWordClicks")
.HasColumnType("INTEGER")
.HasColumnName("low_value_word_clicks");
b.Property<int>("SentenceAnalysisCount")
.HasColumnType("INTEGER")
.HasColumnName("sentence_analysis_count");
b.Property<int>("TotalApiCalls")
.HasColumnType("INTEGER")
.HasColumnName("total_api_calls");
b.Property<int>("UniqueWordsQueried")
.HasColumnType("INTEGER")
.HasColumnName("unique_words_queried");
b.Property<DateTime>("UpdatedAt")
.HasColumnType("TEXT")
.HasColumnName("updated_at");
b.Property<Guid>("UserId")
.HasColumnType("TEXT")
.HasColumnName("user_id");
b.HasKey("Id");
b.HasIndex("CreatedAt")
.HasDatabaseName("IX_WordQueryUsageStats_CreatedAt");
b.HasIndex("UserId", "Date")
.IsUnique()
.HasDatabaseName("IX_WordQueryUsageStats_UserDate");
b.ToTable("word_query_usage_stats", (string)null);
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.DailyStats", b =>
{
b.HasOne("DramaLing.Api.Models.Entities.User", "User")
.WithMany("DailyStats")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.ErrorReport", b =>
{
b.HasOne("DramaLing.Api.Models.Entities.Flashcard", "Flashcard")
.WithMany("ErrorReports")
.HasForeignKey("FlashcardId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DramaLing.Api.Models.Entities.User", "ResolvedByUser")
.WithMany()
.HasForeignKey("ResolvedBy")
.OnDelete(DeleteBehavior.SetNull);
b.HasOne("DramaLing.Api.Models.Entities.User", "User")
.WithMany("ErrorReports")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Flashcard");
b.Navigation("ResolvedByUser");
b.Navigation("User");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.Flashcard", b =>
{
b.HasOne("DramaLing.Api.Models.Entities.User", "User")
.WithMany("Flashcards")
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.FlashcardExampleImage", b =>
{
b.HasOne("DramaLing.Api.Models.Entities.ExampleImage", "ExampleImage")
.WithMany("FlashcardExampleImages")
.HasForeignKey("ExampleImageId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DramaLing.Api.Models.Entities.Flashcard", "Flashcard")
.WithMany("FlashcardExampleImages")
.HasForeignKey("FlashcardId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("ExampleImage");
b.Navigation("Flashcard");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.FlashcardReview", b =>
{
b.HasOne("DramaLing.Api.Models.Entities.Flashcard", "Flashcard")
.WithMany()
.HasForeignKey("FlashcardId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DramaLing.Api.Models.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Flashcard");
b.Navigation("User");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.FlashcardTag", b =>
{
b.HasOne("DramaLing.Api.Models.Entities.Flashcard", "Flashcard")
.WithMany("FlashcardTags")
.HasForeignKey("FlashcardId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DramaLing.Api.Models.Entities.Tag", "Tag")
.WithMany("FlashcardTags")
.HasForeignKey("TagId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Flashcard");
b.Navigation("Tag");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.ImageGenerationRequest", b =>
{
b.HasOne("DramaLing.Api.Models.Entities.Flashcard", "Flashcard")
.WithMany()
.HasForeignKey("FlashcardId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("DramaLing.Api.Models.Entities.ExampleImage", "GeneratedImage")
.WithMany()
.HasForeignKey("GeneratedImageId")
.OnDelete(DeleteBehavior.SetNull);
b.HasOne("DramaLing.Api.Models.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Flashcard");
b.Navigation("GeneratedImage");
b.Navigation("User");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.PronunciationAssessment", b =>
{
b.HasOne("DramaLing.Api.Models.Entities.Flashcard", "Flashcard")
.WithMany()
.HasForeignKey("FlashcardId")
.OnDelete(DeleteBehavior.SetNull);
b.HasOne("DramaLing.Api.Models.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Flashcard");
b.Navigation("User");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.Tag", b =>
{
b.HasOne("DramaLing.Api.Models.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.UserAudioPreferences", b =>
{
b.HasOne("DramaLing.Api.Models.Entities.User", "User")
.WithOne()
.HasForeignKey("DramaLing.Api.Models.Entities.UserAudioPreferences", "UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.UserSettings", b =>
{
b.HasOne("DramaLing.Api.Models.Entities.User", "User")
.WithOne("Settings")
.HasForeignKey("DramaLing.Api.Models.Entities.UserSettings", "UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.WordQueryUsageStats", b =>
{
b.HasOne("DramaLing.Api.Models.Entities.User", "User")
.WithMany()
.HasForeignKey("UserId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("User");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.ExampleImage", b =>
{
b.Navigation("FlashcardExampleImages");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.Flashcard", b =>
{
b.Navigation("ErrorReports");
b.Navigation("FlashcardExampleImages");
b.Navigation("FlashcardTags");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.Tag", b =>
{
b.Navigation("FlashcardTags");
});
modelBuilder.Entity("DramaLing.Api.Models.Entities.User", b =>
{
b.Navigation("DailyStats");
b.Navigation("ErrorReports");
b.Navigation("Flashcards");
b.Navigation("Settings");
});
#pragma warning restore 612, 618
}
}
}