From 73bba7a865375562cd7b6872b66f0bb4c0e2b913 Mon Sep 17 00:00:00 2001 From: kozhilya Date: Mon, 14 Apr 2025 18:40:38 +0400 Subject: [PATCH] =?UTF-8?q?=D0=A1=D0=BE=D0=B7=D0=B4=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BC=D0=BE=D0=B4=D0=B5=D0=BB=D0=B8=20=D0=91=D0=94=20?= =?UTF-8?q?=D0=B2=20EntityFramework?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Pf2eDataScrapper/.env.example | 5 +- Pf2eDataScrapper/EnvSettings.cs | 1 + Pf2eDataScrapper/Model/Action.cs | 29 + Pf2eDataScrapper/Model/Ancestry.cs | 37 + Pf2eDataScrapper/Model/AncestryBoost.cs | 17 + Pf2eDataScrapper/Model/AncestryItem.cs | 17 + Pf2eDataScrapper/Model/AncestryLanguage.cs | 17 + Pf2eDataScrapper/Model/Background.cs | 29 + Pf2eDataScrapper/Model/BackgroundBoost.cs | 15 + Pf2eDataScrapper/Model/BackgroundItem.cs | 17 + Pf2eDataScrapper/Model/BackgroundSkill.cs | 17 + Pf2eDataScrapper/Model/CampaignFeature.cs | 31 + Pf2eDataScrapper/Model/Class.cs | 37 + Pf2eDataScrapper/Model/ClassKeyAbility.cs | 15 + Pf2eDataScrapper/Model/ClassProgression.cs | 19 + Pf2eDataScrapper/Model/ClassTraining.cs | 21 + Pf2eDataScrapper/Model/Condition.cs | 25 + Pf2eDataScrapper/Model/Deity.cs | 35 + Pf2eDataScrapper/Model/DeityAttribute.cs | 13 + Pf2eDataScrapper/Model/DeityDomain.cs | 17 + Pf2eDataScrapper/Model/DeitySpell.cs | 19 + Pf2eDataScrapper/Model/DeityWeapon.cs | 15 + Pf2eDataScrapper/Model/Entity.cs | 37 + Pf2eDataScrapper/Model/EntityAlias.cs | 15 + Pf2eDataScrapper/Model/EntityExternal.cs | 21 + Pf2eDataScrapper/Model/EntityKeyword.cs | 15 + Pf2eDataScrapper/Model/EntitySource.cs | 19 + Pf2eDataScrapper/Model/ExternalTarget.cs | 16 + Pf2eDataScrapper/Model/Feat.cs | 39 + Pf2eDataScrapper/Model/FeatPrerequisite.cs | 15 + Pf2eDataScrapper/Model/Frequency.cs | 18 + Pf2eDataScrapper/Model/Heritage.cs | 28 + Pf2eDataScrapper/Model/Keyword.cs | 11 + Pf2eDataScrapper/Model/KeywordAlias.cs | 13 + Pf2eDataScrapper/Model/Language.cs | 14 + Pf2eDataScrapper/Model/Source.cs | 13 + Pf2eDataScrapper/Model/Spell.cs | 53 + Pf2eDataScrapper/Model/SpellArea.cs | 15 + Pf2eDataScrapper/Model/SpellDamage.cs | 23 + Pf2eDataScrapper/Model/SpellDefense.cs | 19 + Pf2eDataScrapper/Model/SpellRitual.cs | 17 + Pf2eDataScrapper/Model/Training.cs | 15 + Pf2eDataScrapper/Model/Trait.cs | 15 + Pf2eDataScrapper/Pf2eDataScrapper.csproj | 10 +- Pf2eDataScrapper/Pf2eDatabase.cs | 121 ++ Pf2eDataScrapper/Pf2eTestContext.cs | 1102 +++++++++++++++++ .../schema.pgsql | 84 +- Pf2eDataScrapper/test.json | 97 -- 48 files changed, 2154 insertions(+), 139 deletions(-) create mode 100644 Pf2eDataScrapper/Model/Action.cs create mode 100644 Pf2eDataScrapper/Model/Ancestry.cs create mode 100644 Pf2eDataScrapper/Model/AncestryBoost.cs create mode 100644 Pf2eDataScrapper/Model/AncestryItem.cs create mode 100644 Pf2eDataScrapper/Model/AncestryLanguage.cs create mode 100644 Pf2eDataScrapper/Model/Background.cs create mode 100644 Pf2eDataScrapper/Model/BackgroundBoost.cs create mode 100644 Pf2eDataScrapper/Model/BackgroundItem.cs create mode 100644 Pf2eDataScrapper/Model/BackgroundSkill.cs create mode 100644 Pf2eDataScrapper/Model/CampaignFeature.cs create mode 100644 Pf2eDataScrapper/Model/Class.cs create mode 100644 Pf2eDataScrapper/Model/ClassKeyAbility.cs create mode 100644 Pf2eDataScrapper/Model/ClassProgression.cs create mode 100644 Pf2eDataScrapper/Model/ClassTraining.cs create mode 100644 Pf2eDataScrapper/Model/Condition.cs create mode 100644 Pf2eDataScrapper/Model/Deity.cs create mode 100644 Pf2eDataScrapper/Model/DeityAttribute.cs create mode 100644 Pf2eDataScrapper/Model/DeityDomain.cs create mode 100644 Pf2eDataScrapper/Model/DeitySpell.cs create mode 100644 Pf2eDataScrapper/Model/DeityWeapon.cs create mode 100644 Pf2eDataScrapper/Model/Entity.cs create mode 100644 Pf2eDataScrapper/Model/EntityAlias.cs create mode 100644 Pf2eDataScrapper/Model/EntityExternal.cs create mode 100644 Pf2eDataScrapper/Model/EntityKeyword.cs create mode 100644 Pf2eDataScrapper/Model/EntitySource.cs create mode 100644 Pf2eDataScrapper/Model/ExternalTarget.cs create mode 100644 Pf2eDataScrapper/Model/Feat.cs create mode 100644 Pf2eDataScrapper/Model/FeatPrerequisite.cs create mode 100644 Pf2eDataScrapper/Model/Frequency.cs create mode 100644 Pf2eDataScrapper/Model/Heritage.cs create mode 100644 Pf2eDataScrapper/Model/Keyword.cs create mode 100644 Pf2eDataScrapper/Model/KeywordAlias.cs create mode 100644 Pf2eDataScrapper/Model/Language.cs create mode 100644 Pf2eDataScrapper/Model/Source.cs create mode 100644 Pf2eDataScrapper/Model/Spell.cs create mode 100644 Pf2eDataScrapper/Model/SpellArea.cs create mode 100644 Pf2eDataScrapper/Model/SpellDamage.cs create mode 100644 Pf2eDataScrapper/Model/SpellDefense.cs create mode 100644 Pf2eDataScrapper/Model/SpellRitual.cs create mode 100644 Pf2eDataScrapper/Model/Training.cs create mode 100644 Pf2eDataScrapper/Model/Trait.cs create mode 100644 Pf2eDataScrapper/Pf2eDatabase.cs create mode 100644 Pf2eDataScrapper/Pf2eTestContext.cs rename dbml/schema.sql => Pf2eDataScrapper/schema.pgsql (88%) delete mode 100644 Pf2eDataScrapper/test.json diff --git a/Pf2eDataScrapper/.env.example b/Pf2eDataScrapper/.env.example index e4a1ea9..c689389 100644 --- a/Pf2eDataScrapper/.env.example +++ b/Pf2eDataScrapper/.env.example @@ -1 +1,4 @@ -DATA_DIR=D:\path\to\directory\with\repositories \ No newline at end of file +DATA_DIR=D:\path\to\directory\with\repositories +OUTPUT_DIR=D:\path\to\output\directory + +DATABASE_CONNECTION=Host=localhost;Port=5433;Database=usersdb2;Username=postgres;Password=password \ No newline at end of file diff --git a/Pf2eDataScrapper/EnvSettings.cs b/Pf2eDataScrapper/EnvSettings.cs index d618c46..5a5fffb 100644 --- a/Pf2eDataScrapper/EnvSettings.cs +++ b/Pf2eDataScrapper/EnvSettings.cs @@ -36,5 +36,6 @@ namespace Pf2eDataScrapper /// public static string OutputDir => new(OutputDirPath); + public static string DatabaseConnection => EnvReader.GetStringValue("DATABASE_CONNECTION"); } } diff --git a/Pf2eDataScrapper/Model/Action.cs b/Pf2eDataScrapper/Model/Action.cs new file mode 100644 index 0000000..757099f --- /dev/null +++ b/Pf2eDataScrapper/Model/Action.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class Action +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Img { get; set; } = null!; + + public string Description { get; set; } = null!; + + public string? DescriptionGm { get; set; } + + public string Slug { get; set; } = null!; + + public bool? IsTranslated { get; set; } + + public bool? IsChecked { get; set; } + + public int? Actions { get; set; } + + public bool? DeathNote { get; set; } + + public string? Extra { get; set; } +} diff --git a/Pf2eDataScrapper/Model/Ancestry.cs b/Pf2eDataScrapper/Model/Ancestry.cs new file mode 100644 index 0000000..b4d7f25 --- /dev/null +++ b/Pf2eDataScrapper/Model/Ancestry.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class Ancestry +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Img { get; set; } = null!; + + public string Description { get; set; } = null!; + + public string? DescriptionGm { get; set; } + + public string Slug { get; set; } = null!; + + public bool? IsTranslated { get; set; } + + public bool? IsChecked { get; set; } + + public int Hp { get; set; } + + public int Reach { get; set; } + + public int Speed { get; set; } + + public virtual ICollection AncestryBoosts { get; set; } = new List(); + + public virtual ICollection AncestryItems { get; set; } = new List(); + + public virtual ICollection AncestryLanguages { get; set; } = new List(); + + public virtual ICollection Heritages { get; set; } = new List(); +} diff --git a/Pf2eDataScrapper/Model/AncestryBoost.cs b/Pf2eDataScrapper/Model/AncestryBoost.cs new file mode 100644 index 0000000..fe679ab --- /dev/null +++ b/Pf2eDataScrapper/Model/AncestryBoost.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class AncestryBoost +{ + public int Id { get; set; } + + public int AncestryId { get; set; } + + public bool Boost { get; set; } + + public string? Value { get; set; } + + public virtual Ancestry Ancestry { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/AncestryItem.cs b/Pf2eDataScrapper/Model/AncestryItem.cs new file mode 100644 index 0000000..162dc67 --- /dev/null +++ b/Pf2eDataScrapper/Model/AncestryItem.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class AncestryItem +{ + public int AncestryId { get; set; } + + public int ItemId { get; set; } + + public int Level { get; set; } + + public virtual Ancestry Ancestry { get; set; } = null!; + + public virtual Entity Item { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/AncestryLanguage.cs b/Pf2eDataScrapper/Model/AncestryLanguage.cs new file mode 100644 index 0000000..d75b3b0 --- /dev/null +++ b/Pf2eDataScrapper/Model/AncestryLanguage.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class AncestryLanguage +{ + public int AncestryId { get; set; } + + public int LanguageId { get; set; } + + public bool IsAdditional { get; set; } + + public virtual Ancestry Ancestry { get; set; } = null!; + + public virtual Language Language { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/Background.cs b/Pf2eDataScrapper/Model/Background.cs new file mode 100644 index 0000000..f44cda8 --- /dev/null +++ b/Pf2eDataScrapper/Model/Background.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class Background +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Img { get; set; } = null!; + + public string Description { get; set; } = null!; + + public string? DescriptionGm { get; set; } + + public string Slug { get; set; } = null!; + + public bool? IsTranslated { get; set; } + + public bool? IsChecked { get; set; } + + public virtual ICollection BackgroundBoosts { get; set; } = new List(); + + public virtual ICollection BackgroundItems { get; set; } = new List(); + + public virtual ICollection BackgroundSkills { get; set; } = new List(); +} diff --git a/Pf2eDataScrapper/Model/BackgroundBoost.cs b/Pf2eDataScrapper/Model/BackgroundBoost.cs new file mode 100644 index 0000000..bf601a8 --- /dev/null +++ b/Pf2eDataScrapper/Model/BackgroundBoost.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class BackgroundBoost +{ + public int Id { get; set; } + + public int BackgroundId { get; set; } + + public string? Value { get; set; } + + public virtual Background Background { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/BackgroundItem.cs b/Pf2eDataScrapper/Model/BackgroundItem.cs new file mode 100644 index 0000000..f459228 --- /dev/null +++ b/Pf2eDataScrapper/Model/BackgroundItem.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class BackgroundItem +{ + public int BackgroundId { get; set; } + + public int EntityId { get; set; } + + public int? Level { get; set; } + + public virtual Background Background { get; set; } = null!; + + public virtual Entity Entity { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/BackgroundSkill.cs b/Pf2eDataScrapper/Model/BackgroundSkill.cs new file mode 100644 index 0000000..ad8c3b4 --- /dev/null +++ b/Pf2eDataScrapper/Model/BackgroundSkill.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class BackgroundSkill +{ + public int Id { get; set; } + + public int BackgroundId { get; set; } + + public string Name { get; set; } = null!; + + public bool IsSkill { get; set; } + + public virtual Background Background { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/CampaignFeature.cs b/Pf2eDataScrapper/Model/CampaignFeature.cs new file mode 100644 index 0000000..7711592 --- /dev/null +++ b/Pf2eDataScrapper/Model/CampaignFeature.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class CampaignFeature +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Img { get; set; } = null!; + + public string Description { get; set; } = null!; + + public string? DescriptionGm { get; set; } + + public string Slug { get; set; } = null!; + + public bool? IsTranslated { get; set; } + + public bool? IsChecked { get; set; } + + public int? Level { get; set; } + + public int Actions { get; set; } + + public string? Prerequisites { get; set; } + + public string? Extra { get; set; } +} diff --git a/Pf2eDataScrapper/Model/Class.cs b/Pf2eDataScrapper/Model/Class.cs new file mode 100644 index 0000000..f3ad051 --- /dev/null +++ b/Pf2eDataScrapper/Model/Class.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class Class +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Img { get; set; } = null!; + + public string Description { get; set; } = null!; + + public string? DescriptionGm { get; set; } + + public string Slug { get; set; } = null!; + + public bool? IsTranslated { get; set; } + + public bool? IsChecked { get; set; } + + public int Hp { get; set; } + + public int Perception { get; set; } + + public bool Spellcasting { get; set; } + + public int AdditionalTrainedSkills { get; set; } + + public virtual ICollection ClassKeyAbilities { get; set; } = new List(); + + public virtual ICollection ClassProgressions { get; set; } = new List(); + + public virtual ICollection ClassTrainings { get; set; } = new List(); +} diff --git a/Pf2eDataScrapper/Model/ClassKeyAbility.cs b/Pf2eDataScrapper/Model/ClassKeyAbility.cs new file mode 100644 index 0000000..7398077 --- /dev/null +++ b/Pf2eDataScrapper/Model/ClassKeyAbility.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class ClassKeyAbility +{ + public int Id { get; set; } + + public int ClassId { get; set; } + + public string Value { get; set; } = null!; + + public virtual Class Class { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/ClassProgression.cs b/Pf2eDataScrapper/Model/ClassProgression.cs new file mode 100644 index 0000000..060e54d --- /dev/null +++ b/Pf2eDataScrapper/Model/ClassProgression.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class ClassProgression +{ + public int Id { get; set; } + + public int ClassId { get; set; } + + public int Level { get; set; } + + public int? EntityId { get; set; } + + public virtual Class Class { get; set; } = null!; + + public virtual Entity? Entity { get; set; } +} diff --git a/Pf2eDataScrapper/Model/ClassTraining.cs b/Pf2eDataScrapper/Model/ClassTraining.cs new file mode 100644 index 0000000..48a9a92 --- /dev/null +++ b/Pf2eDataScrapper/Model/ClassTraining.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class ClassTraining +{ + public int Id { get; set; } + + public int ClassId { get; set; } + + public int? Item { get; set; } + + public string? Name { get; set; } + + public int Stage { get; set; } + + public virtual Class Class { get; set; } = null!; + + public virtual Training? ItemNavigation { get; set; } +} diff --git a/Pf2eDataScrapper/Model/Condition.cs b/Pf2eDataScrapper/Model/Condition.cs new file mode 100644 index 0000000..4f1fb73 --- /dev/null +++ b/Pf2eDataScrapper/Model/Condition.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class Condition +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Img { get; set; } = null!; + + public string Description { get; set; } = null!; + + public string? DescriptionGm { get; set; } + + public string Slug { get; set; } = null!; + + public bool? IsTranslated { get; set; } + + public bool? IsChecked { get; set; } + + public string? Extra { get; set; } +} diff --git a/Pf2eDataScrapper/Model/Deity.cs b/Pf2eDataScrapper/Model/Deity.cs new file mode 100644 index 0000000..fafb915 --- /dev/null +++ b/Pf2eDataScrapper/Model/Deity.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class Deity +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Img { get; set; } = null!; + + public string Description { get; set; } = null!; + + public string? DescriptionGm { get; set; } + + public string Slug { get; set; } = null!; + + public bool? IsTranslated { get; set; } + + public bool? IsChecked { get; set; } + + public bool SanctificationMust { get; set; } + + public virtual ICollection DeityAttributes { get; set; } = new List(); + + public virtual ICollection DeityDomains { get; set; } = new List(); + + public virtual ICollection DeitySpells { get; set; } = new List(); + + public virtual ICollection DeityWeapons { get; set; } = new List(); + + public virtual ICollection Skills { get; set; } = new List(); +} diff --git a/Pf2eDataScrapper/Model/DeityAttribute.cs b/Pf2eDataScrapper/Model/DeityAttribute.cs new file mode 100644 index 0000000..a8d9333 --- /dev/null +++ b/Pf2eDataScrapper/Model/DeityAttribute.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class DeityAttribute +{ + public int DeityId { get; set; } + + public string Attribute { get; set; } = null!; + + public virtual Deity Deity { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/DeityDomain.cs b/Pf2eDataScrapper/Model/DeityDomain.cs new file mode 100644 index 0000000..7ee1044 --- /dev/null +++ b/Pf2eDataScrapper/Model/DeityDomain.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class DeityDomain +{ + public int Id { get; set; } + + public int DeityId { get; set; } + + public bool IsPrimary { get; set; } + + public string Value { get; set; } = null!; + + public virtual Deity Deity { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/DeitySpell.cs b/Pf2eDataScrapper/Model/DeitySpell.cs new file mode 100644 index 0000000..3ed578e --- /dev/null +++ b/Pf2eDataScrapper/Model/DeitySpell.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class DeitySpell +{ + public int Id { get; set; } + + public int DeityId { get; set; } + + public int Level { get; set; } + + public int SpellId { get; set; } + + public virtual Deity Deity { get; set; } = null!; + + public virtual Spell Spell { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/DeityWeapon.cs b/Pf2eDataScrapper/Model/DeityWeapon.cs new file mode 100644 index 0000000..8a167d4 --- /dev/null +++ b/Pf2eDataScrapper/Model/DeityWeapon.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class DeityWeapon +{ + public int Id { get; set; } + + public int DeityId { get; set; } + + public string Weapon { get; set; } = null!; + + public virtual Deity Deity { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/Entity.cs b/Pf2eDataScrapper/Model/Entity.cs new file mode 100644 index 0000000..b29c06a --- /dev/null +++ b/Pf2eDataScrapper/Model/Entity.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class Entity +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Img { get; set; } = null!; + + public string Description { get; set; } = null!; + + public string? DescriptionGm { get; set; } + + public string Slug { get; set; } = null!; + + public bool? IsTranslated { get; set; } + + public bool? IsChecked { get; set; } + + public virtual ICollection AncestryItems { get; set; } = new List(); + + public virtual ICollection BackgroundItems { get; set; } = new List(); + + public virtual ICollection ClassProgressions { get; set; } = new List(); + + public virtual ICollection EntityAliases { get; set; } = new List(); + + public virtual ICollection EntityExternals { get; set; } = new List(); + + public virtual Frequency? Frequency { get; set; } + + public virtual ICollection Traits { get; set; } = new List(); +} diff --git a/Pf2eDataScrapper/Model/EntityAlias.cs b/Pf2eDataScrapper/Model/EntityAlias.cs new file mode 100644 index 0000000..191cf52 --- /dev/null +++ b/Pf2eDataScrapper/Model/EntityAlias.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class EntityAlias +{ + public int Id { get; set; } + + public int EntityId { get; set; } + + public string Alias { get; set; } = null!; + + public virtual Entity Entity { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/EntityExternal.cs b/Pf2eDataScrapper/Model/EntityExternal.cs new file mode 100644 index 0000000..ebaecb6 --- /dev/null +++ b/Pf2eDataScrapper/Model/EntityExternal.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class EntityExternal +{ + public int EntityId { get; set; } + + public int TargetId { get; set; } + + public string Path { get; set; } = null!; + + public string Suffix { get; set; } = null!; + + public string Md5 { get; set; } = null!; + + public virtual Entity Entity { get; set; } = null!; + + public virtual ExternalTarget Target { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/EntityKeyword.cs b/Pf2eDataScrapper/Model/EntityKeyword.cs new file mode 100644 index 0000000..9e3a67b --- /dev/null +++ b/Pf2eDataScrapper/Model/EntityKeyword.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class EntityKeyword +{ + public int EntityId { get; set; } + + public int KeywordId { get; set; } + + public virtual Entity Entity { get; set; } = null!; + + public virtual Keyword Keyword { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/EntitySource.cs b/Pf2eDataScrapper/Model/EntitySource.cs new file mode 100644 index 0000000..a4528da --- /dev/null +++ b/Pf2eDataScrapper/Model/EntitySource.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class EntitySource +{ + public int EntityId { get; set; } + + public int SourceId { get; set; } + + public string Suffix { get; set; } = null!; + + public bool IsRemaster { get; set; } + + public virtual Entity Entity { get; set; } = null!; + + public virtual Source Source { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/ExternalTarget.cs b/Pf2eDataScrapper/Model/ExternalTarget.cs new file mode 100644 index 0000000..99f8627 --- /dev/null +++ b/Pf2eDataScrapper/Model/ExternalTarget.cs @@ -0,0 +1,16 @@ +using Pf2eDataScrapper.Model; +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper; + +public partial class ExternalTarget +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Icon { get; set; } = null!; + + public virtual ICollection EntityExternals { get; set; } = new List(); +} diff --git a/Pf2eDataScrapper/Model/Feat.cs b/Pf2eDataScrapper/Model/Feat.cs new file mode 100644 index 0000000..899f0a9 --- /dev/null +++ b/Pf2eDataScrapper/Model/Feat.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper; + +public partial class Feat +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Img { get; set; } = null!; + + public string Description { get; set; } = null!; + + public string? DescriptionGm { get; set; } + + public string Slug { get; set; } = null!; + + public bool? IsTranslated { get; set; } + + public bool? IsChecked { get; set; } + + public int? Actions { get; set; } + + public int Level { get; set; } + + public int? LevelTaken { get; set; } + + public int? MaxTakable { get; set; } + + public string? Location { get; set; } + + public bool? OnlyLevel1 { get; set; } + + public string? Extra { get; set; } + + public virtual ICollection FeatPrerequisites { get; set; } = new List(); +} diff --git a/Pf2eDataScrapper/Model/FeatPrerequisite.cs b/Pf2eDataScrapper/Model/FeatPrerequisite.cs new file mode 100644 index 0000000..0dc9ecb --- /dev/null +++ b/Pf2eDataScrapper/Model/FeatPrerequisite.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper; + +public partial class FeatPrerequisite +{ + public int Id { get; set; } + + public int FeatId { get; set; } + + public string Value { get; set; } = null!; + + public virtual Feat Feat { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/Frequency.cs b/Pf2eDataScrapper/Model/Frequency.cs new file mode 100644 index 0000000..8199a40 --- /dev/null +++ b/Pf2eDataScrapper/Model/Frequency.cs @@ -0,0 +1,18 @@ +using Pf2eDataScrapper.Model; +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper; + +public partial class Frequency +{ + public int Id { get; set; } + + public int Max { get; set; } + + public int Per { get; set; } + + public int? Value { get; set; } + + public virtual Entity IdNavigation { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/Heritage.cs b/Pf2eDataScrapper/Model/Heritage.cs new file mode 100644 index 0000000..e902136 --- /dev/null +++ b/Pf2eDataScrapper/Model/Heritage.cs @@ -0,0 +1,28 @@ +using Pf2eDataScrapper.Model; +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper; + +public partial class Heritage +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Img { get; set; } = null!; + + public string Description { get; set; } = null!; + + public string? DescriptionGm { get; set; } + + public string Slug { get; set; } = null!; + + public bool? IsTranslated { get; set; } + + public bool? IsChecked { get; set; } + + public int? AncestryId { get; set; } + + public virtual Ancestry? Ancestry { get; set; } +} diff --git a/Pf2eDataScrapper/Model/Keyword.cs b/Pf2eDataScrapper/Model/Keyword.cs new file mode 100644 index 0000000..04500f1 --- /dev/null +++ b/Pf2eDataScrapper/Model/Keyword.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper; + +public partial class Keyword +{ + public int Id { get; set; } + + public string Slug { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/KeywordAlias.cs b/Pf2eDataScrapper/Model/KeywordAlias.cs new file mode 100644 index 0000000..141c4a1 --- /dev/null +++ b/Pf2eDataScrapper/Model/KeywordAlias.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper; + +public partial class KeywordAlias +{ + public int KeywordId { get; set; } + + public string Value { get; set; } = null!; + + public virtual Keyword Keyword { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/Language.cs b/Pf2eDataScrapper/Model/Language.cs new file mode 100644 index 0000000..3d331cb --- /dev/null +++ b/Pf2eDataScrapper/Model/Language.cs @@ -0,0 +1,14 @@ +using Pf2eDataScrapper.Model; +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper; + +public partial class Language +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public virtual ICollection AncestryLanguages { get; set; } = new List(); +} diff --git a/Pf2eDataScrapper/Model/Source.cs b/Pf2eDataScrapper/Model/Source.cs new file mode 100644 index 0000000..afadce5 --- /dev/null +++ b/Pf2eDataScrapper/Model/Source.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class Source +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Url { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/Spell.cs b/Pf2eDataScrapper/Model/Spell.cs new file mode 100644 index 0000000..9867327 --- /dev/null +++ b/Pf2eDataScrapper/Model/Spell.cs @@ -0,0 +1,53 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class Spell +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Img { get; set; } = null!; + + public string Description { get; set; } = null!; + + public string? DescriptionGm { get; set; } + + public string Slug { get; set; } = null!; + + public bool? IsTranslated { get; set; } + + public bool? IsChecked { get; set; } + + public int Level { get; set; } + + public int Cost { get; set; } + + public bool Counteraction { get; set; } + + public bool Sustained { get; set; } + + public string Duration { get; set; } = null!; + + public string Range { get; set; } = null!; + + public string Requirements { get; set; } = null!; + + public string Target { get; set; } = null!; + + public string Time { get; set; } = null!; + + public bool CanHeightening { get; set; } + + public virtual ICollection DeitySpells { get; set; } = new List(); + + public virtual SpellArea? SpellArea { get; set; } + + public virtual ICollection SpellDamages { get; set; } = new List(); + + public virtual ICollection SpellDefenses { get; set; } = new List(); + + public virtual SpellRitual? SpellRitual { get; set; } +} diff --git a/Pf2eDataScrapper/Model/SpellArea.cs b/Pf2eDataScrapper/Model/SpellArea.cs new file mode 100644 index 0000000..8a11f36 --- /dev/null +++ b/Pf2eDataScrapper/Model/SpellArea.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class SpellArea +{ + public int SpellId { get; set; } + + public string? Details { get; set; } + + public int Value { get; set; } + + public virtual Spell Spell { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/SpellDamage.cs b/Pf2eDataScrapper/Model/SpellDamage.cs new file mode 100644 index 0000000..0f18c02 --- /dev/null +++ b/Pf2eDataScrapper/Model/SpellDamage.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class SpellDamage +{ + public int Id { get; set; } + + public int SpellId { get; set; } + + public string Key { get; set; } = null!; + + public bool? ApplyMod { get; set; } + + public string Formula { get; set; } = null!; + + public string? Materials { get; set; } + + public string Type { get; set; } = null!; + + public virtual Spell Spell { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/SpellDefense.cs b/Pf2eDataScrapper/Model/SpellDefense.cs new file mode 100644 index 0000000..d46695a --- /dev/null +++ b/Pf2eDataScrapper/Model/SpellDefense.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class SpellDefense +{ + public int Id { get; set; } + + public int SpellId { get; set; } + + public bool IsPassive { get; set; } + + public bool? IsBasic { get; set; } + + public string Statistic { get; set; } = null!; + + public virtual Spell Spell { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/SpellRitual.cs b/Pf2eDataScrapper/Model/SpellRitual.cs new file mode 100644 index 0000000..36cb21a --- /dev/null +++ b/Pf2eDataScrapper/Model/SpellRitual.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class SpellRitual +{ + public int SpellId { get; set; } + + public string PrimaryCheck { get; set; } = null!; + + public int SecondaryCasters { get; set; } + + public string SecondaryChecks { get; set; } = null!; + + public virtual Spell Spell { get; set; } = null!; +} diff --git a/Pf2eDataScrapper/Model/Training.cs b/Pf2eDataScrapper/Model/Training.cs new file mode 100644 index 0000000..aa2672d --- /dev/null +++ b/Pf2eDataScrapper/Model/Training.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class Training +{ + public int Id { get; set; } + + public string Key { get; set; } = null!; + + public virtual ICollection ClassTrainings { get; set; } = new List(); + + public virtual ICollection Deities { get; set; } = new List(); +} diff --git a/Pf2eDataScrapper/Model/Trait.cs b/Pf2eDataScrapper/Model/Trait.cs new file mode 100644 index 0000000..7476923 --- /dev/null +++ b/Pf2eDataScrapper/Model/Trait.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace Pf2eDataScrapper.Model; + +public partial class Trait +{ + public int Id { get; set; } + + public string Name { get; set; } = null!; + + public string Description { get; set; } = null!; + + public virtual ICollection Entities { get; set; } = new List(); +} diff --git a/Pf2eDataScrapper/Pf2eDataScrapper.csproj b/Pf2eDataScrapper/Pf2eDataScrapper.csproj index a35f64e..929a96b 100644 --- a/Pf2eDataScrapper/Pf2eDataScrapper.csproj +++ b/Pf2eDataScrapper/Pf2eDataScrapper.csproj @@ -12,14 +12,22 @@ + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + Always - + Always diff --git a/Pf2eDataScrapper/Pf2eDatabase.cs b/Pf2eDataScrapper/Pf2eDatabase.cs new file mode 100644 index 0000000..d0d3d03 --- /dev/null +++ b/Pf2eDataScrapper/Pf2eDatabase.cs @@ -0,0 +1,121 @@ +using Npgsql; +using System.Text.RegularExpressions; + +namespace Pf2eDataScrapper +{ + public partial class Pf2eDatabase + { + public NpgsqlConnection Connection; + + public readonly string Username; + public readonly string DatabaseName; + + + private Pf2eDatabase() + { + Username = UsernamePattern().Match(EnvSettings.DatabaseConnection).Groups[1].Value; + DatabaseName = DatabaseNamePattern().Match(EnvSettings.DatabaseConnection).Groups[1].Value; + + Connection = new NpgsqlConnection(EnvSettings.DatabaseConnection); + Connection.Open(); + } + + ~Pf2eDatabase() + { + Connection.Close(); + } + + public static Pf2eDatabase Instance { get; } = new(); + + public NpgsqlTransaction? Transaction { get; private set; } + + public void StartTransaction() + { + if (Transaction != null) + { + throw new InvalidOperationException("Transaction already started."); + } + + Transaction = Connection.BeginTransaction(); + } + + public void Commit() + { + if (Transaction == null) + { + throw new InvalidOperationException("No transaction started."); + } + + Transaction.Commit(); + } + + public void ExecuteCommand(string sql) + { + var command = GetCommand(sql); + + command.ExecuteNonQuery(); + } + + public NpgsqlCommand GetCommand(string sql) + { + return new NpgsqlCommand(sql, Connection); + } + + + /* + public void RebuildDatabase() + { + // Закрываем текущее соединение + Connection.Close(); + + // Получение имён + var databaseNamePattern = DatabaseNamePattern(); + var userConnection = databaseNamePattern.Replace(EnvSettings.DatabaseConnection, ";"); + var databaseName = databaseNamePattern.Match(EnvSettings.DatabaseConnection).Groups[1].Value; + var username = UserNamePattern().Match(EnvSettings.DatabaseConnection).Groups[1].Value; + + // Временное подключение к базе данных + NpgsqlConnection tmpConnection = new(userConnection); + tmpConnection.Open(); + + // Удаляем базу данных + NpgsqlCommand dropCommand = new($"DROP DATABASE \"{databaseName}\";", tmpConnection); + dropCommand.ExecuteNonQuery(); + + // Создаём новую базу данных + NpgsqlCommand createCommand = new($@" + CREATE DATABASE {databaseName} + WITH OWNER = {username} + ENCODING = 'UTF8' + CONNECTION LIMIT = -1; + ", tmpConnection); + createCommand.ExecuteNonQuery(); + + string[] permissionCommands = [ + $"GRANT TEMPORARY, CONNECT ON DATABASE {databaseName} TO PUBLIC;", + $"GRANT ALL ON DATABASE {databaseName} TO {username} WITH GRANT OPTION;", + $"GRANT ALL ON DATABASE {databaseName} TO postgres;" + ]; + + foreach (var command in permissionCommands) + { + NpgsqlCommand permissionCommand = new(command, tmpConnection); + permissionCommand.ExecuteNonQuery(); + } + + // Закрываем временное соединение + tmpConnection.Close(); + + // Заново создаём соединение + Connection = new NpgsqlConnection(EnvSettings.DatabaseConnection); + } + + */ + + [GeneratedRegex(@"(?:^|;)Database=(.*?)(?:$|;)")] + private static partial Regex DatabaseNamePattern(); + + [GeneratedRegex(@"(?:^|;)User=(.*?)(?:$|;)")] + private static partial Regex UsernamePattern(); + } +} diff --git a/Pf2eDataScrapper/Pf2eTestContext.cs b/Pf2eDataScrapper/Pf2eTestContext.cs new file mode 100644 index 0000000..c92a146 --- /dev/null +++ b/Pf2eDataScrapper/Pf2eTestContext.cs @@ -0,0 +1,1102 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore; +using Pf2eDataScrapper.Model; + +namespace Pf2eDataScrapper; + +public partial class Pf2eTestContext : DbContext +{ + public Pf2eTestContext() + { + } + + public Pf2eTestContext(DbContextOptions options) + : base(options) + { + } + + public virtual DbSet Actions { get; set; } + + public virtual DbSet Ancestries { get; set; } + + public virtual DbSet AncestryBoosts { get; set; } + + public virtual DbSet AncestryItems { get; set; } + + public virtual DbSet AncestryLanguages { get; set; } + + public virtual DbSet Backgrounds { get; set; } + + public virtual DbSet BackgroundBoosts { get; set; } + + public virtual DbSet BackgroundItems { get; set; } + + public virtual DbSet BackgroundSkills { get; set; } + + public virtual DbSet CampaignFeatures { get; set; } + + public virtual DbSet Classes { get; set; } + + public virtual DbSet ClassKeyAbilities { get; set; } + + public virtual DbSet ClassProgressions { get; set; } + + public virtual DbSet ClassTrainings { get; set; } + + public virtual DbSet Conditions { get; set; } + + public virtual DbSet Deities { get; set; } + + public virtual DbSet DeityAttributes { get; set; } + + public virtual DbSet DeityDomains { get; set; } + + public virtual DbSet DeitySpells { get; set; } + + public virtual DbSet DeityWeapons { get; set; } + + public virtual DbSet Entities { get; set; } + + public virtual DbSet EntityAliases { get; set; } + + public virtual DbSet EntityExternals { get; set; } + + public virtual DbSet EntityKeywords { get; set; } + + public virtual DbSet EntitySources { get; set; } + + public virtual DbSet ExternalTargets { get; set; } + + public virtual DbSet Feats { get; set; } + + public virtual DbSet FeatPrerequisites { get; set; } + + public virtual DbSet Frequencies { get; set; } + + public virtual DbSet Heritages { get; set; } + + public virtual DbSet Keywords { get; set; } + + public virtual DbSet KeywordAliases { get; set; } + + public virtual DbSet Languages { get; set; } + + public virtual DbSet Sources { get; set; } + + public virtual DbSet Spells { get; set; } + + public virtual DbSet SpellAreas { get; set; } + + public virtual DbSet SpellDamages { get; set; } + + public virtual DbSet SpellDefenses { get; set; } + + public virtual DbSet SpellRituals { get; set; } + + public virtual DbSet Trainings { get; set; } + + public virtual DbSet Traits { get; set; } + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) => optionsBuilder.UseNpgsql(EnvSettings.DatabaseConnection); + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder + .HasPostgresEnum("action_category", new[] { "offensive", "defensive", "interaction", "familiar" }) + .HasPostgresEnum("action_type", new[] { "action", "free", "reaction", "passive" }) + .HasPostgresEnum("alias_type", new[] { "old", "english", "hobby" }) + .HasPostgresEnum("ancestry_vision", new[] { "normal", "low_light_vision", "darkvision" }) + .HasPostgresEnum("campaign_feature_category", new[] { "army_tactic", "army_war_action", "kingdom_activity", "kingdom_feat", "kingdom_feature" }) + .HasPostgresEnum("class_progression_type", new[] { "entity", "ancestry_feat", "class_feat", "general_feat", "skill_feat", "skill_increase" }) + .HasPostgresEnum("condition_group", new[] { "senses", "abilities", "death", "attitudes", "detection" }) + .HasPostgresEnum("deity_category", new[] { "deity", "pantheon", "covenant", "philosophy" }) + .HasPostgresEnum("deity_fonts", new[] { "none", "heal", "harm", "any" }) + .HasPostgresEnum("deity_sanctification", new[] { "holy", "unholy", "any" }) + .HasPostgresEnum("entity_rarity", new[] { "common", "uncommon", "rare", "unique" }) + .HasPostgresEnum("entity_type", new[] { "action", "ancestry", "background", "backpack", "campaign_feature", "class", "condition", "deity", "feat", "heritage", "spell" }) + .HasPostgresEnum("enum_size", new[] { "med", "lanuages", "system", "tiny" }) + .HasPostgresEnum("feat_category", new[] { "ancestryfeature", "classfeature", "calling", "class", "skill", "general", "ancestry", "bonus", "deityboon", "curse", "pfsboon" }) + .HasPostgresEnum("spell_area_type", new[] { "burst", "emanation", "cone", "line", "square", "cube", "cylinder" }) + .HasPostgresEnum("spell_damage_category", new[] { "persistent", "splash" }) + .HasPostgresEnum("spell_damage_kinds", new[] { "damage", "healing", "any" }) + .HasPostgresEnum("trait_type", new[] { "regular", "tradition" }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("action_pkey"); + + entity.ToTable("action"); + + entity.Property(e => e.Id) + .ValueGeneratedNever() + .HasColumnName("id"); + entity.Property(e => e.Actions).HasColumnName("actions"); + entity.Property(e => e.DeathNote).HasColumnName("death_note"); + entity.Property(e => e.Description).HasColumnName("description"); + entity.Property(e => e.DescriptionGm).HasColumnName("description_gm"); + entity.Property(e => e.Extra).HasColumnName("extra"); + entity.Property(e => e.Img) + .HasMaxLength(150) + .HasColumnName("img"); + entity.Property(e => e.IsChecked) + .HasDefaultValue(false) + .HasColumnName("is_checked"); + entity.Property(e => e.IsTranslated) + .HasDefaultValue(false) + .HasColumnName("is_translated"); + entity.Property(e => e.Name) + .HasMaxLength(150) + .HasColumnName("name"); + entity.Property(e => e.Slug) + .HasMaxLength(150) + .HasColumnName("slug"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("ancestry_pkey"); + + entity.ToTable("ancestry"); + + entity.Property(e => e.Id) + .ValueGeneratedNever() + .HasColumnName("id"); + entity.Property(e => e.Description).HasColumnName("description"); + entity.Property(e => e.DescriptionGm).HasColumnName("description_gm"); + entity.Property(e => e.Hp).HasColumnName("hp"); + entity.Property(e => e.Img) + .HasMaxLength(150) + .HasColumnName("img"); + entity.Property(e => e.IsChecked) + .HasDefaultValue(false) + .HasColumnName("is_checked"); + entity.Property(e => e.IsTranslated) + .HasDefaultValue(false) + .HasColumnName("is_translated"); + entity.Property(e => e.Name) + .HasMaxLength(150) + .HasColumnName("name"); + entity.Property(e => e.Reach).HasColumnName("reach"); + entity.Property(e => e.Slug) + .HasMaxLength(150) + .HasColumnName("slug"); + entity.Property(e => e.Speed).HasColumnName("speed"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("ancestry_boosts_pkey"); + + entity.ToTable("ancestry_boosts"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.AncestryId).HasColumnName("ancestry_id"); + entity.Property(e => e.Boost) + .HasDefaultValue(true) + .HasColumnName("boost"); + entity.Property(e => e.Value) + .HasMaxLength(3) + .HasColumnName("value"); + + entity.HasOne(d => d.Ancestry).WithMany(p => p.AncestryBoosts) + .HasForeignKey(d => d.AncestryId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("ancestry_boosts_ancestry_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.AncestryId, e.ItemId }).HasName("ancestry_items_pkey"); + + entity.ToTable("ancestry_items"); + + entity.Property(e => e.AncestryId).HasColumnName("ancestry_id"); + entity.Property(e => e.ItemId).HasColumnName("item_id"); + entity.Property(e => e.Level).HasColumnName("level"); + + entity.HasOne(d => d.Ancestry).WithMany(p => p.AncestryItems) + .HasForeignKey(d => d.AncestryId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("ancestry_items_ancestry_id_fkey"); + + entity.HasOne(d => d.Item).WithMany(p => p.AncestryItems) + .HasForeignKey(d => d.ItemId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("ancestry_items_item_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.AncestryId, e.LanguageId }).HasName("ancestry_languages_pkey"); + + entity.ToTable("ancestry_languages"); + + entity.Property(e => e.AncestryId).HasColumnName("ancestry_id"); + entity.Property(e => e.LanguageId).HasColumnName("language_id"); + entity.Property(e => e.IsAdditional).HasColumnName("is_additional"); + + entity.HasOne(d => d.Ancestry).WithMany(p => p.AncestryLanguages) + .HasForeignKey(d => d.AncestryId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("ancestry_languages_ancestry_id_fkey"); + + entity.HasOne(d => d.Language).WithMany(p => p.AncestryLanguages) + .HasForeignKey(d => d.LanguageId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("ancestry_languages_language_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("background_pkey"); + + entity.ToTable("background"); + + entity.Property(e => e.Id) + .ValueGeneratedNever() + .HasColumnName("id"); + entity.Property(e => e.Description).HasColumnName("description"); + entity.Property(e => e.DescriptionGm).HasColumnName("description_gm"); + entity.Property(e => e.Img) + .HasMaxLength(150) + .HasColumnName("img"); + entity.Property(e => e.IsChecked) + .HasDefaultValue(false) + .HasColumnName("is_checked"); + entity.Property(e => e.IsTranslated) + .HasDefaultValue(false) + .HasColumnName("is_translated"); + entity.Property(e => e.Name) + .HasMaxLength(150) + .HasColumnName("name"); + entity.Property(e => e.Slug) + .HasMaxLength(150) + .HasColumnName("slug"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("background_boosts_pkey"); + + entity.ToTable("background_boosts"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.BackgroundId).HasColumnName("background_id"); + entity.Property(e => e.Value) + .HasMaxLength(3) + .HasColumnName("value"); + + entity.HasOne(d => d.Background).WithMany(p => p.BackgroundBoosts) + .HasForeignKey(d => d.BackgroundId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("background_boosts_background_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.BackgroundId, e.EntityId }).HasName("background_items_pkey"); + + entity.ToTable("background_items"); + + entity.Property(e => e.BackgroundId).HasColumnName("background_id"); + entity.Property(e => e.EntityId).HasColumnName("entity_id"); + entity.Property(e => e.Level).HasColumnName("level"); + + entity.HasOne(d => d.Background).WithMany(p => p.BackgroundItems) + .HasForeignKey(d => d.BackgroundId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("background_items_background_id_fkey"); + + entity.HasOne(d => d.Entity).WithMany(p => p.BackgroundItems) + .HasForeignKey(d => d.EntityId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("background_items_entity_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("background_skills_pkey"); + + entity.ToTable("background_skills"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.BackgroundId).HasColumnName("background_id"); + entity.Property(e => e.IsSkill).HasColumnName("is_skill"); + entity.Property(e => e.Name) + .HasColumnType("character varying") + .HasColumnName("name"); + + entity.HasOne(d => d.Background).WithMany(p => p.BackgroundSkills) + .HasForeignKey(d => d.BackgroundId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("background_skills_background_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("campaign_feature_pkey"); + + entity.ToTable("campaign_feature"); + + entity.Property(e => e.Id) + .ValueGeneratedNever() + .HasColumnName("id"); + entity.Property(e => e.Actions).HasColumnName("actions"); + entity.Property(e => e.Description).HasColumnName("description"); + entity.Property(e => e.DescriptionGm).HasColumnName("description_gm"); + entity.Property(e => e.Extra).HasColumnName("extra"); + entity.Property(e => e.Img) + .HasMaxLength(150) + .HasColumnName("img"); + entity.Property(e => e.IsChecked) + .HasDefaultValue(false) + .HasColumnName("is_checked"); + entity.Property(e => e.IsTranslated) + .HasDefaultValue(false) + .HasColumnName("is_translated"); + entity.Property(e => e.Level).HasColumnName("level"); + entity.Property(e => e.Name) + .HasMaxLength(150) + .HasColumnName("name"); + entity.Property(e => e.Prerequisites) + .HasColumnType("character varying") + .HasColumnName("prerequisites"); + entity.Property(e => e.Slug) + .HasMaxLength(150) + .HasColumnName("slug"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("class_pkey"); + + entity.ToTable("class"); + + entity.Property(e => e.Id) + .ValueGeneratedNever() + .HasColumnName("id"); + entity.Property(e => e.AdditionalTrainedSkills).HasColumnName("additionalTrainedSkills"); + entity.Property(e => e.Description).HasColumnName("description"); + entity.Property(e => e.DescriptionGm).HasColumnName("description_gm"); + entity.Property(e => e.Hp).HasColumnName("hp"); + entity.Property(e => e.Img) + .HasMaxLength(150) + .HasColumnName("img"); + entity.Property(e => e.IsChecked) + .HasDefaultValue(false) + .HasColumnName("is_checked"); + entity.Property(e => e.IsTranslated) + .HasDefaultValue(false) + .HasColumnName("is_translated"); + entity.Property(e => e.Name) + .HasMaxLength(150) + .HasColumnName("name"); + entity.Property(e => e.Perception).HasColumnName("perception"); + entity.Property(e => e.Slug) + .HasMaxLength(150) + .HasColumnName("slug"); + entity.Property(e => e.Spellcasting).HasColumnName("spellcasting"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("class_key_abilities_pkey"); + + entity.ToTable("class_key_abilities"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.ClassId).HasColumnName("class_id"); + entity.Property(e => e.Value) + .HasMaxLength(3) + .HasColumnName("value"); + + entity.HasOne(d => d.Class).WithMany(p => p.ClassKeyAbilities) + .HasForeignKey(d => d.ClassId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("class_key_abilities_class_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("class_progression_pkey"); + + entity.ToTable("class_progression"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.ClassId).HasColumnName("class_id"); + entity.Property(e => e.EntityId).HasColumnName("entity_id"); + entity.Property(e => e.Level).HasColumnName("level"); + + entity.HasOne(d => d.Class).WithMany(p => p.ClassProgressions) + .HasForeignKey(d => d.ClassId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("class_progression_class_id_fkey"); + + entity.HasOne(d => d.Entity).WithMany(p => p.ClassProgressions) + .HasForeignKey(d => d.EntityId) + .HasConstraintName("class_progression_entity_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("class_trainings_pkey"); + + entity.ToTable("class_trainings"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.ClassId).HasColumnName("class_id"); + entity.Property(e => e.Item).HasColumnName("item"); + entity.Property(e => e.Name) + .HasColumnType("character varying") + .HasColumnName("name"); + entity.Property(e => e.Stage).HasColumnName("stage"); + + entity.HasOne(d => d.Class).WithMany(p => p.ClassTrainings) + .HasForeignKey(d => d.ClassId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("class_trainings_class_id_fkey"); + + entity.HasOne(d => d.ItemNavigation).WithMany(p => p.ClassTrainings) + .HasForeignKey(d => d.Item) + .HasConstraintName("class_trainings_item_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("condition_pkey"); + + entity.ToTable("condition"); + + entity.Property(e => e.Id) + .ValueGeneratedNever() + .HasColumnName("id"); + entity.Property(e => e.Description).HasColumnName("description"); + entity.Property(e => e.DescriptionGm).HasColumnName("description_gm"); + entity.Property(e => e.Extra).HasColumnName("extra"); + entity.Property(e => e.Img) + .HasMaxLength(150) + .HasColumnName("img"); + entity.Property(e => e.IsChecked) + .HasDefaultValue(false) + .HasColumnName("is_checked"); + entity.Property(e => e.IsTranslated) + .HasDefaultValue(false) + .HasColumnName("is_translated"); + entity.Property(e => e.Name) + .HasMaxLength(150) + .HasColumnName("name"); + entity.Property(e => e.Slug) + .HasMaxLength(150) + .HasColumnName("slug"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("deity_pkey"); + + entity.ToTable("deity"); + + entity.Property(e => e.Id) + .ValueGeneratedNever() + .HasColumnName("id"); + entity.Property(e => e.Description).HasColumnName("description"); + entity.Property(e => e.DescriptionGm).HasColumnName("description_gm"); + entity.Property(e => e.Img) + .HasMaxLength(150) + .HasColumnName("img"); + entity.Property(e => e.IsChecked) + .HasDefaultValue(false) + .HasColumnName("is_checked"); + entity.Property(e => e.IsTranslated) + .HasDefaultValue(false) + .HasColumnName("is_translated"); + entity.Property(e => e.Name) + .HasMaxLength(150) + .HasColumnName("name"); + entity.Property(e => e.SanctificationMust).HasColumnName("sanctification_must"); + entity.Property(e => e.Slug) + .HasMaxLength(150) + .HasColumnName("slug"); + + entity.HasMany(d => d.Skills).WithMany(p => p.Deities) + .UsingEntity>( + "DeitySkill", + r => r.HasOne().WithMany() + .HasForeignKey("SkillId") + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("deity_skills_skill_id_fkey"), + l => l.HasOne().WithMany() + .HasForeignKey("DeityId") + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("deity_skills_deity_id_fkey"), + j => + { + j.HasKey("DeityId", "SkillId").HasName("deity_skills_pkey"); + j.ToTable("deity_skills"); + j.IndexerProperty("DeityId").HasColumnName("deity_id"); + j.IndexerProperty("SkillId").HasColumnName("skill_id"); + }); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.DeityId, e.Attribute }).HasName("deity_attributes_pkey"); + + entity.ToTable("deity_attributes"); + + entity.Property(e => e.DeityId).HasColumnName("deity_id"); + entity.Property(e => e.Attribute) + .HasMaxLength(3) + .HasColumnName("attribute"); + + entity.HasOne(d => d.Deity).WithMany(p => p.DeityAttributes) + .HasForeignKey(d => d.DeityId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("deity_attributes_deity_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("deity_domains_pkey"); + + entity.ToTable("deity_domains"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.DeityId).HasColumnName("deity_id"); + entity.Property(e => e.IsPrimary).HasColumnName("is_primary"); + entity.Property(e => e.Value) + .HasColumnType("character varying") + .HasColumnName("value"); + + entity.HasOne(d => d.Deity).WithMany(p => p.DeityDomains) + .HasForeignKey(d => d.DeityId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("deity_domains_deity_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("deity_spells_pkey"); + + entity.ToTable("deity_spells"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.DeityId).HasColumnName("deity_id"); + entity.Property(e => e.Level).HasColumnName("level"); + entity.Property(e => e.SpellId).HasColumnName("spell_id"); + + entity.HasOne(d => d.Deity).WithMany(p => p.DeitySpells) + .HasForeignKey(d => d.DeityId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("deity_spells_deity_id_fkey"); + + entity.HasOne(d => d.Spell).WithMany(p => p.DeitySpells) + .HasForeignKey(d => d.SpellId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("deity_spells_spell_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("deity_weapons_pkey"); + + entity.ToTable("deity_weapons"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.DeityId).HasColumnName("deity_id"); + entity.Property(e => e.Weapon) + .HasColumnType("character varying") + .HasColumnName("weapon"); + + entity.HasOne(d => d.Deity).WithMany(p => p.DeityWeapons) + .HasForeignKey(d => d.DeityId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("deity_weapons_deity_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("entity_pkey"); + + entity.ToTable("entity"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Description).HasColumnName("description"); + entity.Property(e => e.DescriptionGm).HasColumnName("description_gm"); + entity.Property(e => e.Img) + .HasMaxLength(150) + .HasColumnName("img"); + entity.Property(e => e.IsChecked) + .HasDefaultValue(false) + .HasColumnName("is_checked"); + entity.Property(e => e.IsTranslated) + .HasDefaultValue(false) + .HasColumnName("is_translated"); + entity.Property(e => e.Name) + .HasMaxLength(150) + .HasColumnName("name"); + entity.Property(e => e.Slug) + .HasMaxLength(150) + .HasColumnName("slug"); + + entity.HasMany(d => d.Traits).WithMany(p => p.Entities) + .UsingEntity>( + "EntityTrait", + r => r.HasOne().WithMany() + .HasForeignKey("TraitId") + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("entity_traits_trait_id_fkey"), + l => l.HasOne().WithMany() + .HasForeignKey("EntityId") + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("entity_traits_entity_id_fkey"), + j => + { + j.HasKey("EntityId", "TraitId").HasName("entity_traits_pkey"); + j.ToTable("entity_traits"); + j.IndexerProperty("EntityId").HasColumnName("entity_id"); + j.IndexerProperty("TraitId").HasColumnName("trait_id"); + }); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("entity_aliases_pkey"); + + entity.ToTable("entity_aliases"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Alias) + .HasColumnType("character varying") + .HasColumnName("alias"); + entity.Property(e => e.EntityId).HasColumnName("entity_id"); + + entity.HasOne(d => d.Entity).WithMany(p => p.EntityAliases) + .HasForeignKey(d => d.EntityId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("entity_aliases_entity_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.EntityId, e.TargetId }).HasName("entity_external_pkey"); + + entity.ToTable("entity_external"); + + entity.Property(e => e.EntityId).HasColumnName("entity_id"); + entity.Property(e => e.TargetId).HasColumnName("target_id"); + entity.Property(e => e.Md5) + .HasColumnType("character varying") + .HasColumnName("md5"); + entity.Property(e => e.Path) + .HasColumnType("character varying") + .HasColumnName("path"); + entity.Property(e => e.Suffix) + .HasDefaultValueSql("''::character varying") + .HasColumnType("character varying") + .HasColumnName("suffix"); + + entity.HasOne(d => d.Entity).WithMany(p => p.EntityExternals) + .HasForeignKey(d => d.EntityId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("entity_external_entity_id_fkey"); + + entity.HasOne(d => d.Target).WithMany(p => p.EntityExternals) + .HasForeignKey(d => d.TargetId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("entity_external_target_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity + .HasNoKey() + .ToTable("entity_keywords"); + + entity.Property(e => e.EntityId).HasColumnName("entity_id"); + entity.Property(e => e.KeywordId).HasColumnName("keyword_id"); + + entity.HasOne(d => d.Entity).WithMany() + .HasForeignKey(d => d.EntityId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("entity_keywords_entity_id_fkey"); + + entity.HasOne(d => d.Keyword).WithMany() + .HasForeignKey(d => d.KeywordId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("entity_keywords_keyword_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity + .HasNoKey() + .ToTable("entity_sources"); + + entity.Property(e => e.EntityId).HasColumnName("entity_id"); + entity.Property(e => e.IsRemaster).HasColumnName("is_remaster"); + entity.Property(e => e.SourceId).HasColumnName("source_id"); + entity.Property(e => e.Suffix) + .HasDefaultValueSql("''::character varying") + .HasColumnType("character varying") + .HasColumnName("suffix"); + + entity.HasOne(d => d.Entity).WithMany() + .HasForeignKey(d => d.EntityId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("entity_sources_entity_id_fkey"); + + entity.HasOne(d => d.Source).WithMany() + .HasForeignKey(d => d.SourceId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("entity_sources_source_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("external_target_pkey"); + + entity.ToTable("external_target"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Icon) + .HasColumnType("character varying") + .HasColumnName("icon"); + entity.Property(e => e.Name) + .HasColumnType("character varying") + .HasColumnName("name"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("feat_pkey"); + + entity.ToTable("feat"); + + entity.Property(e => e.Id) + .ValueGeneratedNever() + .HasColumnName("id"); + entity.Property(e => e.Actions).HasColumnName("actions"); + entity.Property(e => e.Description).HasColumnName("description"); + entity.Property(e => e.DescriptionGm).HasColumnName("description_gm"); + entity.Property(e => e.Extra).HasColumnName("extra"); + entity.Property(e => e.Img) + .HasMaxLength(150) + .HasColumnName("img"); + entity.Property(e => e.IsChecked) + .HasDefaultValue(false) + .HasColumnName("is_checked"); + entity.Property(e => e.IsTranslated) + .HasDefaultValue(false) + .HasColumnName("is_translated"); + entity.Property(e => e.Level).HasColumnName("level"); + entity.Property(e => e.LevelTaken).HasColumnName("level_taken"); + entity.Property(e => e.Location) + .HasMaxLength(12) + .HasColumnName("location"); + entity.Property(e => e.MaxTakable).HasColumnName("max_takable"); + entity.Property(e => e.Name) + .HasMaxLength(150) + .HasColumnName("name"); + entity.Property(e => e.OnlyLevel1).HasColumnName("only_level_1"); + entity.Property(e => e.Slug) + .HasMaxLength(150) + .HasColumnName("slug"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("feat_prerequisites_pkey"); + + entity.ToTable("feat_prerequisites"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.FeatId).HasColumnName("feat_id"); + entity.Property(e => e.Value) + .HasColumnType("character varying") + .HasColumnName("value"); + + entity.HasOne(d => d.Feat).WithMany(p => p.FeatPrerequisites) + .HasForeignKey(d => d.FeatId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("feat_prerequisites_feat_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("frequency_pkey"); + + entity.ToTable("frequency"); + + entity.Property(e => e.Id) + .ValueGeneratedNever() + .HasColumnName("id"); + entity.Property(e => e.Max).HasColumnName("max"); + entity.Property(e => e.Per).HasColumnName("per"); + entity.Property(e => e.Value).HasColumnName("value"); + + entity.HasOne(d => d.IdNavigation).WithOne(p => p.Frequency) + .HasForeignKey(d => d.Id) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("frequency_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("heritage_pkey"); + + entity.ToTable("heritage"); + + entity.Property(e => e.Id) + .ValueGeneratedNever() + .HasColumnName("id"); + entity.Property(e => e.AncestryId).HasColumnName("ancestry_id"); + entity.Property(e => e.Description).HasColumnName("description"); + entity.Property(e => e.DescriptionGm).HasColumnName("description_gm"); + entity.Property(e => e.Img) + .HasMaxLength(150) + .HasColumnName("img"); + entity.Property(e => e.IsChecked) + .HasDefaultValue(false) + .HasColumnName("is_checked"); + entity.Property(e => e.IsTranslated) + .HasDefaultValue(false) + .HasColumnName("is_translated"); + entity.Property(e => e.Name) + .HasMaxLength(150) + .HasColumnName("name"); + entity.Property(e => e.Slug) + .HasMaxLength(150) + .HasColumnName("slug"); + + entity.HasOne(d => d.Ancestry).WithMany(p => p.Heritages) + .HasForeignKey(d => d.AncestryId) + .HasConstraintName("heritage_ancestry_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("keyword_pkey"); + + entity.ToTable("keyword"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Slug) + .HasMaxLength(50) + .HasColumnName("slug"); + }); + + modelBuilder.Entity(entity => + { + entity + .HasNoKey() + .ToTable("keyword_aliases"); + + entity.Property(e => e.KeywordId).HasColumnName("keyword_id"); + entity.Property(e => e.Value) + .HasColumnType("character varying") + .HasColumnName("value"); + + entity.HasOne(d => d.Keyword).WithMany() + .HasForeignKey(d => d.KeywordId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("keyword_aliases_keyword_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("language_pkey"); + + entity.ToTable("language"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Name) + .HasColumnType("character varying") + .HasColumnName("name"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("source_pkey"); + + entity.ToTable("source"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Name) + .HasColumnType("character varying") + .HasColumnName("name"); + entity.Property(e => e.Url) + .HasColumnType("character varying") + .HasColumnName("url"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("spell_pkey"); + + entity.ToTable("spell"); + + entity.Property(e => e.Id) + .ValueGeneratedNever() + .HasColumnName("id"); + entity.Property(e => e.CanHeightening).HasColumnName("can_heightening"); + entity.Property(e => e.Cost).HasColumnName("cost"); + entity.Property(e => e.Counteraction).HasColumnName("counteraction"); + entity.Property(e => e.Description).HasColumnName("description"); + entity.Property(e => e.DescriptionGm).HasColumnName("description_gm"); + entity.Property(e => e.Duration) + .HasColumnType("character varying") + .HasColumnName("duration"); + entity.Property(e => e.Img) + .HasMaxLength(150) + .HasColumnName("img"); + entity.Property(e => e.IsChecked) + .HasDefaultValue(false) + .HasColumnName("is_checked"); + entity.Property(e => e.IsTranslated) + .HasDefaultValue(false) + .HasColumnName("is_translated"); + entity.Property(e => e.Level).HasColumnName("level"); + entity.Property(e => e.Name) + .HasMaxLength(150) + .HasColumnName("name"); + entity.Property(e => e.Range) + .HasColumnType("character varying") + .HasColumnName("range"); + entity.Property(e => e.Requirements) + .HasColumnType("character varying") + .HasColumnName("requirements"); + entity.Property(e => e.Slug) + .HasMaxLength(150) + .HasColumnName("slug"); + entity.Property(e => e.Sustained).HasColumnName("sustained"); + entity.Property(e => e.Target) + .HasColumnType("character varying") + .HasColumnName("target"); + entity.Property(e => e.Time) + .HasColumnType("character varying") + .HasColumnName("time"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.SpellId).HasName("spell_area_pkey"); + + entity.ToTable("spell_area"); + + entity.Property(e => e.SpellId) + .ValueGeneratedNever() + .HasColumnName("spell_id"); + entity.Property(e => e.Details) + .HasColumnType("character varying") + .HasColumnName("details"); + entity.Property(e => e.Value).HasColumnName("value"); + + entity.HasOne(d => d.Spell).WithOne(p => p.SpellArea) + .HasForeignKey(d => d.SpellId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("spell_area_spell_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("spell_damage_pkey"); + + entity.ToTable("spell_damage"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.ApplyMod).HasColumnName("apply_mod"); + entity.Property(e => e.Formula) + .HasColumnType("character varying") + .HasColumnName("formula"); + entity.Property(e => e.Key) + .HasColumnType("character varying") + .HasColumnName("key"); + entity.Property(e => e.Materials) + .HasColumnType("character varying") + .HasColumnName("materials"); + entity.Property(e => e.SpellId).HasColumnName("spell_id"); + entity.Property(e => e.Type) + .HasColumnType("character varying") + .HasColumnName("type"); + + entity.HasOne(d => d.Spell).WithMany(p => p.SpellDamages) + .HasForeignKey(d => d.SpellId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("spell_damage_spell_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("spell_defense_pkey"); + + entity.ToTable("spell_defense"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.IsBasic).HasColumnName("is_basic"); + entity.Property(e => e.IsPassive).HasColumnName("is_passive"); + entity.Property(e => e.SpellId).HasColumnName("spell_id"); + entity.Property(e => e.Statistic) + .HasColumnType("character varying") + .HasColumnName("statistic"); + + entity.HasOne(d => d.Spell).WithMany(p => p.SpellDefenses) + .HasForeignKey(d => d.SpellId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("spell_defense_spell_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.SpellId).HasName("spell_ritual_pkey"); + + entity.ToTable("spell_ritual"); + + entity.Property(e => e.SpellId) + .ValueGeneratedNever() + .HasColumnName("spell_id"); + entity.Property(e => e.PrimaryCheck) + .HasColumnType("character varying") + .HasColumnName("primary_check"); + entity.Property(e => e.SecondaryCasters).HasColumnName("secondary_casters"); + entity.Property(e => e.SecondaryChecks) + .HasColumnType("character varying") + .HasColumnName("secondary_checks"); + + entity.HasOne(d => d.Spell).WithOne(p => p.SpellRitual) + .HasForeignKey(d => d.SpellId) + .OnDelete(DeleteBehavior.ClientSetNull) + .HasConstraintName("spell_ritual_spell_id_fkey"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("trainings_pkey"); + + entity.ToTable("trainings"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Key) + .HasColumnType("character varying") + .HasColumnName("key"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => e.Id).HasName("trait_pkey"); + + entity.ToTable("trait"); + + entity.Property(e => e.Id).HasColumnName("id"); + entity.Property(e => e.Description).HasColumnName("description"); + entity.Property(e => e.Name) + .HasColumnType("character varying") + .HasColumnName("name"); + }); + + OnModelCreatingPartial(modelBuilder); + } + + partial void OnModelCreatingPartial(ModelBuilder modelBuilder); +} diff --git a/dbml/schema.sql b/Pf2eDataScrapper/schema.pgsql similarity index 88% rename from dbml/schema.sql rename to Pf2eDataScrapper/schema.pgsql index c6a110a..fb0f38f 100644 --- a/dbml/schema.sql +++ b/Pf2eDataScrapper/schema.pgsql @@ -1,4 +1,4 @@ --- Common Enums +-- Common Enums CREATE TYPE "enum_size" AS ENUM ( 'med', 'lanuages', @@ -65,7 +65,7 @@ ALTER TABLE "entity_aliases" ADD FOREIGN KEY ("entity_id") REFERENCES "entity" ( -- Keywords CREATE TABLE "keyword" ( - "id" INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY + "id" INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, "slug" varchar(50) NOT NULL ); @@ -199,7 +199,7 @@ CREATE TYPE "spell_damage_kinds" AS ENUM ( ); CREATE TABLE "spell" ( - "id" int PRIMARY KEY, + -- "id" int PRIMARY KEY, "level" int NOT NULL, "cost" int NOT NULL, "counteraction" bool NOT NULL, @@ -209,9 +209,10 @@ CREATE TABLE "spell" ( "requirements" varchar NOT NULL, "target" varchar NOT NULL, "time" varchar NOT NULL, - "can_heightening" bool NOT NULL + "can_heightening" bool NOT NULL, + PRIMARY KEY ("id") ) INHERITS ("entity"); -ALTER TABLE "spell" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); +-- ALTER TABLE "spell" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); CREATE TABLE "spell_area" ( "spell_id" int PRIMARY KEY, @@ -273,27 +274,29 @@ CREATE TYPE "ancestry_vision" AS ENUM ( ); CREATE TABLE "action" ( - "id" int PRIMARY KEY, - "type" action_type NOT NULL, + -- "id" int PRIMARY KEY, + "action_type" action_type NOT NULL, "actions" int, "category" action_category, "death_note" bool, - "extra" text + "extra" text, + PRIMARY KEY ("id") ) INHERITS ("entity"); -ALTER TABLE "action" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); +-- ALTER TABLE "action" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); -- Ancestry CREATE TABLE "ancestry" ( - "id" int PRIMARY KEY, + -- "id" int PRIMARY KEY, "hp" int NOT NULL, "reach" int NOT NULL, "size" enum_size NOT NULL, "speed" int NOT NULL, - "vision" ancestry_vision NOT NULL + "vision" ancestry_vision NOT NULL, + PRIMARY KEY ("id") ) INHERITS ("entity"); -ALTER TABLE "ancestry" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); +-- ALTER TABLE "ancestry" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); CREATE TABLE "ancestry_languages" ( "ancestry_id" int, @@ -325,9 +328,10 @@ ALTER TABLE "ancestry_items" ADD FOREIGN KEY ("item_id") REFERENCES "entity" ("i -- Background CREATE TABLE "background" ( - "id" int PRIMARY KEY + -- "id" int PRIMARY KEY, + PRIMARY KEY ("id") ) INHERITS ("entity"); -ALTER TABLE "background" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); +-- ALTER TABLE "background" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); CREATE TABLE "background_items" ( "background_id" int, @@ -365,15 +369,16 @@ CREATE TYPE "campaign_feature_category" AS ENUM ( ); CREATE TABLE "campaign_feature" ( - "id" int PRIMARY KEY, + -- "id" int PRIMARY KEY, "level" int, - "type" action_type NOT NULL, + "action_type" action_type NOT NULL, "actions" int NOT NULL, "category" campaign_feature_category NOT NULL, "prerequisites" varchar, - "extra" text + "extra" text, + PRIMARY KEY ("id") ) INHERITS ("entity"); -ALTER TABLE "campaign_feature" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); +-- ALTER TABLE "campaign_feature" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); -- Class @@ -388,13 +393,14 @@ CREATE TYPE "class_progression_type" AS ENUM ( ); CREATE TABLE "class" ( - "id" int PRIMARY KEY, + -- "id" int PRIMARY KEY, "hp" int NOT NULL, "perception" int NOT NULL, "spellcasting" bool NOT NULL, - "additionalTrainedSkills" int NOT NULL + "additionalTrainedSkills" int NOT NULL, + PRIMARY KEY ("id") ) INHERITS ("entity"); -ALTER TABLE "class" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); +-- ALTER TABLE "class" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); CREATE TABLE "class_key_abilities" ( "id" INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, @@ -435,11 +441,12 @@ CREATE TYPE "condition_group" AS ENUM ( ); CREATE TABLE "condition" ( - "id" int PRIMARY KEY, + -- "id" int PRIMARY KEY, "group" condition_group, - "extra" text + "extra" text, + PRIMARY KEY ("id") ) INHERITS ("entity"); -ALTER TABLE "condition" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); +-- ALTER TABLE "condition" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); -- Deity @@ -463,13 +470,14 @@ CREATE TYPE "deity_sanctification" AS ENUM ( ); CREATE TABLE "deity" ( - "id" int PRIMARY KEY, + -- "id" int PRIMARY KEY, "category" deity_category NOT NULL, "font" deity_fonts NOT NULL, "sanctification_must" bool NOT NULL, - "sanctification_type" deity_sanctification NOT NULL + "sanctification_type" deity_sanctification NOT NULL, + PRIMARY KEY ("id") ) INHERITS ("entity"); -ALTER TABLE "deity" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); +-- ALTER TABLE "deity" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); CREATE TABLE "deity_attributes" ( "deity_id" int, @@ -513,12 +521,6 @@ ALTER TABLE "deity_domains" ADD FOREIGN KEY ("deity_id") REFERENCES "deity" ("id -- Feat -CREATE TYPE "feat_action_type" AS ENUM ( - 'passive', - 'action', - 'reaction', - 'free' -); CREATE TYPE "feat_category" AS ENUM ( 'ancestryfeature', 'classfeature', @@ -534,8 +536,8 @@ CREATE TYPE "feat_category" AS ENUM ( ); CREATE TABLE "feat" ( - "id" int PRIMARY KEY, - "action_type" feat_action_type NOT NULL, + -- "id" int PRIMARY KEY, + "action_type" action_type NOT NULL, "actions" int, "category" feat_category NOT NULL, "level" int NOT NULL, @@ -543,9 +545,10 @@ CREATE TABLE "feat" ( "max_takable" int, "location" varchar(12), "only_level_1" bool, - "extra" text + "extra" text, + PRIMARY KEY ("id") ) INHERITS ("entity"); -ALTER TABLE "feat" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); +-- ALTER TABLE "feat" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); CREATE TABLE "feat_prerequisites" ( "id" INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, @@ -558,8 +561,9 @@ ALTER TABLE "feat_prerequisites" ADD FOREIGN KEY ("feat_id") REFERENCES "feat" ( -- Heritage CREATE TABLE "heritage" ( - "id" int PRIMARY KEY, - "ancestry_id" int + -- "id" int PRIMARY KEY, + "ancestry_id" int, + PRIMARY KEY ("id") ) INHERITS ("entity"); -ALTER TABLE "heritage" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); +-- ALTER TABLE "heritage" ADD FOREIGN KEY ("id") REFERENCES "entity" ("id"); ALTER TABLE "heritage" ADD FOREIGN KEY ("ancestry_id") REFERENCES "ancestry" ("id"); diff --git a/Pf2eDataScrapper/test.json b/Pf2eDataScrapper/test.json deleted file mode 100644 index 62ba4be..0000000 --- a/Pf2eDataScrapper/test.json +++ /dev/null @@ -1,97 +0,0 @@ -{ - "_id": "fekYhQe1qrvwarBL", - "folder": "bGvA4p5QGO30eC0r", - "img": "systems/pf2e/icons/default-icons/hazard.svg", - "items": [ - { - "_id": "vsxjIPIKMzsQXXfM", - "img": "systems/pf2e/icons/actions/Reaction.webp", - "name": "Death Throes", - "sort": 0, - "system": { - "actionType": { - "value": "reaction" - }, - "actions": { - "value": null - }, - "category": null, - "description": { - "value": "

