diff --git a/Iceshrimp.Backend/Controllers/Mastodon/NotificationController.cs b/Iceshrimp.Backend/Controllers/Mastodon/NotificationController.cs
index 449b1428..a1284cb7 100644
--- a/Iceshrimp.Backend/Controllers/Mastodon/NotificationController.cs
+++ b/Iceshrimp.Backend/Controllers/Mastodon/NotificationController.cs
@@ -40,7 +40,8 @@ public class NotificationController(DatabaseContext db, NotificationRenderer not
p.Type == NotificationType.Quote ||
p.Type == NotificationType.Like ||
p.Type == NotificationType.PollEnded ||
- p.Type == NotificationType.FollowRequestReceived)
+ p.Type == NotificationType.FollowRequestReceived ||
+ p.Type == NotificationType.Edit)
.EnsureNoteVisibilityFor(p => p.Note, user)
.FilterBlocked(p => p.Notifier, user)
.FilterBlocked(p => p.Note, user)
diff --git a/Iceshrimp.Backend/Controllers/Mastodon/Schemas/Entities/NotificationEntity.cs b/Iceshrimp.Backend/Controllers/Mastodon/Schemas/Entities/NotificationEntity.cs
index 0bdb3efd..db41bcbb 100644
--- a/Iceshrimp.Backend/Controllers/Mastodon/Schemas/Entities/NotificationEntity.cs
+++ b/Iceshrimp.Backend/Controllers/Mastodon/Schemas/Entities/NotificationEntity.cs
@@ -27,6 +27,7 @@ public class NotificationEntity : IEntity
NotificationType.Like => "favourite",
NotificationType.PollEnded => "poll",
NotificationType.FollowRequestReceived => "follow_request",
+ NotificationType.Edit => "update",
_ => throw new GracefulException($"Unsupported notification type: {type}")
};
diff --git a/Iceshrimp.Backend/Core/Database/Migrations/20240217040655_AddEditNotificationType.Designer.cs b/Iceshrimp.Backend/Core/Database/Migrations/20240217040655_AddEditNotificationType.Designer.cs
new file mode 100644
index 00000000..d4049b00
--- /dev/null
+++ b/Iceshrimp.Backend/Core/Database/Migrations/20240217040655_AddEditNotificationType.Designer.cs
@@ -0,0 +1,6017 @@
+//
+using System;
+using System.Collections.Generic;
+using Iceshrimp.Backend.Controllers.Mastodon.Schemas.Entities;
+using Iceshrimp.Backend.Core.Database;
+using Iceshrimp.Backend.Core.Database.Tables;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace Iceshrimp.Backend.Core.Database.Migrations
+{
+ [DbContext(typeof(DatabaseContext))]
+ [Migration("20240217040655_AddEditNotificationType")]
+ partial class AddEditNotificationType
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "8.0.1")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "antenna_src_enum", new[] { "home", "all", "users", "list", "group", "instances" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "note_visibility_enum", new[] { "public", "home", "followers", "specified" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "notification_type_enum", new[] { "follow", "mention", "reply", "renote", "quote", "like", "reaction", "pollVote", "pollEnded", "receiveFollowRequest", "followRequestAccepted", "groupInvited", "app", "edit" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "page_visibility_enum", new[] { "public", "followers", "specified" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "relay_status_enum", new[] { "requesting", "accepted", "rejected" });
+ NpgsqlModelBuilderExtensions.HasPostgresEnum(modelBuilder, "user_profile_ffvisibility_enum", new[] { "public", "followers", "private" });
+ NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, "pg_trgm");
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.AbuseUserReport", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("AssigneeId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("assigneeId");
+
+ b.Property("Comment")
+ .IsRequired()
+ .HasMaxLength(2048)
+ .HasColumnType("character varying(2048)")
+ .HasColumnName("comment");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the AbuseUserReport.");
+
+ b.Property("Forwarded")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("forwarded");
+
+ b.Property("ReporterHost")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("reporterHost")
+ .HasComment("[Denormalized]");
+
+ b.Property("ReporterId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("reporterId");
+
+ b.Property("Resolved")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("resolved");
+
+ b.Property("TargetUserHost")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("targetUserHost")
+ .HasComment("[Denormalized]");
+
+ b.Property("TargetUserId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("targetUserId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AssigneeId");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("ReporterHost");
+
+ b.HasIndex("ReporterId");
+
+ b.HasIndex("Resolved");
+
+ b.HasIndex("TargetUserHost");
+
+ b.HasIndex("TargetUserId");
+
+ b.ToTable("abuse_user_report");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.AccessToken", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("AppId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("appId");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the AccessToken.");
+
+ b.Property("Description")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("description");
+
+ b.Property("Fetched")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("fetched");
+
+ b.Property("Hash")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("hash");
+
+ b.Property("IconUrl")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("iconUrl");
+
+ b.Property("LastUsedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("lastUsedAt");
+
+ b.Property("Name")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("name");
+
+ b.Property>("Permission")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("character varying(64)[]")
+ .HasColumnName("permission")
+ .HasDefaultValueSql("'{}'::character varying[]");
+
+ b.Property("Session")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("session");
+
+ b.Property("Token")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("token");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AppId");
+
+ b.HasIndex("Hash");
+
+ b.HasIndex("Session");
+
+ b.HasIndex("Token");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("access_token");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.AllowedInstance", b =>
+ {
+ b.Property("Host")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("host");
+
+ b.Property("IsImported")
+ .HasColumnType("boolean")
+ .HasColumnName("imported");
+
+ b.HasKey("Host");
+
+ b.ToTable("allowed_instance");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.Announcement", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the Announcement.");
+
+ b.Property("ImageUrl")
+ .HasMaxLength(1024)
+ .HasColumnType("character varying(1024)")
+ .HasColumnName("imageUrl");
+
+ b.Property("IsGoodNews")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("isGoodNews");
+
+ b.Property("ShowPopup")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("showPopup");
+
+ b.Property("Text")
+ .IsRequired()
+ .HasMaxLength(8192)
+ .HasColumnType("character varying(8192)")
+ .HasColumnName("text");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("title");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updatedAt")
+ .HasComment("The updated date of the Announcement.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.ToTable("announcement");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.AnnouncementRead", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("AnnouncementId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("announcementId");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the AnnouncementRead.");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AnnouncementId");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("UserId", "AnnouncementId")
+ .IsUnique();
+
+ b.ToTable("announcement_read");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.Antenna", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("CaseSensitive")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("caseSensitive");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the Antenna.");
+
+ b.Property>>("ExcludeKeywords")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("jsonb")
+ .HasColumnName("excludeKeywords")
+ .HasDefaultValueSql("'[]'::jsonb");
+
+ b.Property("Expression")
+ .HasMaxLength(2048)
+ .HasColumnType("character varying(2048)")
+ .HasColumnName("expression");
+
+ b.Property>("Instances")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("jsonb")
+ .HasColumnName("instances")
+ .HasDefaultValueSql("'[]'::jsonb");
+
+ b.Property>>("Keywords")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("jsonb")
+ .HasColumnName("keywords")
+ .HasDefaultValueSql("'[]'::jsonb");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("name")
+ .HasComment("The name of the Antenna.");
+
+ b.Property("Notify")
+ .HasColumnType("boolean")
+ .HasColumnName("notify");
+
+ b.Property("Source")
+ .HasColumnType("antenna_src_enum")
+ .HasColumnName("src");
+
+ b.Property("UserGroupMemberId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userGroupMemberId");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId")
+ .HasComment("The owner ID.");
+
+ b.Property("UserListId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userListId");
+
+ b.Property>("Users")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("character varying(1024)[]")
+ .HasColumnName("users")
+ .HasDefaultValueSql("'{}'::character varying[]");
+
+ b.Property("WithFile")
+ .HasColumnType("boolean")
+ .HasColumnName("withFile");
+
+ b.Property("WithReplies")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("withReplies");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserGroupMemberId");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("UserListId");
+
+ b.ToTable("antenna");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.App", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("CallbackUrl")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("callbackUrl")
+ .HasComment("The callbackUrl of the App.");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the App.");
+
+ b.Property("Description")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("description")
+ .HasComment("The description of the App.");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("name")
+ .HasComment("The name of the App.");
+
+ b.Property>("Permission")
+ .IsRequired()
+ .HasColumnType("character varying(64)[]")
+ .HasColumnName("permission")
+ .HasComment("The permission of the App.");
+
+ b.Property("Secret")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("secret")
+ .HasComment("The secret key of the App.");
+
+ b.Property("UserId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId")
+ .HasComment("The owner ID.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("Secret");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("app");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.AttestationChallenge", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("UserId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId");
+
+ b.Property("Challenge")
+ .IsRequired()
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("challenge")
+ .HasComment("Hex-encoded sha256 hash of the challenge.");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The date challenge was created for expiry purposes.");
+
+ b.Property("RegistrationChallenge")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("registrationChallenge")
+ .HasComment("Indicates that the challenge is only for registration purposes if true to prevent the challenge for being used as authentication.");
+
+ b.HasKey("Id", "UserId");
+
+ b.HasIndex("Challenge");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("attestation_challenge");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.AuthSession", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("AppId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("appId");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the AuthSession.");
+
+ b.Property("Token")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("token");
+
+ b.Property("UserId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AppId");
+
+ b.HasIndex("Token");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("auth_session");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.BlockedInstance", b =>
+ {
+ b.Property("Host")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("host");
+
+ b.Property("IsImported")
+ .HasColumnType("boolean")
+ .HasColumnName("imported");
+
+ b.Property("Reason")
+ .HasMaxLength(1024)
+ .HasColumnType("character varying(1024)")
+ .HasColumnName("reason");
+
+ b.HasKey("Host");
+
+ b.ToTable("blocked_instance");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.Blocking", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("BlockeeId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("blockeeId")
+ .HasComment("The blockee user ID.");
+
+ b.Property("BlockerId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("blockerId")
+ .HasComment("The blocker user ID.");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the Blocking.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BlockeeId");
+
+ b.HasIndex("BlockerId");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("BlockerId", "BlockeeId")
+ .IsUnique();
+
+ b.ToTable("blocking");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.Channel", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("BannerId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("bannerId")
+ .HasComment("The ID of banner Channel.");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the Channel.");
+
+ b.Property("Description")
+ .HasMaxLength(2048)
+ .HasColumnType("character varying(2048)")
+ .HasColumnName("description")
+ .HasComment("The description of the Channel.");
+
+ b.Property("LastNotedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("lastNotedAt");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("name")
+ .HasComment("The name of the Channel.");
+
+ b.Property("NotesCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("notesCount")
+ .HasComment("The count of notes.");
+
+ b.Property("UserId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId")
+ .HasComment("The owner ID.");
+
+ b.Property("UsersCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("usersCount")
+ .HasComment("The count of users.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("BannerId");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("LastNotedAt");
+
+ b.HasIndex("NotesCount");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("UsersCount");
+
+ b.ToTable("channel");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.ChannelFollowing", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the ChannelFollowing.");
+
+ b.Property("FolloweeId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("followeeId")
+ .HasComment("The followee channel ID.");
+
+ b.Property("FollowerId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("followerId")
+ .HasComment("The follower user ID.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("FolloweeId");
+
+ b.HasIndex("FollowerId");
+
+ b.HasIndex("FollowerId", "FolloweeId")
+ .IsUnique();
+
+ b.ToTable("channel_following");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.ChannelNotePin", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("ChannelId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("channelId");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the ChannelNotePin.");
+
+ b.Property("NoteId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("noteId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ChannelId");
+
+ b.HasIndex("NoteId");
+
+ b.HasIndex("ChannelId", "NoteId")
+ .IsUnique();
+
+ b.ToTable("channel_note_pin");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.Clip", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the Clip.");
+
+ b.Property("Description")
+ .HasMaxLength(2048)
+ .HasColumnType("character varying(2048)")
+ .HasColumnName("description")
+ .HasComment("The description of the Clip.");
+
+ b.Property("IsPublic")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("isPublic");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("name")
+ .HasComment("The name of the Clip.");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId")
+ .HasComment("The owner ID.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("clip");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.ClipNote", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("ClipId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("clipId")
+ .HasComment("The clip ID.");
+
+ b.Property("NoteId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("noteId")
+ .HasComment("The note ID.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("ClipId");
+
+ b.HasIndex("NoteId");
+
+ b.HasIndex("NoteId", "ClipId")
+ .IsUnique();
+
+ b.ToTable("clip_note");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.DriveFile", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("AccessKey")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("accessKey");
+
+ b.Property("Blurhash")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("blurhash")
+ .HasComment("The BlurHash string.");
+
+ b.Property("Comment")
+ .HasColumnType("text")
+ .HasColumnName("comment")
+ .HasComment("The comment of the DriveFile.");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the DriveFile.");
+
+ b.Property("FolderId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("folderId")
+ .HasComment("The parent folder ID. If null, it means the DriveFile is located in root.");
+
+ b.Property("IsLink")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("isLink")
+ .HasComment("Whether the DriveFile is direct link to remote server.");
+
+ b.Property("IsSensitive")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("isSensitive")
+ .HasComment("Whether the DriveFile is NSFW.");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("name")
+ .HasComment("The file name of the DriveFile.");
+
+ b.Property("Properties")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("jsonb")
+ .HasColumnName("properties")
+ .HasDefaultValueSql("'{}'::jsonb")
+ .HasComment("The any properties of the DriveFile. For example, it includes image width/height.");
+
+ b.Property>("RequestHeaders")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("jsonb")
+ .HasColumnName("requestHeaders")
+ .HasDefaultValueSql("'{}'::jsonb");
+
+ b.Property("RequestIp")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("requestIp");
+
+ b.Property("Sha256")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("sha256")
+ .HasComment("The SHA256 hash of the DriveFile.");
+
+ b.Property("Size")
+ .HasColumnType("integer")
+ .HasColumnName("size")
+ .HasComment("The file size (bytes) of the DriveFile.");
+
+ b.Property("Src")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("src");
+
+ b.Property("StoredInternal")
+ .HasColumnType("boolean")
+ .HasColumnName("storedInternal");
+
+ b.Property("ThumbnailAccessKey")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("thumbnailAccessKey");
+
+ b.Property("ThumbnailUrl")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("thumbnailUrl")
+ .HasComment("The URL of the thumbnail of the DriveFile.");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("type")
+ .HasComment("The content type (MIME) of the DriveFile.");
+
+ b.Property("Uri")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("uri")
+ .HasComment("The URI of the DriveFile. it will be null when the DriveFile is local.");
+
+ b.Property("Url")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("url")
+ .HasComment("The URL of the DriveFile.");
+
+ b.Property("UserHost")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("userHost")
+ .HasComment("The host of owner. It will be null if the user in local.");
+
+ b.Property("UserId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId")
+ .HasComment("The owner ID.");
+
+ b.Property("WebpublicAccessKey")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("webpublicAccessKey");
+
+ b.Property("WebpublicType")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("webpublicType");
+
+ b.Property("WebpublicUrl")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("webpublicUrl")
+ .HasComment("The URL of the webpublic of the DriveFile.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AccessKey");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("FolderId");
+
+ b.HasIndex("IsLink");
+
+ b.HasIndex("IsSensitive");
+
+ b.HasIndex("Sha256");
+
+ b.HasIndex("ThumbnailAccessKey");
+
+ b.HasIndex("Type");
+
+ b.HasIndex("Uri");
+
+ b.HasIndex("UserHost");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("WebpublicAccessKey");
+
+ b.HasIndex("UserId", "FolderId", "Id");
+
+ b.ToTable("drive_file");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.DriveFolder", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the DriveFolder.");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("name")
+ .HasComment("The name of the DriveFolder.");
+
+ b.Property("ParentId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("parentId")
+ .HasComment("The parent folder ID. If null, it means the DriveFolder is located in root.");
+
+ b.Property("UserId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId")
+ .HasComment("The owner ID.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("ParentId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("drive_folder");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.Emoji", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property>("Aliases")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("character varying(128)[]")
+ .HasColumnName("aliases")
+ .HasDefaultValueSql("'{}'::character varying[]");
+
+ b.Property("Category")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("category");
+
+ b.Property("Height")
+ .HasColumnType("integer")
+ .HasColumnName("height")
+ .HasComment("Image height");
+
+ b.Property("Host")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("host");
+
+ b.Property("License")
+ .HasMaxLength(1024)
+ .HasColumnType("character varying(1024)")
+ .HasColumnName("license");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("name");
+
+ b.Property("OriginalUrl")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("originalUrl");
+
+ b.Property("PublicUrl")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("publicUrl")
+ .HasDefaultValueSql("''::character varying");
+
+ b.Property("Type")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("type");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updatedAt");
+
+ b.Property("Uri")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("uri");
+
+ b.Property("Width")
+ .HasColumnType("integer")
+ .HasColumnName("width")
+ .HasComment("Image width");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Host");
+
+ b.HasIndex("Name");
+
+ b.HasIndex("Name", "Host")
+ .IsUnique();
+
+ b.ToTable("emoji");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.FollowRequest", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the FollowRequest.");
+
+ b.Property("FolloweeHost")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("followeeHost")
+ .HasComment("[Denormalized]");
+
+ b.Property("FolloweeId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("followeeId")
+ .HasComment("The followee user ID.");
+
+ b.Property("FolloweeInbox")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("followeeInbox")
+ .HasComment("[Denormalized]");
+
+ b.Property("FolloweeSharedInbox")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("followeeSharedInbox")
+ .HasComment("[Denormalized]");
+
+ b.Property("FollowerHost")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("followerHost")
+ .HasComment("[Denormalized]");
+
+ b.Property("FollowerId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("followerId")
+ .HasComment("The follower user ID.");
+
+ b.Property("FollowerInbox")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("followerInbox")
+ .HasComment("[Denormalized]");
+
+ b.Property("FollowerSharedInbox")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("followerSharedInbox")
+ .HasComment("[Denormalized]");
+
+ b.Property("RequestId")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("requestId")
+ .HasComment("id of Follow Activity.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FolloweeId");
+
+ b.HasIndex("FollowerId");
+
+ b.HasIndex("FollowerId", "FolloweeId")
+ .IsUnique();
+
+ b.ToTable("follow_request");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.Following", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the Following.");
+
+ b.Property("FolloweeHost")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("followeeHost")
+ .HasComment("[Denormalized]");
+
+ b.Property("FolloweeId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("followeeId")
+ .HasComment("The followee user ID.");
+
+ b.Property("FolloweeInbox")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("followeeInbox")
+ .HasComment("[Denormalized]");
+
+ b.Property("FolloweeSharedInbox")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("followeeSharedInbox")
+ .HasComment("[Denormalized]");
+
+ b.Property("FollowerHost")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("followerHost")
+ .HasComment("[Denormalized]");
+
+ b.Property("FollowerId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("followerId")
+ .HasComment("The follower user ID.");
+
+ b.Property("FollowerInbox")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("followerInbox")
+ .HasComment("[Denormalized]");
+
+ b.Property("FollowerSharedInbox")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("followerSharedInbox")
+ .HasComment("[Denormalized]");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("FolloweeHost");
+
+ b.HasIndex("FolloweeId");
+
+ b.HasIndex("FollowerHost");
+
+ b.HasIndex("FollowerId");
+
+ b.HasIndex("FollowerId", "FolloweeId")
+ .IsUnique();
+
+ b.ToTable("following");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.GalleryLike", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt");
+
+ b.Property("PostId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("postId");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("PostId");
+
+ b.HasIndex("UserId");
+
+ b.HasIndex("UserId", "PostId")
+ .IsUnique();
+
+ b.ToTable("gallery_like");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.GalleryPost", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the GalleryPost.");
+
+ b.Property("Description")
+ .HasMaxLength(2048)
+ .HasColumnType("character varying(2048)")
+ .HasColumnName("description");
+
+ b.Property>("FileIds")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("character varying(32)[]")
+ .HasColumnName("fileIds")
+ .HasDefaultValueSql("'{}'::character varying[]");
+
+ b.Property("IsSensitive")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("isSensitive")
+ .HasComment("Whether the post is sensitive.");
+
+ b.Property("LikedCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("likedCount");
+
+ b.Property>("Tags")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("character varying(128)[]")
+ .HasColumnName("tags")
+ .HasDefaultValueSql("'{}'::character varying[]");
+
+ b.Property("Title")
+ .IsRequired()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("title");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updatedAt")
+ .HasComment("The updated date of the GalleryPost.");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId")
+ .HasComment("The ID of author.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("FileIds");
+
+ b.HasIndex("IsSensitive");
+
+ b.HasIndex("LikedCount");
+
+ b.HasIndex("Tags");
+
+ b.HasIndex("UpdatedAt");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("gallery_post");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.Hashtag", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property>("AttachedLocalUserIds")
+ .IsRequired()
+ .HasColumnType("character varying(32)[]")
+ .HasColumnName("attachedLocalUserIds");
+
+ b.Property("AttachedLocalUsersCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("attachedLocalUsersCount");
+
+ b.Property>("AttachedRemoteUserIds")
+ .IsRequired()
+ .HasColumnType("character varying(32)[]")
+ .HasColumnName("attachedRemoteUserIds");
+
+ b.Property("AttachedRemoteUsersCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("attachedRemoteUsersCount");
+
+ b.Property>("AttachedUserIds")
+ .IsRequired()
+ .HasColumnType("character varying(32)[]")
+ .HasColumnName("attachedUserIds");
+
+ b.Property("AttachedUsersCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("attachedUsersCount");
+
+ b.Property>("MentionedLocalUserIds")
+ .IsRequired()
+ .HasColumnType("character varying(32)[]")
+ .HasColumnName("mentionedLocalUserIds");
+
+ b.Property("MentionedLocalUsersCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("mentionedLocalUsersCount");
+
+ b.Property>("MentionedRemoteUserIds")
+ .IsRequired()
+ .HasColumnType("character varying(32)[]")
+ .HasColumnName("mentionedRemoteUserIds");
+
+ b.Property("MentionedRemoteUsersCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("mentionedRemoteUsersCount");
+
+ b.Property>("MentionedUserIds")
+ .IsRequired()
+ .HasColumnType("character varying(32)[]")
+ .HasColumnName("mentionedUserIds");
+
+ b.Property("MentionedUsersCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("mentionedUsersCount");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("name");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AttachedLocalUsersCount");
+
+ b.HasIndex("AttachedRemoteUsersCount");
+
+ b.HasIndex("AttachedUsersCount");
+
+ b.HasIndex("MentionedLocalUsersCount");
+
+ b.HasIndex("MentionedRemoteUsersCount");
+
+ b.HasIndex("MentionedUsersCount");
+
+ b.HasIndex("Name")
+ .IsUnique();
+
+ b.ToTable("hashtag");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.HtmlNoteCacheEntry", b =>
+ {
+ b.Property("NoteId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("noteId");
+
+ b.Property("Content")
+ .HasColumnType("text")
+ .HasColumnName("content");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updatedAt");
+
+ b.HasKey("NoteId");
+
+ b.ToTable("html_note_cache_entry");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.HtmlUserCacheEntry", b =>
+ {
+ b.Property("UserId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId");
+
+ b.Property("Bio")
+ .HasColumnType("text")
+ .HasColumnName("bio");
+
+ b.Property("Fields")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("jsonb")
+ .HasColumnName("fields")
+ .HasDefaultValueSql("'[]'::jsonb");
+
+ b.Property("UpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("updatedAt");
+
+ b.HasKey("UserId");
+
+ b.ToTable("html_user_cache_entry");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.Instance", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("CaughtAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("caughtAt")
+ .HasComment("The caught date of the Instance.");
+
+ b.Property("Description")
+ .HasMaxLength(4096)
+ .HasColumnType("character varying(4096)")
+ .HasColumnName("description");
+
+ b.Property("FaviconUrl")
+ .HasMaxLength(4096)
+ .HasColumnType("character varying(4096)")
+ .HasColumnName("faviconUrl");
+
+ b.Property("FollowersCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("followersCount");
+
+ b.Property("FollowingCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("followingCount");
+
+ b.Property("Host")
+ .IsRequired()
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("host")
+ .HasComment("The host of the Instance.");
+
+ b.Property("IconUrl")
+ .HasMaxLength(4096)
+ .HasColumnType("character varying(4096)")
+ .HasColumnName("iconUrl");
+
+ b.Property("InfoUpdatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("infoUpdatedAt");
+
+ b.Property("IsNotResponding")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("isNotResponding");
+
+ b.Property("IsSuspended")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("isSuspended");
+
+ b.Property("LastCommunicatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("lastCommunicatedAt");
+
+ b.Property("LatestRequestReceivedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("latestRequestReceivedAt");
+
+ b.Property("LatestRequestSentAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("latestRequestSentAt");
+
+ b.Property("LatestStatus")
+ .HasColumnType("integer")
+ .HasColumnName("latestStatus");
+
+ b.Property("MaintainerEmail")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("maintainerEmail");
+
+ b.Property("MaintainerName")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("maintainerName");
+
+ b.Property("Name")
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("name");
+
+ b.Property("NotesCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("notesCount")
+ .HasComment("The count of the notes of the Instance.");
+
+ b.Property("OpenRegistrations")
+ .HasColumnType("boolean")
+ .HasColumnName("openRegistrations");
+
+ b.Property("SoftwareName")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("softwareName")
+ .HasComment("The software of the Instance.");
+
+ b.Property("SoftwareVersion")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("softwareVersion");
+
+ b.Property("ThemeColor")
+ .HasMaxLength(64)
+ .HasColumnType("character varying(64)")
+ .HasColumnName("themeColor");
+
+ b.Property("UsersCount")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer")
+ .HasDefaultValue(0)
+ .HasColumnName("usersCount")
+ .HasComment("The count of the users of the Instance.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CaughtAt");
+
+ b.HasIndex("Host")
+ .IsUnique();
+
+ b.HasIndex("IsSuspended");
+
+ b.ToTable("instance");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.MessagingMessage", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property("CreatedAt")
+ .HasColumnType("timestamp with time zone")
+ .HasColumnName("createdAt")
+ .HasComment("The created date of the MessagingMessage.");
+
+ b.Property("FileId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("fileId");
+
+ b.Property("GroupId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("groupId")
+ .HasComment("The recipient group ID.");
+
+ b.Property("IsRead")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("isRead");
+
+ b.Property>("Reads")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("character varying(32)[]")
+ .HasColumnName("reads")
+ .HasDefaultValueSql("'{}'::character varying[]");
+
+ b.Property("RecipientId")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("recipientId")
+ .HasComment("The recipient user ID.");
+
+ b.Property("Text")
+ .HasMaxLength(4096)
+ .HasColumnType("character varying(4096)")
+ .HasColumnName("text");
+
+ b.Property("Uri")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("uri");
+
+ b.Property("UserId")
+ .IsRequired()
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("userId")
+ .HasComment("The sender user ID.");
+
+ b.HasKey("Id");
+
+ b.HasIndex("CreatedAt");
+
+ b.HasIndex("FileId");
+
+ b.HasIndex("GroupId");
+
+ b.HasIndex("RecipientId");
+
+ b.HasIndex("UserId");
+
+ b.ToTable("messaging_message");
+ });
+
+ modelBuilder.Entity("Iceshrimp.Backend.Core.Database.Tables.Meta", b =>
+ {
+ b.Property("Id")
+ .HasMaxLength(32)
+ .HasColumnType("character varying(32)")
+ .HasColumnName("id");
+
+ b.Property>("AllowedHosts")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("character varying(256)[]")
+ .HasColumnName("allowedHosts")
+ .HasDefaultValueSql("'{}'::character varying[]");
+
+ b.Property("AutofollowedAccount")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("autofollowedAccount");
+
+ b.Property("BackgroundImageUrl")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("backgroundImageUrl");
+
+ b.Property("BannerUrl")
+ .HasMaxLength(512)
+ .HasColumnType("character varying(512)")
+ .HasColumnName("bannerUrl");
+
+ b.Property>("BlockedHosts")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("character varying(256)[]")
+ .HasColumnName("blockedHosts")
+ .HasDefaultValueSql("'{}'::character varying[]");
+
+ b.Property("CacheRemoteFiles")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("cacheRemoteFiles");
+
+ b.Property>("CustomMotd")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("character varying(256)[]")
+ .HasColumnName("customMOTD")
+ .HasDefaultValueSql("'{}'::character varying[]");
+
+ b.Property>("CustomSplashIcons")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasColumnType("character varying(256)[]")
+ .HasColumnName("customSplashIcons")
+ .HasDefaultValueSql("'{}'::character varying[]");
+
+ b.Property("DeeplAuthKey")
+ .HasMaxLength(128)
+ .HasColumnType("character varying(128)")
+ .HasColumnName("deeplAuthKey");
+
+ b.Property("DeeplIsPro")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("deeplIsPro");
+
+ b.Property("DefaultDarkTheme")
+ .HasMaxLength(8192)
+ .HasColumnType("character varying(8192)")
+ .HasColumnName("defaultDarkTheme");
+
+ b.Property("DefaultLightTheme")
+ .HasMaxLength(8192)
+ .HasColumnType("character varying(8192)")
+ .HasColumnName("defaultLightTheme");
+
+ b.Property("DefaultReaction")
+ .IsRequired()
+ .ValueGeneratedOnAdd()
+ .HasMaxLength(256)
+ .HasColumnType("character varying(256)")
+ .HasColumnName("defaultReaction")
+ .HasDefaultValueSql("'⭐'::character varying");
+
+ b.Property("Description")
+ .HasMaxLength(1024)
+ .HasColumnType("character varying(1024)")
+ .HasColumnName("description");
+
+ b.Property("DisableGlobalTimeline")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("boolean")
+ .HasDefaultValue(false)
+ .HasColumnName("disableGlobalTimeline");
+
+ b.Property