Files
flatrender/services/content/FlatRender.ContentSvc/Infrastructure/Data/ContentDbContext.cs
T
soroush.asadi 7fe5f8a563
Build backend images / build content-svc (push) Failing after 1m36s
Build backend images / build file-svc (push) Failing after 1m28s
Build backend images / build gateway (push) Failing after 2m11s
Build backend images / build identity-svc (push) Failing after 2m11s
Build backend images / build notification-svc (push) Failing after 3m46s
Build backend images / build render-svc (push) Failing after 55s
Build backend images / build studio-svc (push) Failing after 1m2s
feat(admin): standalone Projects page + per-project asset manager
- content-svc: GET /v1/projects (browse/search all projects across containers,
  paginated, admin) returning template name/slug + AE status; project_assets
  table (mig 23) + entity; GET/POST/DELETE /v1/projects/{id}/assets
- /admin/projects: searchable, paginated list of every renderable project with
  thumbnail, template, aspect/resolution, AE-file + publish status
- ProjectAssets component: list/upload/delete named footage/image/audio/font
  files per project (reused in the projects page; AE file upload alongside)
- nav + fa/en "Projects" label

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-03 00:39:33 +03:30

930 lines
52 KiB
C#

using FlatRender.ContentSvc.Domain.Entities;
using FlatRender.ContentSvc.Domain.Enums;
using Microsoft.EntityFrameworkCore;
namespace FlatRender.ContentSvc.Infrastructure.Data;
public class ContentDbContext(DbContextOptions<ContentDbContext> options) : DbContext(options)
{
// Taxonomy
public DbSet<Category> Categories => Set<Category>();
public DbSet<Tag> Tags => Set<Tag>();
public DbSet<Font> Fonts => Set<Font>();
public DbSet<MusicTrack> MusicTracks => Set<MusicTrack>();
public DbSet<ProjectServer> ProjectServers => Set<ProjectServer>();
public DbSet<AdminFile> AdminFiles => Set<AdminFile>();
// Templates
public DbSet<ProjectContainer> ProjectContainers => Set<ProjectContainer>();
public DbSet<ContainerCategory> ContainerCategories => Set<ContainerCategory>();
public DbSet<ContainerTag> ContainerTags => Set<ContainerTag>();
public DbSet<Project> Projects => Set<Project>();
public DbSet<ProjectAsset> ProjectAssets => Set<ProjectAsset>();
// Scenes
public DbSet<Scene> Scenes => Set<Scene>();
public DbSet<SceneCategory> SceneCategories => Set<SceneCategory>();
public DbSet<RepeaterItem> RepeaterItems => Set<RepeaterItem>();
public DbSet<SceneContentElement> SceneContentElements => Set<SceneContentElement>();
public DbSet<SceneColorElement> SceneColorElements => Set<SceneColorElement>();
public DbSet<SceneColorPreset> SceneColorPresets => Set<SceneColorPreset>();
public DbSet<SceneColorPresetItem> SceneColorPresetItems => Set<SceneColorPresetItem>();
public DbSet<SharedColor> SharedColors => Set<SharedColor>();
public DbSet<SharedColorPreset> SharedColorPresets => Set<SharedColorPreset>();
public DbSet<SharedColorPresetItem> SharedColorPresetItems => Set<SharedColorPresetItem>();
public DbSet<SharedLayer> SharedLayers => Set<SharedLayer>();
public DbSet<TemplateSvgPreview> TemplateSvgPreviews => Set<TemplateSvgPreview>();
// Characters
public DbSet<SceneCharacter> SceneCharacters => Set<SceneCharacter>();
public DbSet<SceneCharacterController> SceneCharacterControllers => Set<SceneCharacterController>();
public DbSet<SceneControllerOption> SceneControllerOptions => Set<SceneControllerOption>();
public DbSet<ProjectCharacterController> ProjectCharacterControllers => Set<ProjectCharacterController>();
public DbSet<ProjectCharacterControllerOption> ProjectCharacterControllerOptions => Set<ProjectCharacterControllerOption>();
public DbSet<ProjectCharacterPreset> ProjectCharacterPresets => Set<ProjectCharacterPreset>();
public DbSet<PresetCharacterController> PresetCharacterControllers => Set<PresetCharacterController>();
public DbSet<PresetStory> PresetStories => Set<PresetStory>();
public DbSet<PresetScene> PresetScenes => Set<PresetScene>();
// CMS
public DbSet<Blog> Blogs => Set<Blog>();
public DbSet<Comment> Comments => Set<Comment>();
public DbSet<HomePageEvent> HomePageEvents => Set<HomePageEvent>();
public DbSet<NewSlide> NewSlides => Set<NewSlide>();
public DbSet<InternalRoute> InternalRoutes => Set<InternalRoute>();
public DbSet<CustomRoute> CustomRoutes => Set<CustomRoute>();
public DbSet<WebsiteSetting> WebsiteSettings => Set<WebsiteSetting>();
public DbSet<LearnArticle> LearnArticles => Set<LearnArticle>();
public DbSet<Training> Trainings => Set<Training>();
public DbSet<FavoriteFolder> FavoriteFolders => Set<FavoriteFolder>();
public DbSet<FavoriteContainer> FavoriteContainers => Set<FavoriteContainer>();
// AI
public DbSet<AiSettings> AiSettings => Set<AiSettings>();
protected override void OnModelCreating(ModelBuilder mb)
{
mb.HasDefaultSchema("content");
// Native PostgreSQL enums are registered on the EF provider via npgsql.MapEnum<T>()
// 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<AiSettings>(e =>
{
e.ToTable("ai_settings");
e.HasKey(x => x.TenantId);
});
}
private static void ConfigureTaxonomy(ModelBuilder mb)
{
mb.Entity<Category>(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<Tag>(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<Font>(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<MusicTrack>(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<ProjectServer>(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<AdminFile>(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<ProjectAsset>(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<ProjectContainer>(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<ContainerCategory>(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<ContainerTag>(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<Project>(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.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<Scene>(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<SceneCategory>(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<RepeaterItem>(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<SceneContentElement>(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<SceneColorElement>(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<SceneColorPreset>(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<Scene>().WithMany(x => x.ColorPresets).HasForeignKey(x => x.SceneId).OnDelete(DeleteBehavior.Cascade);
});
mb.Entity<SceneColorPresetItem>(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<SharedColor>(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<SharedColorPreset>(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<SharedColorPresetItem>(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<SharedLayer>(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<TemplateSvgPreview>(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<SceneCharacter>(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<SceneCharacterController>(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<SceneControllerOption>(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<ProjectCharacterController>(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<ProjectCharacterControllerOption>(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<ProjectCharacterPreset>(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<PresetCharacterController>(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<PresetStory>(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<PresetScene>(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<Blog>(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<Comment>(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<HomePageEvent>(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<NewSlide>(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<InternalRoute>(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<CustomRoute>(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<WebsiteSetting>(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<LearnArticle>(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<Training>(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<FavoriteFolder>(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<FavoriteContainer>(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);
});
}
}