feat: V2 microservices stack — backend services, gateway, JWT auth
Add full V2 architecture: identity, content, studio (.NET 10) and file, render, notification, gateway (Go) services with vendored deps, plus DB migrations, event/API contracts, and an init-db script. Wire the Next.js frontend to the gateway: server-side JWT auth routes (login/register/refresh/logout/me), gateway fetch helper, and session/ cookie/jwt helpers under src/lib. Containerize the stack via docker-compose.v2.yml and per-service Dockerfiles. Base images resolve through a Nexus mirror (Docker Hub) and MCR directly; npm/NuGet pull from Nexus groups. Self-host fonts via next/font/local to avoid Google Fonts (geo-blocked). Add CI workflow and ignore .env.v2, *.stackdump, and .NET bin/obj. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,903 @@
|
||||
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>();
|
||||
|
||||
// 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>();
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
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");
|
||||
});
|
||||
}
|
||||
|
||||
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);
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user