Trigger A creature touches the vampire's corpse

\n
\n

Effect A surge of void energy fills the room as the corpse lurches as though staked. The haunt deals @Damage[10d8[void]] damage to creatures within 30 feet of the corpse; this damage heals undead creatures for the same amount. Living creatures must attempt a @Check[will|dc:30|traits:damaging-effect] save.

\n
\n

Critical Success The creature is unaffected.

\n

Success The creature takes half damage and becomes @UUID[Compendium.pf2e.conditionitems.Item.Drained]{Drained 1}. This drained condition is reduced by 1 after 10 minutes.

\n

Failure The creature takes full damage and becomes drained 1.

\n

Critical Failure The creature takes double damage and is @UUID[Compendium.pf2e.conditionitems.Item.Drained]{Drained 2}.

" - }, - "publication": { - "license": "OGL", - "remaster": false, - "title": "" - }, - "rules": [], - "slug": null, - "traits": { - "rarity": "common", - "value": [] - } - }, - "type": "action" - } - ], - "name": "Benefactor's End", - "system": { - "attributes": { - "ac": { - "value": 0 - }, - "hardness": 0, - "hp": { - "details": "", - "max": 0, - "temp": 0, - "value": 0 - }, - "stealth": { - "details": "

(expert)

", - "value": 20 - } - }, - "creatureType": "", - "details": { - "description": "

A spectral assailant drives a stake into a dying vampire's heart; the vampire collapses and releases a surge of void energy.

", - "disable": "

@Check[religion|dc:28] (expert) to drain away the haunt's void energy

", - "isComplex": false, - "level": { - "value": 9 - }, - "publication": { - "license": "OGL", - "remaster": false, - "title": "Pathfinder #183: Field of Maidens" - }, - "reset": "

Unless disabled, the haunt materializes again on the next moonrise.

", - "routine": "" - }, - "saves": { - "fortitude": { - "saveDetail": "", - "value": 0 - }, - "reflex": { - "saveDetail": "", - "value": 0 - }, - "will": { - "saveDetail": "", - "value": 0 - } - }, - "statusEffects": [], - "traits": { - "rarity": "common", - "size": { - "value": "med" - }, - "value": [ - "haunt" - ] - } - }, - "type": "hazard" -}