diff --git a/DysonNetwork.Insight/Migrations/20260102075604_AddWebFeed.Designer.cs b/DysonNetwork.Insight/Migrations/20260102075604_AddWebFeed.Designer.cs
new file mode 100644
index 00000000..60123553
--- /dev/null
+++ b/DysonNetwork.Insight/Migrations/20260102075604_AddWebFeed.Designer.cs
@@ -0,0 +1,358 @@
+//
+using System;
+using System.Collections.Generic;
+using DysonNetwork.Insight;
+using DysonNetwork.Shared.Models;
+using DysonNetwork.Shared.Models.Embed;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using NodaTime;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace DysonNetwork.Insight.Migrations
+{
+ [DbContext(typeof(AppDatabase))]
+ [Migration("20260102075604_AddWebFeed")]
+ partial class AddWebFeed
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "10.0.1")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnThinkingSequence", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("AccountId")
+ .HasColumnType("uuid")
+ .HasColumnName("account_id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("created_at");
+
+ b.Property("DeletedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("deleted_at");
+
+ b.Property("IsPublic")
+ .HasColumnType("boolean")
+ .HasColumnName("is_public");
+
+ b.Property("PaidToken")
+ .HasColumnType("bigint")
+ .HasColumnName("paid_token");
+
+ b.Property("Topic")
+ .HasMaxLength(4096)
+ .HasColumnType("character varying(4096)")
+ .HasColumnName("topic");
+
+ b.Property("TotalToken")
+ .HasColumnType("bigint")
+ .HasColumnName("total_token");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updated_at");
+
+ b.HasKey("Id")
+ .HasName("pk_thinking_sequences");
+
+ b.ToTable("thinking_sequences", (string)null);
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnThinkingThought", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("created_at");
+
+ b.Property("DeletedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("deleted_at");
+
+ b.Property>("Files")
+ .IsRequired()
+ .HasColumnType("jsonb")
+ .HasColumnName("files");
+
+ b.Property("ModelName")
+ .HasMaxLength(4096)
+ .HasColumnType("character varying(4096)")
+ .HasColumnName("model_name");
+
+ b.Property>("Parts")
+ .IsRequired()
+ .HasColumnType("jsonb")
+ .HasColumnName("parts");
+
+ b.Property("Role")
+ .HasColumnType("integer")
+ .HasColumnName("role");
+
+ b.Property("SequenceId")
+ .HasColumnType("uuid")
+ .HasColumnName("sequence_id");
+
+ b.Property("TokenCount")
+ .HasColumnType("bigint")
+ .HasColumnName("token_count");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updated_at");
+
+ b.HasKey("Id")
+ .HasName("pk_thinking_thoughts");
+
+ b.HasIndex("SequenceId")
+ .HasDatabaseName("ix_thinking_thoughts_sequence_id");
+
+ b.ToTable("thinking_thoughts", (string)null);
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnUnpaidAccount", b =>
+ {
+ b.Property("AccountId")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("account_id");
+
+ b.Property("MarkedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("marked_at");
+
+ b.HasKey("AccountId")
+ .HasName("pk_unpaid_accounts");
+
+ b.ToTable("unpaid_accounts", (string)null);
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnWebArticle", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("Author")
+ .HasMaxLength(4096)
+ .HasColumnType("character varying(4096)")
+ .HasColumnName("author");
+
+ b.Property("Content")
+ .HasColumnType("text")
+ .HasColumnName("content");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("created_at");
+
+ b.Property("DeletedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("deleted_at");
+
+ b.Property("FeedId")
+ .HasColumnType("uuid")
+ .HasColumnName("feed_id");
+
+ b.Property>("Meta")
+ .HasColumnType("jsonb")
+ .HasColumnName("meta");
+
+ b.Property("Preview")
+ .HasColumnType("jsonb")
+ .HasColumnName("preview");
+
+ b.Property("PublishedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("published_at");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasMaxLength(4096)
+ .HasColumnType("character varying(4096)")
+ .HasColumnName("title");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updated_at");
+
+ b.Property("Url")
+ .IsRequired()
+ .HasMaxLength(8192)
+ .HasColumnType("character varying(8192)")
+ .HasColumnName("url");
+
+ b.HasKey("Id")
+ .HasName("pk_web_articles");
+
+ b.HasIndex("FeedId")
+ .HasDatabaseName("ix_web_articles_feed_id");
+
+ b.ToTable("web_articles", (string)null);
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnWebFeed", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("Config")
+ .IsRequired()
+ .HasColumnType("jsonb")
+ .HasColumnName("config");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("created_at");
+
+ b.Property("DeletedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("deleted_at");
+
+ b.Property("Description")
+ .HasMaxLength(8192)
+ .HasColumnType("character varying(8192)")
+ .HasColumnName("description");
+
+ b.Property("Preview")
+ .HasColumnType("jsonb")
+ .HasColumnName("preview");
+
+ b.Property("PublisherId")
+ .HasColumnType("uuid")
+ .HasColumnName("publisher_id");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasMaxLength(4096)
+ .HasColumnType("character varying(4096)")
+ .HasColumnName("title");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updated_at");
+
+ b.Property("Url")
+ .IsRequired()
+ .HasMaxLength(8192)
+ .HasColumnType("character varying(8192)")
+ .HasColumnName("url");
+
+ b.Property("VerificationKey")
+ .HasMaxLength(8192)
+ .HasColumnType("character varying(8192)")
+ .HasColumnName("verification_key");
+
+ b.Property("VerifiedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("verified_at");
+
+ b.HasKey("Id")
+ .HasName("pk_web_feeds");
+
+ b.ToTable("web_feeds", (string)null);
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnWebFeedSubscription", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("AccountId")
+ .HasColumnType("uuid")
+ .HasColumnName("account_id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("created_at");
+
+ b.Property("DeletedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("deleted_at");
+
+ b.Property("FeedId")
+ .HasColumnType("uuid")
+ .HasColumnName("feed_id");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updated_at");
+
+ b.HasKey("Id")
+ .HasName("pk_web_feed_subscriptions");
+
+ b.HasIndex("FeedId")
+ .HasDatabaseName("ix_web_feed_subscriptions_feed_id");
+
+ b.ToTable("web_feed_subscriptions", (string)null);
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnThinkingThought", b =>
+ {
+ b.HasOne("DysonNetwork.Shared.Models.SnThinkingSequence", "Sequence")
+ .WithMany()
+ .HasForeignKey("SequenceId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_thinking_thoughts_thinking_sequences_sequence_id");
+
+ b.Navigation("Sequence");
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnWebArticle", b =>
+ {
+ b.HasOne("DysonNetwork.Shared.Models.SnWebFeed", "Feed")
+ .WithMany("Articles")
+ .HasForeignKey("FeedId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_web_articles_web_feeds_feed_id");
+
+ b.Navigation("Feed");
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnWebFeedSubscription", b =>
+ {
+ b.HasOne("DysonNetwork.Shared.Models.SnWebFeed", "Feed")
+ .WithMany()
+ .HasForeignKey("FeedId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_web_feed_subscriptions_web_feeds_feed_id");
+
+ b.Navigation("Feed");
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnWebFeed", b =>
+ {
+ b.Navigation("Articles");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/DysonNetwork.Insight/Migrations/20260102075604_AddWebFeed.cs b/DysonNetwork.Insight/Migrations/20260102075604_AddWebFeed.cs
new file mode 100644
index 00000000..623013a9
--- /dev/null
+++ b/DysonNetwork.Insight/Migrations/20260102075604_AddWebFeed.cs
@@ -0,0 +1,114 @@
+using System;
+using System.Collections.Generic;
+using DysonNetwork.Shared.Models;
+using DysonNetwork.Shared.Models.Embed;
+using Microsoft.EntityFrameworkCore.Migrations;
+using NodaTime;
+
+#nullable disable
+
+namespace DysonNetwork.Insight.Migrations
+{
+ ///
+ public partial class AddWebFeed : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "web_feeds",
+ columns: table => new
+ {
+ id = table.Column(type: "uuid", nullable: false),
+ url = table.Column(type: "character varying(8192)", maxLength: 8192, nullable: false),
+ title = table.Column(type: "character varying(4096)", maxLength: 4096, nullable: false),
+ description = table.Column(type: "character varying(8192)", maxLength: 8192, nullable: true),
+ verified_at = table.Column(type: "timestamp with time zone", nullable: true),
+ verification_key = table.Column(type: "character varying(8192)", maxLength: 8192, nullable: true),
+ preview = table.Column(type: "jsonb", nullable: true),
+ config = table.Column(type: "jsonb", nullable: false),
+ publisher_id = table.Column(type: "uuid", nullable: false),
+ created_at = table.Column(type: "timestamp with time zone", nullable: false),
+ updated_at = table.Column(type: "timestamp with time zone", nullable: false),
+ deleted_at = table.Column(type: "timestamp with time zone", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_web_feeds", x => x.id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "web_articles",
+ columns: table => new
+ {
+ id = table.Column(type: "uuid", nullable: false),
+ title = table.Column(type: "character varying(4096)", maxLength: 4096, nullable: false),
+ url = table.Column(type: "character varying(8192)", maxLength: 8192, nullable: false),
+ author = table.Column(type: "character varying(4096)", maxLength: 4096, nullable: true),
+ meta = table.Column>(type: "jsonb", nullable: true),
+ preview = table.Column(type: "jsonb", nullable: true),
+ content = table.Column(type: "text", nullable: true),
+ published_at = table.Column(type: "timestamp with time zone", nullable: true),
+ feed_id = table.Column(type: "uuid", nullable: false),
+ created_at = table.Column(type: "timestamp with time zone", nullable: false),
+ updated_at = table.Column(type: "timestamp with time zone", nullable: false),
+ deleted_at = table.Column(type: "timestamp with time zone", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_web_articles", x => x.id);
+ table.ForeignKey(
+ name: "fk_web_articles_web_feeds_feed_id",
+ column: x => x.feed_id,
+ principalTable: "web_feeds",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "web_feed_subscriptions",
+ columns: table => new
+ {
+ id = table.Column(type: "uuid", nullable: false),
+ feed_id = table.Column(type: "uuid", nullable: false),
+ account_id = table.Column(type: "uuid", nullable: false),
+ created_at = table.Column(type: "timestamp with time zone", nullable: false),
+ updated_at = table.Column(type: "timestamp with time zone", nullable: false),
+ deleted_at = table.Column(type: "timestamp with time zone", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("pk_web_feed_subscriptions", x => x.id);
+ table.ForeignKey(
+ name: "fk_web_feed_subscriptions_web_feeds_feed_id",
+ column: x => x.feed_id,
+ principalTable: "web_feeds",
+ principalColumn: "id",
+ onDelete: ReferentialAction.Cascade);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "ix_web_articles_feed_id",
+ table: "web_articles",
+ column: "feed_id");
+
+ migrationBuilder.CreateIndex(
+ name: "ix_web_feed_subscriptions_feed_id",
+ table: "web_feed_subscriptions",
+ column: "feed_id");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "web_articles");
+
+ migrationBuilder.DropTable(
+ name: "web_feed_subscriptions");
+
+ migrationBuilder.DropTable(
+ name: "web_feeds");
+ }
+ }
+}
diff --git a/DysonNetwork.Insight/Migrations/AppDatabaseModelSnapshot.cs b/DysonNetwork.Insight/Migrations/AppDatabaseModelSnapshot.cs
index 4615c960..96a7f72f 100644
--- a/DysonNetwork.Insight/Migrations/AppDatabaseModelSnapshot.cs
+++ b/DysonNetwork.Insight/Migrations/AppDatabaseModelSnapshot.cs
@@ -3,6 +3,7 @@ using System;
using System.Collections.Generic;
using DysonNetwork.Insight;
using DysonNetwork.Shared.Models;
+using DysonNetwork.Shared.Models.Embed;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
@@ -20,7 +21,7 @@ namespace DysonNetwork.Insight.Migrations
{
#pragma warning disable 612, 618
modelBuilder
- .HasAnnotation("ProductVersion", "9.0.11")
+ .HasAnnotation("ProductVersion", "10.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
@@ -143,6 +144,171 @@ namespace DysonNetwork.Insight.Migrations
b.ToTable("unpaid_accounts", (string)null);
});
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnWebArticle", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("Author")
+ .HasMaxLength(4096)
+ .HasColumnType("character varying(4096)")
+ .HasColumnName("author");
+
+ b.Property("Content")
+ .HasColumnType("text")
+ .HasColumnName("content");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("created_at");
+
+ b.Property("DeletedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("deleted_at");
+
+ b.Property("FeedId")
+ .HasColumnType("uuid")
+ .HasColumnName("feed_id");
+
+ b.Property>("Meta")
+ .HasColumnType("jsonb")
+ .HasColumnName("meta");
+
+ b.Property("Preview")
+ .HasColumnType("jsonb")
+ .HasColumnName("preview");
+
+ b.Property("PublishedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("published_at");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasMaxLength(4096)
+ .HasColumnType("character varying(4096)")
+ .HasColumnName("title");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updated_at");
+
+ b.Property("Url")
+ .IsRequired()
+ .HasMaxLength(8192)
+ .HasColumnType("character varying(8192)")
+ .HasColumnName("url");
+
+ b.HasKey("Id")
+ .HasName("pk_web_articles");
+
+ b.HasIndex("FeedId")
+ .HasDatabaseName("ix_web_articles_feed_id");
+
+ b.ToTable("web_articles", (string)null);
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnWebFeed", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("Config")
+ .IsRequired()
+ .HasColumnType("jsonb")
+ .HasColumnName("config");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("created_at");
+
+ b.Property("DeletedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("deleted_at");
+
+ b.Property("Description")
+ .HasMaxLength(8192)
+ .HasColumnType("character varying(8192)")
+ .HasColumnName("description");
+
+ b.Property("Preview")
+ .HasColumnType("jsonb")
+ .HasColumnName("preview");
+
+ b.Property("PublisherId")
+ .HasColumnType("uuid")
+ .HasColumnName("publisher_id");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasMaxLength(4096)
+ .HasColumnType("character varying(4096)")
+ .HasColumnName("title");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updated_at");
+
+ b.Property("Url")
+ .IsRequired()
+ .HasMaxLength(8192)
+ .HasColumnType("character varying(8192)")
+ .HasColumnName("url");
+
+ b.Property("VerificationKey")
+ .HasMaxLength(8192)
+ .HasColumnType("character varying(8192)")
+ .HasColumnName("verification_key");
+
+ b.Property("VerifiedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("verified_at");
+
+ b.HasKey("Id")
+ .HasName("pk_web_feeds");
+
+ b.ToTable("web_feeds", (string)null);
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnWebFeedSubscription", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid")
+ .HasColumnName("id");
+
+ b.Property("AccountId")
+ .HasColumnType("uuid")
+ .HasColumnName("account_id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("created_at");
+
+ b.Property("DeletedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("deleted_at");
+
+ b.Property("FeedId")
+ .HasColumnType("uuid")
+ .HasColumnName("feed_id");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updated_at");
+
+ b.HasKey("Id")
+ .HasName("pk_web_feed_subscriptions");
+
+ b.HasIndex("FeedId")
+ .HasDatabaseName("ix_web_feed_subscriptions_feed_id");
+
+ b.ToTable("web_feed_subscriptions", (string)null);
+ });
+
modelBuilder.Entity("DysonNetwork.Shared.Models.SnThinkingThought", b =>
{
b.HasOne("DysonNetwork.Shared.Models.SnThinkingSequence", "Sequence")
@@ -154,6 +320,35 @@ namespace DysonNetwork.Insight.Migrations
b.Navigation("Sequence");
});
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnWebArticle", b =>
+ {
+ b.HasOne("DysonNetwork.Shared.Models.SnWebFeed", "Feed")
+ .WithMany("Articles")
+ .HasForeignKey("FeedId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_web_articles_web_feeds_feed_id");
+
+ b.Navigation("Feed");
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnWebFeedSubscription", b =>
+ {
+ b.HasOne("DysonNetwork.Shared.Models.SnWebFeed", "Feed")
+ .WithMany()
+ .HasForeignKey("FeedId")
+ .OnDelete(DeleteBehavior.Cascade)
+ .IsRequired()
+ .HasConstraintName("fk_web_feed_subscriptions_web_feeds_feed_id");
+
+ b.Navigation("Feed");
+ });
+
+ modelBuilder.Entity("DysonNetwork.Shared.Models.SnWebFeed", b =>
+ {
+ b.Navigation("Articles");
+ });
#pragma warning restore 612, 618
}
}
diff --git a/DysonNetwork.Shared/Models/WebArticle.cs b/DysonNetwork.Shared/Models/WebArticle.cs
index 5f0232ff..d448d4f2 100644
--- a/DysonNetwork.Shared/Models/WebArticle.cs
+++ b/DysonNetwork.Shared/Models/WebArticle.cs
@@ -116,7 +116,7 @@ public class SnWebFeed : ModelBase
[Column(TypeName = "jsonb")] public WebFeedConfig Config { get; set; } = new();
public Guid PublisherId { get; set; }
- public SnPublisher Publisher { get; set; } = null!;
+ [NotMapped] public SnPublisher Publisher { get; set; } = null!;
[JsonIgnore] public List Articles { get; set; } = new();