using FlatRender.ContentSvc.Domain.Entities; using FlatRender.ContentSvc.Domain.Enums; using Microsoft.EntityFrameworkCore; namespace FlatRender.ContentSvc.Infrastructure.Data; public class ContentDbContext(DbContextOptions options) : DbContext(options) { // Taxonomy public DbSet Categories => Set(); public DbSet Tags => Set(); public DbSet Fonts => Set(); public DbSet MusicTracks => Set(); public DbSet ProjectServers => Set(); public DbSet AdminFiles => Set(); // Templates public DbSet ProjectContainers => Set(); public DbSet ContainerCategories => Set(); public DbSet ContainerTags => Set(); public DbSet Projects => Set(); public DbSet ProjectAssets => Set(); // Scenes public DbSet Scenes => Set(); public DbSet SceneCategories => Set(); public DbSet RepeaterItems => Set(); public DbSet SceneContentElements => Set(); public DbSet SceneColorElements => Set(); public DbSet SceneColorPresets => Set(); public DbSet SceneColorPresetItems => Set(); public DbSet SharedColors => Set(); public DbSet SharedColorPresets => Set(); public DbSet SharedColorPresetItems => Set(); public DbSet SharedLayers => Set(); public DbSet TemplateSvgPreviews => Set(); // Characters public DbSet SceneCharacters => Set(); public DbSet SceneCharacterControllers => Set(); public DbSet SceneControllerOptions => Set(); public DbSet ProjectCharacterControllers => Set(); public DbSet ProjectCharacterControllerOptions => Set(); public DbSet ProjectCharacterPresets => Set(); public DbSet PresetCharacterControllers => Set(); public DbSet PresetStories => Set(); public DbSet PresetScenes => Set(); // CMS public DbSet Blogs => Set(); public DbSet Comments => Set(); public DbSet HomePageEvents => Set(); public DbSet NewSlides => Set(); public DbSet InternalRoutes => Set(); public DbSet CustomRoutes => Set(); public DbSet WebsiteSettings => Set(); public DbSet LearnArticles => Set(); public DbSet Trainings => Set(); public DbSet FavoriteFolders => Set(); public DbSet FavoriteContainers => Set(); // AI public DbSet AiSettings => Set(); protected override void OnModelCreating(ModelBuilder mb) { mb.HasDefaultSchema("content"); // Native PostgreSQL enums are registered on the EF provider via npgsql.MapEnum() // in Program.cs (EF Core 9+ approach), covering both model + runtime ADO mapping. ConfigureTaxonomy(mb); ConfigureTemplates(mb); ConfigureScenes(mb); ConfigureCharacters(mb); ConfigureCms(mb); // AI settings — snake_case convention maps columns (tenant_id, api_key, …). mb.Entity(e => { e.ToTable("ai_settings"); e.HasKey(x => x.TenantId); }); } private static void ConfigureTaxonomy(ModelBuilder mb) { mb.Entity(e => { e.ToTable("categories"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ParentId).HasColumnName("parent_id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Slug).HasColumnName("slug").HasColumnType("citext").IsRequired(); e.Property(x => x.Description).HasColumnName("description"); e.Property(x => x.ImageUrl).HasColumnName("image_url"); e.Property(x => x.Icon).HasColumnName("icon"); e.Property(x => x.MetaTitle).HasColumnName("meta_title"); e.Property(x => x.MetaDescription).HasColumnName("meta_description"); e.Property(x => x.MetaKeywords).HasColumnName("meta_keywords"); e.Property(x => x.BotFollow).HasColumnName("bot_follow"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.IsActive).HasColumnName("is_active"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.Property(x => x.DeletedAt).HasColumnName("deleted_at"); e.HasOne(x => x.Parent).WithMany(x => x.Children).HasForeignKey(x => x.ParentId).OnDelete(DeleteBehavior.Restrict); e.HasQueryFilter(x => x.DeletedAt == null); }); mb.Entity(e => { e.ToTable("tags"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.LatinName).HasColumnName("latin_name"); e.Property(x => x.Slug).HasColumnName("slug").HasColumnType("citext").IsRequired(); e.Property(x => x.AppliesToMode).HasColumnName("applies_to_mode"); e.Property(x => x.IsActive).HasColumnName("is_active"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.Property(x => x.DeletedAt).HasColumnName("deleted_at"); e.HasQueryFilter(x => x.DeletedAt == null); }); mb.Entity(e => { e.ToTable("fonts"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.OriginalName).HasColumnName("original_name"); e.Property(x => x.SystemName).HasColumnName("system_name"); e.Property(x => x.Family).HasColumnName("family"); e.Property(x => x.Weight).HasColumnName("weight"); e.Property(x => x.Style).HasColumnName("style"); e.Property(x => x.Direction).HasColumnName("direction"); e.Property(x => x.FileUrl).HasColumnName("file_url"); e.Property(x => x.SampleImageUrl).HasColumnName("sample_image_url"); e.Property(x => x.IsPremium).HasColumnName("is_premium"); e.Property(x => x.IsActive).HasColumnName("is_active"); e.Property(x => x.InstalledOnNodes).HasColumnName("installed_on_nodes"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.Property(x => x.DeletedAt).HasColumnName("deleted_at"); e.HasQueryFilter(x => x.DeletedAt == null); }); mb.Entity(e => { e.ToTable("music_tracks"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Caption).HasColumnName("caption"); e.Property(x => x.Keywords).HasColumnName("keywords"); e.Property(x => x.Url).HasColumnName("url").IsRequired(); e.Property(x => x.WaveformData).HasColumnName("waveform_data").HasColumnType("jsonb"); e.Property(x => x.DurationSec).HasColumnName("duration_sec"); e.Property(x => x.Bpm).HasColumnName("bpm"); e.Property(x => x.Genre).HasColumnName("genre"); e.Property(x => x.Mood).HasColumnName("mood"); e.Property(x => x.IsPremium).HasColumnName("is_premium"); e.Property(x => x.IsActive).HasColumnName("is_active"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.Property(x => x.DeletedAt).HasColumnName("deleted_at"); e.HasQueryFilter(x => x.DeletedAt == null); }); mb.Entity(e => { e.ToTable("project_servers"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Region).HasColumnName("region").IsRequired(); e.Property(x => x.Ip).HasColumnName("ip"); e.Property(x => x.PhysicalPathOutput).HasColumnName("physical_path_output"); e.Property(x => x.DefaultProjectAddress).HasColumnName("default_project_address"); e.Property(x => x.RenderOutputLocation).HasColumnName("render_output_location"); e.Property(x => x.PreNeedFolderAddress).HasColumnName("pre_need_folder_address"); e.Property(x => x.MinioEndpoint).HasColumnName("minio_endpoint"); e.Property(x => x.MinioBucketTemplates).HasColumnName("minio_bucket_templates"); e.Property(x => x.MinioBucketOutputs).HasColumnName("minio_bucket_outputs"); e.Property(x => x.IsActive).HasColumnName("is_active"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); }); mb.Entity(e => { e.ToTable("admin_files"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.Name).HasColumnName("name"); e.Property(x => x.Url).HasColumnName("url").IsRequired(); e.Property(x => x.ThumbnailUrl).HasColumnName("thumbnail_url"); e.Property(x => x.FileType).HasColumnName("file_type"); e.Property(x => x.SizeBytes).HasColumnName("size_bytes"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); }); mb.Entity(e => { e.ToTable("project_assets"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ProjectId).HasColumnName("project_id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Kind).HasColumnName("kind").IsRequired(); e.Property(x => x.Url).HasColumnName("url").IsRequired(); e.Property(x => x.MinioKey).HasColumnName("minio_key"); e.Property(x => x.SizeBytes).HasColumnName("size_bytes"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); }); } private static void ConfigureTemplates(ModelBuilder mb) { mb.Entity(e => { e.ToTable("project_containers"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.TenantId).HasColumnName("tenant_id"); e.Property(x => x.Slug).HasColumnName("slug").HasColumnType("citext").IsRequired(); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Description).HasColumnName("description"); e.Property(x => x.Keywords).HasColumnName("keywords"); e.Property(x => x.NewsText).HasColumnName("news_text"); e.Property(x => x.Image).HasColumnName("image"); e.Property(x => x.Demo).HasColumnName("demo"); e.Property(x => x.FullDemo).HasColumnName("full_demo"); e.Property(x => x.MiniDemo).HasColumnName("mini_demo"); e.Property(x => x.DemoScriptTag).HasColumnName("demo_script_tag"); e.Property(x => x.IsPublished).HasColumnName("is_published"); e.Property(x => x.IsPremium).HasColumnName("is_premium"); e.Property(x => x.IsMockup).HasColumnName("is_mockup"); e.Property(x => x.PrimaryMode).HasColumnName("primary_mode"); e.Property(x => x.RateAvg).HasColumnName("rate_avg"); e.Property(x => x.RateCount).HasColumnName("rate_count"); e.Property(x => x.ViewCount).HasColumnName("view_count"); e.Property(x => x.UseCount).HasColumnName("use_count"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.SortDate).HasColumnName("sort_date"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.Property(x => x.DeletedAt).HasColumnName("deleted_at"); e.HasQueryFilter(x => x.DeletedAt == null); }); mb.Entity(e => { e.ToTable("container_categories"); e.HasKey(x => new { x.ContainerId, x.CategoryId }); e.Property(x => x.ContainerId).HasColumnName("container_id"); e.Property(x => x.CategoryId).HasColumnName("category_id"); e.Property(x => x.Sort).HasColumnName("sort"); e.HasOne(x => x.Container).WithMany(x => x.ContainerCategories).HasForeignKey(x => x.ContainerId).OnDelete(DeleteBehavior.Cascade); e.HasOne(x => x.Category).WithMany().HasForeignKey(x => x.CategoryId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("container_tags"); e.HasKey(x => new { x.ContainerId, x.TagId }); e.Property(x => x.ContainerId).HasColumnName("container_id"); e.Property(x => x.TagId).HasColumnName("tag_id"); e.HasOne(x => x.Container).WithMany(x => x.ContainerTags).HasForeignKey(x => x.ContainerId).OnDelete(DeleteBehavior.Cascade); e.HasOne(x => x.Tag).WithMany().HasForeignKey(x => x.TagId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("projects"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ContainerId).HasColumnName("container_id"); e.Property(x => x.ProjectServerId).HasColumnName("project_server_id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Description).HasColumnName("description"); e.Property(x => x.Image).HasColumnName("image"); e.Property(x => x.FullDemo).HasColumnName("full_demo"); e.Property(x => x.DemoScriptTag).HasColumnName("demo_script_tag"); e.Property(x => x.DownloadLink).HasColumnName("download_link"); e.Property(x => x.AepMinioBucket).HasColumnName("aep_minio_bucket"); e.Property(x => x.AepMinioKey).HasColumnName("aep_minio_key"); e.Property(x => x.AepFileUrl).HasColumnName("aep_file_url"); e.Property(x => x.AepFileMd5).HasColumnName("aep_file_md5"); e.Property(x => x.AepFileSizeBytes).HasColumnName("aep_file_size_bytes"); e.Property(x => x.AepUploadedAt).HasColumnName("aep_uploaded_at"); e.Property(x => x.Folder).HasColumnName("folder"); e.Property(x => x.OriginalWidth).HasColumnName("original_width"); e.Property(x => x.OriginalHeight).HasColumnName("original_height"); e.Property(x => x.Aspect).HasColumnName("aspect"); e.Property(x => x.ProjectDurationSec).HasColumnName("project_duration_sec"); e.Property(x => x.MinDurationSec).HasColumnName("min_duration_sec"); e.Property(x => x.MaxDurationSec).HasColumnName("max_duration_sec"); e.Property(x => x.FreeFps).HasColumnName("free_fps"); e.Property(x => x.ChooseMode).HasColumnName("choose_mode"); e.Property(x => x.Resolution).HasColumnName("resolution"); e.Property(x => x.VipFactor).HasColumnName("vip_factor"); e.Property(x => x.RenderAepComp).HasColumnName("render_aep_comp"); e.Property(x => x.RenderEngine).HasColumnName("render_engine"); e.Property(x => x.RenderRemotionComp).HasColumnName("render_remotion_comp"); e.Property(x => x.SharedLayerImage).HasColumnName("shared_layer_image"); e.Property(x => x.SharedColorsSvg).HasColumnName("shared_colors_svg"); e.Property(x => x.SharedColorPresetsSvg).HasColumnName("shared_color_presets_svg"); e.Property(x => x.IsPublished).HasColumnName("is_published"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.Property(x => x.DeletedAt).HasColumnName("deleted_at"); e.HasOne(x => x.Container).WithMany(x => x.Projects).HasForeignKey(x => x.ContainerId).OnDelete(DeleteBehavior.Cascade); e.HasQueryFilter(x => x.DeletedAt == null); }); } private static void ConfigureScenes(ModelBuilder mb) { mb.Entity(e => { e.ToTable("scenes"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ProjectId).HasColumnName("project_id"); e.Property(x => x.Key).HasColumnName("key").IsRequired(); e.Property(x => x.Title).HasColumnName("title").IsRequired(); e.Property(x => x.LocalizedTitle).HasColumnName("localized_title").HasColumnType("jsonb"); e.Property(x => x.SceneType).HasColumnName("scene_type"); e.Property(x => x.Image).HasColumnName("image"); e.Property(x => x.Demo).HasColumnName("demo"); e.Property(x => x.SceneColorSvg).HasColumnName("scene_color_svg"); e.Property(x => x.SnapshotUrl).HasColumnName("snapshot_url"); e.Property(x => x.GenerateKf).HasColumnName("generate_kf"); e.Property(x => x.DefaultDurationSec).HasColumnName("default_duration_sec"); e.Property(x => x.MinDurationSec).HasColumnName("min_duration_sec"); e.Property(x => x.MaxDurationSec).HasColumnName("max_duration_sec"); e.Property(x => x.OverlapAtEndSec).HasColumnName("overlap_at_end_sec"); e.Property(x => x.CanHandleDuration).HasColumnName("can_handle_duration"); e.Property(x => x.ManualColorSelection).HasColumnName("manual_color_selection"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.IsActive).HasColumnName("is_active"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.Property(x => x.DeletedAt).HasColumnName("deleted_at"); e.HasOne(x => x.Project).WithMany(x => x.Scenes).HasForeignKey(x => x.ProjectId).OnDelete(DeleteBehavior.Cascade); e.HasQueryFilter(x => x.DeletedAt == null); }); mb.Entity(e => { e.ToTable("scene_categories"); e.HasKey(x => new { x.SceneId, x.CategoryId }); e.Property(x => x.SceneId).HasColumnName("scene_id"); e.Property(x => x.CategoryId).HasColumnName("category_id"); e.HasOne(x => x.Scene).WithMany(x => x.SceneCategories).HasForeignKey(x => x.SceneId).OnDelete(DeleteBehavior.Cascade); e.HasOne(x => x.Category).WithMany().HasForeignKey(x => x.CategoryId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("repeater_items"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.SceneId).HasColumnName("scene_id"); e.Property(x => x.Title).HasColumnName("title").IsRequired(); e.Property(x => x.RepeatBoxKey).HasColumnName("repeat_box_key").IsRequired(); e.Property(x => x.RepeatItemKey).HasColumnName("repeat_item_key").IsRequired(); e.Property(x => x.MaxRepeatCount).HasColumnName("max_repeat_count"); e.Property(x => x.UserCanChangeSort).HasColumnName("user_can_change_sort"); e.Property(x => x.RepeatSortStrategy).HasColumnName("repeat_sort_strategy"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.HasOne(x => x.Scene).WithMany(x => x.RepeaterItems).HasForeignKey(x => x.SceneId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("scene_content_elements"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.SceneId).HasColumnName("scene_id"); e.Property(x => x.RepeaterItemId).HasColumnName("repeater_item_id"); e.Property(x => x.Key).HasColumnName("key").IsRequired(); e.Property(x => x.Title).HasColumnName("title").IsRequired(); e.Property(x => x.LocalizedTitle).HasColumnName("localized_title").HasColumnType("jsonb"); e.Property(x => x.Hint).HasColumnName("hint"); e.Property(x => x.Type).HasColumnName("type"); e.Property(x => x.DefaultValue).HasColumnName("default_value"); e.Property(x => x.FontId).HasColumnName("font_id"); e.Property(x => x.FontFace).HasColumnName("font_face"); e.Property(x => x.FontFaceName).HasColumnName("font_face_name"); e.Property(x => x.FontSize).HasColumnName("font_size"); e.Property(x => x.DefaultFontSize).HasColumnName("default_font_size"); e.Property(x => x.DefaultFontFace).HasColumnName("default_font_face"); e.Property(x => x.IsFontChangeable).HasColumnName("is_font_changeable"); e.Property(x => x.IsFontSizeChangeable).HasColumnName("is_font_size_changeable"); e.Property(x => x.Justify).HasColumnName("justify"); e.Property(x => x.CanJustify).HasColumnName("can_justify"); e.Property(x => x.PositionInContainer).HasColumnName("position_in_container"); e.Property(x => x.IsTextBox).HasColumnName("is_text_box"); e.Property(x => x.MaxSize).HasColumnName("max_size"); e.Property(x => x.DirectionLayerKey).HasColumnName("direction_layer_key"); e.Property(x => x.DirectionLayerValue).HasColumnName("direction_layer_value"); e.Property(x => x.VideoSupport).HasColumnName("video_support"); e.Property(x => x.MinDurationSec).HasColumnName("min_duration_sec"); e.Property(x => x.MaxDurationSec).HasColumnName("max_duration_sec"); e.Property(x => x.Width).HasColumnName("width"); e.Property(x => x.Height).HasColumnName("height"); e.Property(x => x.Thumbnail).HasColumnName("thumbnail"); e.Property(x => x.MappedList).HasColumnName("mapped_list").HasColumnType("jsonb"); e.Property(x => x.CounterMode).HasColumnName("counter_mode"); e.Property(x => x.AiInputType).HasColumnName("ai_input_type"); e.Property(x => x.IsHidden).HasColumnName("is_hidden"); e.Property(x => x.IsFocused).HasColumnName("is_focused"); e.Property(x => x.OpacityControllerKey).HasColumnName("opacity_controller_key"); e.Property(x => x.Dp1Image).HasColumnName("dp1_image"); e.Property(x => x.Dp1Title).HasColumnName("dp1_title"); e.Property(x => x.Dp2Image).HasColumnName("dp2_image"); e.Property(x => x.Dp2Title).HasColumnName("dp2_title"); e.Property(x => x.Dp3Image).HasColumnName("dp3_image"); e.Property(x => x.Dp3Title).HasColumnName("dp3_title"); e.Property(x => x.Dp4Image).HasColumnName("dp4_image"); e.Property(x => x.Dp4Title).HasColumnName("dp4_title"); e.Property(x => x.VirtualCount).HasColumnName("virtual_count"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.HasOne(x => x.Scene).WithMany(x => x.ContentElements).HasForeignKey(x => x.SceneId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("scene_color_elements"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.SceneId).HasColumnName("scene_id"); e.Property(x => x.ElementKey).HasColumnName("element_key").IsRequired(); e.Property(x => x.Title).HasColumnName("title").IsRequired(); e.Property(x => x.Icon).HasColumnName("icon"); e.Property(x => x.AttrValue).HasColumnName("attr_value"); e.Property(x => x.DefaultColor).HasColumnName("default_color").IsRequired(); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.HasOne(x => x.Scene).WithMany(x => x.ColorElements).HasForeignKey(x => x.SceneId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("scene_color_presets"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.SceneId).HasColumnName("scene_id"); e.Property(x => x.Name).HasColumnName("name"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.HasOne().WithMany(x => x.ColorPresets).HasForeignKey(x => x.SceneId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("scene_color_preset_items"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.PresetId).HasColumnName("preset_id"); e.Property(x => x.ElementKey).HasColumnName("element_key").IsRequired(); e.Property(x => x.Value).HasColumnName("value").IsRequired(); e.Property(x => x.Sort).HasColumnName("sort"); e.HasOne(x => x.Preset).WithMany(x => x.Items).HasForeignKey(x => x.PresetId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("shared_colors"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ProjectId).HasColumnName("project_id"); e.Property(x => x.ElementKey).HasColumnName("element_key").IsRequired(); e.Property(x => x.Title).HasColumnName("title").IsRequired(); e.Property(x => x.Icon).HasColumnName("icon"); e.Property(x => x.AttrValue).HasColumnName("attr_value"); e.Property(x => x.DefaultColor).HasColumnName("default_color").IsRequired(); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.HasOne(x => x.Project).WithMany(x => x.SharedColors).HasForeignKey(x => x.ProjectId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("shared_color_presets"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ProjectId).HasColumnName("project_id"); e.Property(x => x.Name).HasColumnName("name"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.HasOne(x => x.Project).WithMany(x => x.SharedColorPresets).HasForeignKey(x => x.ProjectId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("shared_color_preset_items"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.PresetId).HasColumnName("preset_id"); e.Property(x => x.ElementKey).HasColumnName("element_key").IsRequired(); e.Property(x => x.Value).HasColumnName("value").IsRequired(); e.Property(x => x.Sort).HasColumnName("sort"); e.HasOne(x => x.Preset).WithMany(x => x.Items).HasForeignKey(x => x.PresetId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("shared_layers"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ProjectId).HasColumnName("project_id"); e.Property(x => x.Key).HasColumnName("key").IsRequired(); e.Property(x => x.Title).HasColumnName("title").IsRequired(); e.Property(x => x.LocalizedTitle).HasColumnName("localized_title").HasColumnType("jsonb"); e.Property(x => x.Hint).HasColumnName("hint"); e.Property(x => x.Type).HasColumnName("type"); e.Property(x => x.DefaultValue).HasColumnName("default_value"); e.Property(x => x.FontId).HasColumnName("font_id"); e.Property(x => x.FontFace).HasColumnName("font_face"); e.Property(x => x.FontFaceName).HasColumnName("font_face_name"); e.Property(x => x.FontSize).HasColumnName("font_size"); e.Property(x => x.DefaultFontSize).HasColumnName("default_font_size"); e.Property(x => x.DefaultFontFace).HasColumnName("default_font_face"); e.Property(x => x.IsFontChangeable).HasColumnName("is_font_changeable"); e.Property(x => x.IsFontSizeChangeable).HasColumnName("is_font_size_changeable"); e.Property(x => x.Justify).HasColumnName("justify"); e.Property(x => x.CanJustify).HasColumnName("can_justify"); e.Property(x => x.PositionInContainer).HasColumnName("position_in_container"); e.Property(x => x.IsTextBox).HasColumnName("is_text_box"); e.Property(x => x.MaxSize).HasColumnName("max_size"); e.Property(x => x.DirectionLayerKey).HasColumnName("direction_layer_key"); e.Property(x => x.DirectionLayerValue).HasColumnName("direction_layer_value"); e.Property(x => x.VideoSupport).HasColumnName("video_support"); e.Property(x => x.MinDurationSec).HasColumnName("min_duration_sec"); e.Property(x => x.MaxDurationSec).HasColumnName("max_duration_sec"); e.Property(x => x.Width).HasColumnName("width"); e.Property(x => x.Height).HasColumnName("height"); e.Property(x => x.Thumbnail).HasColumnName("thumbnail"); e.Property(x => x.MappedList).HasColumnName("mapped_list").HasColumnType("jsonb"); e.Property(x => x.CounterMode).HasColumnName("counter_mode"); e.Property(x => x.AiInputType).HasColumnName("ai_input_type"); e.Property(x => x.IsHidden).HasColumnName("is_hidden"); e.Property(x => x.IsFocused).HasColumnName("is_focused"); e.Property(x => x.Dp1Image).HasColumnName("dp1_image"); e.Property(x => x.Dp1Title).HasColumnName("dp1_title"); e.Property(x => x.Dp2Image).HasColumnName("dp2_image"); e.Property(x => x.Dp2Title).HasColumnName("dp2_title"); e.Property(x => x.Dp3Image).HasColumnName("dp3_image"); e.Property(x => x.Dp3Title).HasColumnName("dp3_title"); e.Property(x => x.Dp4Image).HasColumnName("dp4_image"); e.Property(x => x.Dp4Title).HasColumnName("dp4_title"); e.Property(x => x.VirtualCount).HasColumnName("virtual_count"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.HasOne(x => x.Project).WithMany(x => x.SharedLayers).HasForeignKey(x => x.ProjectId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("template_svg_previews"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ProjectId).HasColumnName("project_id"); e.Property(x => x.SceneId).HasColumnName("scene_id"); e.Property(x => x.SourceImageUrl).HasColumnName("source_image_url"); e.Property(x => x.SvgUrl).HasColumnName("svg_url").IsRequired(); e.Property(x => x.ThumbnailUrl).HasColumnName("thumbnail_url"); e.Property(x => x.ColorZones).HasColumnName("color_zones").HasColumnType("jsonb").IsRequired(); e.Property(x => x.Width).HasColumnName("width"); e.Property(x => x.Height).HasColumnName("height"); e.Property(x => x.GenerationMethod).HasColumnName("generation_method"); e.Property(x => x.GeneratedByAi).HasColumnName("generated_by_ai"); e.Property(x => x.QualityScore).HasColumnName("quality_score"); e.Property(x => x.CreatedByUserId).HasColumnName("created_by_user_id"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); }); } private static void ConfigureCharacters(ModelBuilder mb) { mb.Entity(e => { e.ToTable("scene_characters"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.SceneId).HasColumnName("scene_id"); e.Property(x => x.Key).HasColumnName("key").IsRequired(); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Icon).HasColumnName("icon"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.HasOne(x => x.Scene).WithMany(x => x.Characters).HasForeignKey(x => x.SceneId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("scene_character_controllers"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.SceneCharacterId).HasColumnName("scene_character_id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Key).HasColumnName("key").IsRequired(); e.Property(x => x.DefaultValue).HasColumnName("default_value"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.HasOne(x => x.Character).WithMany(x => x.Controllers).HasForeignKey(x => x.SceneCharacterId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("scene_controller_options"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ControllerId).HasColumnName("controller_id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Icon).HasColumnName("icon"); e.Property(x => x.Value).HasColumnName("value").IsRequired(); e.Property(x => x.Sort).HasColumnName("sort"); e.HasOne(x => x.Controller).WithMany(x => x.Options).HasForeignKey(x => x.ControllerId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("project_character_controllers"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ProjectId).HasColumnName("project_id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Key).HasColumnName("key").IsRequired(); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.HasOne(x => x.Project).WithMany(x => x.CharacterControllers).HasForeignKey(x => x.ProjectId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("project_character_controller_options"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ControllerId).HasColumnName("controller_id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Icon).HasColumnName("icon"); e.Property(x => x.Value).HasColumnName("value").IsRequired(); e.Property(x => x.Sort).HasColumnName("sort"); e.HasOne(x => x.Controller).WithMany(x => x.Options).HasForeignKey(x => x.ControllerId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("project_character_presets"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ProjectId).HasColumnName("project_id"); e.Property(x => x.Key).HasColumnName("key"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Icon).HasColumnName("icon"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.HasOne(x => x.Project).WithMany(x => x.CharacterPresets).HasForeignKey(x => x.ProjectId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("preset_character_controllers"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.CharacterPresetId).HasColumnName("character_preset_id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Key).HasColumnName("key").IsRequired(); e.Property(x => x.Value).HasColumnName("value").IsRequired(); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.HasOne(x => x.Preset).WithMany(x => x.PresetControllers).HasForeignKey(x => x.CharacterPresetId).OnDelete(DeleteBehavior.Cascade); }); mb.Entity(e => { e.ToTable("preset_stories"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.ProjectId).HasColumnName("project_id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Description).HasColumnName("description"); e.Property(x => x.Demo).HasColumnName("demo"); e.Property(x => x.MusicId).HasColumnName("music_id"); e.Property(x => x.ScenesSpa).HasColumnName("scenes_spa"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.IsPublished).HasColumnName("is_published"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.Property(x => x.DeletedAt).HasColumnName("deleted_at"); e.HasOne(x => x.Project).WithMany(x => x.PresetStories).HasForeignKey(x => x.ProjectId).OnDelete(DeleteBehavior.Cascade); e.HasOne(x => x.Music).WithMany().HasForeignKey(x => x.MusicId).OnDelete(DeleteBehavior.SetNull); e.HasQueryFilter(x => x.DeletedAt == null); }); mb.Entity(e => { e.ToTable("preset_scenes"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.PresetStoryId).HasColumnName("preset_story_id"); e.Property(x => x.SceneId).HasColumnName("scene_id"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.DefaultDurationSec).HasColumnName("default_duration_sec"); e.HasOne(x => x.Story).WithMany(x => x.Scenes).HasForeignKey(x => x.PresetStoryId).OnDelete(DeleteBehavior.Cascade); e.HasOne(x => x.Scene).WithMany().HasForeignKey(x => x.SceneId).OnDelete(DeleteBehavior.Cascade); }); } private static void ConfigureCms(ModelBuilder mb) { mb.Entity(e => { e.ToTable("blogs"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.TenantId).HasColumnName("tenant_id"); e.Property(x => x.Kind).HasColumnName("kind"); e.Property(x => x.Slug).HasColumnName("slug").HasColumnType("citext").IsRequired(); e.Property(x => x.Title).HasColumnName("title").IsRequired(); e.Property(x => x.ShortDescription).HasColumnName("short_description"); e.Property(x => x.Content).HasColumnName("content").IsRequired(); e.Property(x => x.MetaTitle).HasColumnName("meta_title"); e.Property(x => x.MetaDescription).HasColumnName("meta_description"); e.Property(x => x.MetaKeywords).HasColumnName("meta_keywords"); e.Property(x => x.IncludeInSiteMap).HasColumnName("include_in_site_map"); e.Property(x => x.Image).HasColumnName("image"); e.Property(x => x.Cover).HasColumnName("cover"); e.Property(x => x.AuthorUserId).HasColumnName("author_user_id"); e.Property(x => x.AuthorDisplayName).HasColumnName("author_display_name"); e.Property(x => x.IsPublished).HasColumnName("is_published"); e.Property(x => x.PublishDate).HasColumnName("publish_date"); e.Property(x => x.ViewCount).HasColumnName("view_count"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.Property(x => x.DeletedAt).HasColumnName("deleted_at"); e.HasQueryFilter(x => x.DeletedAt == null); }); mb.Entity(e => { e.ToTable("comments"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.TenantId).HasColumnName("tenant_id"); e.Property(x => x.UserId).HasColumnName("user_id"); e.Property(x => x.BlogId).HasColumnName("blog_id"); e.Property(x => x.ContainerId).HasColumnName("container_id"); e.Property(x => x.ParentCommentId).HasColumnName("parent_comment_id"); e.Property(x => x.Content).HasColumnName("content").IsRequired(); e.Property(x => x.Rate).HasColumnName("rate"); e.Property(x => x.IsApproved).HasColumnName("is_approved"); e.Property(x => x.IsPinned).HasColumnName("is_pinned"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); e.Property(x => x.DeletedAt).HasColumnName("deleted_at"); e.HasOne(x => x.Blog).WithMany(x => x.Comments).HasForeignKey(x => x.BlogId).OnDelete(DeleteBehavior.Cascade); e.HasOne(x => x.Container).WithMany(x => x.Comments).HasForeignKey(x => x.ContainerId).OnDelete(DeleteBehavior.Cascade); e.HasOne(x => x.ParentComment).WithMany(x => x.Replies).HasForeignKey(x => x.ParentCommentId).OnDelete(DeleteBehavior.Cascade); e.HasQueryFilter(x => x.DeletedAt == null); }); mb.Entity(e => { e.ToTable("home_page_events"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.TenantId).HasColumnName("tenant_id"); e.Property(x => x.Title).HasColumnName("title"); e.Property(x => x.Subtitle).HasColumnName("subtitle"); e.Property(x => x.Description).HasColumnName("description"); e.Property(x => x.Badge).HasColumnName("badge"); e.Property(x => x.BadgeClass).HasColumnName("badge_class"); e.Property(x => x.ButtonText).HasColumnName("button_text"); e.Property(x => x.ButtonUrl).HasColumnName("button_url"); e.Property(x => x.ButtonClass).HasColumnName("button_class"); e.Property(x => x.Color).HasColumnName("color"); e.Property(x => x.BackgroundColor).HasColumnName("background_color"); e.Property(x => x.TextColor).HasColumnName("text_color"); e.Property(x => x.Image).HasColumnName("image"); e.Property(x => x.IsActive).HasColumnName("is_active"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.StartsAt).HasColumnName("starts_at"); e.Property(x => x.EndsAt).HasColumnName("ends_at"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); }); mb.Entity(e => { e.ToTable("new_slides"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.TenantId).HasColumnName("tenant_id"); e.Property(x => x.Keyword).HasColumnName("keyword"); e.Property(x => x.Title).HasColumnName("title"); e.Property(x => x.Image).HasColumnName("image"); e.Property(x => x.Parameter).HasColumnName("parameter"); e.Property(x => x.SlideType).HasColumnName("slide_type"); e.Property(x => x.ExpireDate).HasColumnName("expire_date"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.IsActive).HasColumnName("is_active"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); }); mb.Entity(e => { e.ToTable("internal_routes"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.TenantId).HasColumnName("tenant_id"); e.Property(x => x.Name).HasColumnName("name"); e.Property(x => x.Image).HasColumnName("image"); e.Property(x => x.Slug).HasColumnName("slug").HasColumnType("citext").IsRequired(); e.Property(x => x.Priority).HasColumnName("priority"); e.Property(x => x.LastDate).HasColumnName("last_date"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); }); mb.Entity(e => { e.ToTable("custom_routes"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.TenantId).HasColumnName("tenant_id"); e.Property(x => x.Target).HasColumnName("target").IsRequired(); e.Property(x => x.Destination).HasColumnName("destination").IsRequired(); e.Property(x => x.RedirectCode).HasColumnName("redirect_code"); e.Property(x => x.IsActive).HasColumnName("is_active"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); }); mb.Entity(e => { e.ToTable("website_settings"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.TenantId).HasColumnName("tenant_id"); e.Property(x => x.Key).HasColumnName("key").IsRequired(); e.Property(x => x.Value).HasColumnName("value").HasColumnType("jsonb").IsRequired(); e.Property(x => x.Description).HasColumnName("description"); e.Property(x => x.IsSecret).HasColumnName("is_secret"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); }); mb.Entity(e => { e.ToTable("learn"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.TenantId).HasColumnName("tenant_id"); e.Property(x => x.Title).HasColumnName("title").IsRequired(); e.Property(x => x.Body).HasColumnName("body"); e.Property(x => x.DemoUrl).HasColumnName("demo_url"); e.Property(x => x.Mode).HasColumnName("mode"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); }); mb.Entity(e => { e.ToTable("trainings"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.TenantId).HasColumnName("tenant_id"); e.Property(x => x.Title).HasColumnName("title").IsRequired(); e.Property(x => x.Description).HasColumnName("description"); e.Property(x => x.VideoUrl).HasColumnName("video_url"); e.Property(x => x.ThumbnailUrl).HasColumnName("thumbnail_url"); e.Property(x => x.Sort).HasColumnName("sort"); e.Property(x => x.IsPublished).HasColumnName("is_published"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); }); mb.Entity(e => { e.ToTable("favorite_folders"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.UserId).HasColumnName("user_id"); e.Property(x => x.TenantId).HasColumnName("tenant_id"); e.Property(x => x.Name).HasColumnName("name").IsRequired(); e.Property(x => x.Description).HasColumnName("description"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.Property(x => x.UpdatedAt).HasColumnName("updated_at"); }); mb.Entity(e => { e.ToTable("favorite_containers"); e.HasKey(x => x.Id); e.Property(x => x.Id).HasColumnName("id"); e.Property(x => x.UserId).HasColumnName("user_id"); e.Property(x => x.TenantId).HasColumnName("tenant_id"); e.Property(x => x.ContainerId).HasColumnName("container_id"); e.Property(x => x.FolderId).HasColumnName("folder_id"); e.Property(x => x.Note).HasColumnName("note"); e.Property(x => x.CreatedAt).HasColumnName("created_at"); e.HasOne(x => x.Container).WithMany().HasForeignKey(x => x.ContainerId).OnDelete(DeleteBehavior.Cascade); e.HasOne(x => x.Folder).WithMany(x => x.Containers).HasForeignKey(x => x.FolderId).OnDelete(DeleteBehavior.SetNull); }); } }