diff --git a/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/Processors/Types/RuleProcessor.cs b/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/Processors/Types/RuleProcessor.cs new file mode 100644 index 0000000..5a5bf81 --- /dev/null +++ b/Pf2eDataScrapper/Importers/Implementations/Aonprd/DataBuilder/Processors/Types/RuleProcessor.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Newtonsoft.Json.Linq; +using Pf2eModel.Model.Enum; +using Pf2eModel.Model.Structure; + +namespace Pf2eDataScrapper.Importers.Implementations.Aonprd.DataBuilder.Processors.Types; + +[AonprdProcessor("rules")] +internal class RuleProcessor(AonprdProcessorInput input) : AbstractEntityProcessor(input) +{ + public override EntityType Type => EntityType.Rule; + + public override Rule Object { get; } = new(); + + public override void Add() => Context.Rules.Add(Object); + + public override void Process() + { + base.Process(); + + Object.Breadcrumbs = (Input.GetOptional("breadcrumbs") ?? []) + .Select(token => token.ToString()) + .ToArray(); + } +} diff --git a/Pf2eModel/Migrations/20250506175505_1.Designer.cs b/Pf2eModel/Migrations/20250507075826_1.Designer.cs similarity index 98% rename from Pf2eModel/Migrations/20250506175505_1.Designer.cs rename to Pf2eModel/Migrations/20250507075826_1.Designer.cs index 62f9c7e..ff6d8fb 100644 --- a/Pf2eModel/Migrations/20250506175505_1.Designer.cs +++ b/Pf2eModel/Migrations/20250507075826_1.Designer.cs @@ -13,7 +13,7 @@ using Pf2eModel.Model.Enum; namespace Pf2eModel.Migrations { [DbContext(typeof(Pf2eDbContext))] - [Migration("20250506175505_1")] + [Migration("20250507075826_1")] partial class _1 { /// @@ -34,7 +34,7 @@ namespace Pf2eModel.Migrations NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_fonts", new[] { "none", "heal", "harm", "any" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_sanctification", new[] { "holy", "unholy", "any" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "uncommon", "rare", "unique" }); - NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "subclass_group", "subclass", "condition", "deity", "feat", "heritage", "spell", "ritual", "language" }); + NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "subclass_group", "subclass", "condition", "deity", "feat", "heritage", "spell", "ritual", "language", "rule" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_action_type", new[] { "passive", "action", "reaction", "free" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "uncategorized", "ancestry-feature", "class-feature", "calling", "class", "skill", "general", "ancestry", "bonus", "deityboon", "curse", "pfsboon", "campaign-feature" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "legacy_english", "russian", "legacy", "hobby", "other" }); @@ -1395,6 +1395,24 @@ namespace Pf2eModel.Migrations b.ToTable("ritual_checks", (string)null); }); + modelBuilder.Entity("Pf2eModel.Model.Structure.Rule", b => + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id") + .HasColumnOrder(1); + + b.PrimitiveCollection("Breadcrumbs") + .IsRequired() + .HasColumnType("text[]") + .HasColumnName("breadcrumbs"); + + b.HasKey("Id") + .HasName("pk_rules"); + + b.ToTable("rules", (string)null); + }); + modelBuilder.Entity("Pf2eModel.Model.Structure.Spell", b => { b.Property("Id") @@ -2249,6 +2267,18 @@ namespace Pf2eModel.Migrations b.Navigation("Training"); }); + modelBuilder.Entity("Pf2eModel.Model.Structure.Rule", b => + { + b.HasOne("Pf2eModel.Model.Base.Entity", "Entity") + .WithOne() + .HasForeignKey("Pf2eModel.Model.Structure.Rule", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_rules_entities_id"); + + b.Navigation("Entity"); + }); + modelBuilder.Entity("Pf2eModel.Model.Structure.Spell", b => { b.HasOne("Pf2eModel.Model.Base.Entity", "Entity") diff --git a/Pf2eModel/Migrations/20250506175505_1.cs b/Pf2eModel/Migrations/20250507075826_1.cs similarity index 98% rename from Pf2eModel/Migrations/20250506175505_1.cs rename to Pf2eModel/Migrations/20250507075826_1.cs index f5785b7..5dc37f9 100644 --- a/Pf2eModel/Migrations/20250506175505_1.cs +++ b/Pf2eModel/Migrations/20250507075826_1.cs @@ -24,7 +24,7 @@ namespace Pf2eModel.Migrations .Annotation("Npgsql:Enum:deity_fonts", "none,heal,harm,any") .Annotation("Npgsql:Enum:deity_sanctification", "holy,unholy,any") .Annotation("Npgsql:Enum:entity_rarity", "common,uncommon,rare,unique") - .Annotation("Npgsql:Enum:entity_type", "unknown,trait,action,ancestry,archetype,background,backpack,campaign_feature,class,subclass_group,subclass,condition,deity,feat,heritage,spell,ritual,language") + .Annotation("Npgsql:Enum:entity_type", "unknown,trait,action,ancestry,archetype,background,backpack,campaign_feature,class,subclass_group,subclass,condition,deity,feat,heritage,spell,ritual,language,rule") .Annotation("Npgsql:Enum:feat_action_type", "passive,action,reaction,free") .Annotation("Npgsql:Enum:feat_category", "uncategorized,ancestry-feature,class-feature,calling,class,skill,general,ancestry,bonus,deityboon,curse,pfsboon,campaign-feature") .Annotation("Npgsql:Enum:locale_type", "english,legacy_english,russian,legacy,hobby,other") @@ -324,6 +324,24 @@ namespace Pf2eModel.Migrations onDelete: ReferentialAction.Cascade); }); + migrationBuilder.CreateTable( + name: "rules", + columns: table => new + { + id = table.Column(type: "integer", nullable: false), + breadcrumbs = table.Column(type: "text[]", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("pk_rules", x => x.id); + table.ForeignKey( + name: "fk_rules_entities_id", + column: x => x.id, + principalTable: "entities", + principalColumn: "id", + onDelete: ReferentialAction.Cascade); + }); + migrationBuilder.CreateTable( name: "spells", columns: table => new @@ -1400,6 +1418,9 @@ namespace Pf2eModel.Migrations migrationBuilder.DropTable( name: "ritual_checks"); + migrationBuilder.DropTable( + name: "rules"); + migrationBuilder.DropTable( name: "spell_areas"); diff --git a/Pf2eModel/Migrations/Pf2eDbContextModelSnapshot.cs b/Pf2eModel/Migrations/Pf2eDbContextModelSnapshot.cs index 4d0591a..2daa5a1 100644 --- a/Pf2eModel/Migrations/Pf2eDbContextModelSnapshot.cs +++ b/Pf2eModel/Migrations/Pf2eDbContextModelSnapshot.cs @@ -31,7 +31,7 @@ namespace Pf2eModel.Migrations NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_fonts", new[] { "none", "heal", "harm", "any" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "deity_sanctification", new[] { "holy", "unholy", "any" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_rarity", new[] { "common", "uncommon", "rare", "unique" }); - NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "subclass_group", "subclass", "condition", "deity", "feat", "heritage", "spell", "ritual", "language" }); + NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "entity_type", new[] { "unknown", "trait", "action", "ancestry", "archetype", "background", "backpack", "campaign_feature", "class", "subclass_group", "subclass", "condition", "deity", "feat", "heritage", "spell", "ritual", "language", "rule" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_action_type", new[] { "passive", "action", "reaction", "free" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "feat_category", new[] { "uncategorized", "ancestry-feature", "class-feature", "calling", "class", "skill", "general", "ancestry", "bonus", "deityboon", "curse", "pfsboon", "campaign-feature" }); NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "locale_type", new[] { "english", "legacy_english", "russian", "legacy", "hobby", "other" }); @@ -1392,6 +1392,24 @@ namespace Pf2eModel.Migrations b.ToTable("ritual_checks", (string)null); }); + modelBuilder.Entity("Pf2eModel.Model.Structure.Rule", b => + { + b.Property("Id") + .HasColumnType("integer") + .HasColumnName("id") + .HasColumnOrder(1); + + b.PrimitiveCollection("Breadcrumbs") + .IsRequired() + .HasColumnType("text[]") + .HasColumnName("breadcrumbs"); + + b.HasKey("Id") + .HasName("pk_rules"); + + b.ToTable("rules", (string)null); + }); + modelBuilder.Entity("Pf2eModel.Model.Structure.Spell", b => { b.Property("Id") @@ -2246,6 +2264,18 @@ namespace Pf2eModel.Migrations b.Navigation("Training"); }); + modelBuilder.Entity("Pf2eModel.Model.Structure.Rule", b => + { + b.HasOne("Pf2eModel.Model.Base.Entity", "Entity") + .WithOne() + .HasForeignKey("Pf2eModel.Model.Structure.Rule", "Id") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired() + .HasConstraintName("fk_rules_entities_id"); + + b.Navigation("Entity"); + }); + modelBuilder.Entity("Pf2eModel.Model.Structure.Spell", b => { b.HasOne("Pf2eModel.Model.Base.Entity", "Entity") diff --git a/Pf2eModel/Model/Enum/EntityType.cs b/Pf2eModel/Model/Enum/EntityType.cs index c01d9b2..83cf742 100644 --- a/Pf2eModel/Model/Enum/EntityType.cs +++ b/Pf2eModel/Model/Enum/EntityType.cs @@ -57,4 +57,7 @@ public enum EntityType [PgName("language")] Language, + + [PgName("rule")] + Rule, } diff --git a/Pf2eModel/Model/Structure/Rule.cs b/Pf2eModel/Model/Structure/Rule.cs new file mode 100644 index 0000000..9ed8c69 --- /dev/null +++ b/Pf2eModel/Model/Structure/Rule.cs @@ -0,0 +1,19 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using Pf2eModel.Model.Base; +using Pf2eModel.Model.Enum; + +namespace Pf2eModel.Model.Structure; + +[EntityOfType(EntityType.Rule)] +public class Rule : IEntity +{ + [Key] + [DatabaseGenerated(DatabaseGeneratedOption.None)] + [Column(Order = 1)] + public int Id { get; set; } + + public Entity Entity { get; set; } = null!; + + public string[] Breadcrumbs { get; set; } = []; +} diff --git a/Pf2eModel/Pf2eDbContext.cs b/Pf2eModel/Pf2eDbContext.cs index 065cc8c..8e05de5 100644 --- a/Pf2eModel/Pf2eDbContext.cs +++ b/Pf2eModel/Pf2eDbContext.cs @@ -100,6 +100,8 @@ public partial class Pf2eDbContext : DbContext public virtual DbSet RitualChecks { get; set; } + public virtual DbSet Rules { get; set; } + public virtual DbSet Sources { get; set; } public virtual DbSet Spells { get; set; } diff --git a/Pf2eModel/Pf2eDbContextModel.cs b/Pf2eModel/Pf2eDbContextModel.cs index 7ebf1dc..5c10d03 100644 --- a/Pf2eModel/Pf2eDbContextModel.cs +++ b/Pf2eModel/Pf2eDbContextModel.cs @@ -503,6 +503,12 @@ public partial class Pf2eDbContext { BindEntity(entity); }); + + // Rule + modelBuilder.Entity(entity => + { + BindEntity(entity); + }); } private void DefineMethods(ModelBuilder modelBuilder)