diff --git a/Iceshrimp.Backend/Core/Database/DatabaseContext.cs b/Iceshrimp.Backend/Core/Database/DatabaseContext.cs index 5e5b8e03..15f3d3c4 100644 --- a/Iceshrimp.Backend/Core/Database/DatabaseContext.cs +++ b/Iceshrimp.Backend/Core/Database/DatabaseContext.cs @@ -180,1018 +180,16 @@ public class DatabaseContext(DbContextOptions options) .HasPostgresExtension("pg_trgm"); modelBuilder - .HasDbFunction(typeof(DatabaseContext).GetMethod(nameof(NoteAncestors), - [typeof(string), typeof(int)])!) + .HasDbFunction(typeof(DatabaseContext).GetMethod(nameof(NoteAncestors), [typeof(string), typeof(int)])!) .HasName("note_ancestors"); modelBuilder - .HasDbFunction(typeof(DatabaseContext).GetMethod(nameof(Conversations), - [typeof(string)])!) + .HasDbFunction(typeof(DatabaseContext).GetMethod(nameof(Conversations), [typeof(string)])!) .HasName("conversations"); modelBuilder - .HasDbFunction(typeof(Note).GetMethod(nameof(Note.InternalRawAttachments), - [typeof(string)])!) + .HasDbFunction(typeof(Note).GetMethod(nameof(Note.InternalRawAttachments), [typeof(string)])!) .HasName("note_attachments_raw"); - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the AbuseUserReport."); - entity.Property(e => e.Forwarded).HasDefaultValue(false); - entity.Property(e => e.ReporterHost).HasComment("[Denormalized]"); - entity.Property(e => e.Resolved).HasDefaultValue(false); - entity.Property(e => e.TargetUserHost).HasComment("[Denormalized]"); - - entity.HasOne(d => d.Assignee) - .WithMany(p => p.AbuseUserReportAssignees) - .OnDelete(DeleteBehavior.SetNull); - - entity.HasOne(d => d.Reporter) - .WithMany(p => p.AbuseUserReportReporters) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.TargetUser) - .WithMany(p => p.AbuseUserReportTargetUsers) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the Announcement."); - entity.Property(e => e.IsGoodNews).HasDefaultValue(false); - entity.Property(e => e.ShowPopup).HasDefaultValue(false); - entity.Property(e => e.UpdatedAt).HasComment("The updated date of the Announcement."); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the AnnouncementRead."); - - entity.HasOne(d => d.Announcement) - .WithMany(p => p.AnnouncementReads) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.AnnouncementReads) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CaseSensitive).HasDefaultValue(false); - entity.Property(e => e.CreatedAt).HasComment("The created date of the Antenna."); - entity.Property(e => e.ExcludeKeywords).HasDefaultValueSql("'[]'::jsonb"); - entity.Property(e => e.Instances).HasDefaultValueSql("'[]'::jsonb"); - entity.Property(e => e.Keywords).HasDefaultValueSql("'[]'::jsonb"); - entity.Property(e => e.Name).HasComment("The name of the Antenna."); - entity.Property(e => e.UserId).HasComment("The owner ID."); - entity.Property(e => e.Users).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.WithReplies).HasDefaultValue(false); - - entity.HasOne(d => d.UserGroupMember) - .WithMany(p => p.Antennas) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.Antennas) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.UserList) - .WithMany(p => p.Antennas) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.Challenge).HasComment("Hex-encoded sha256 hash of the challenge."); - entity.Property(e => e.CreatedAt).HasComment("The date challenge was created for expiry purposes."); - entity.Property(e => e.RegistrationChallenge) - .HasDefaultValue(false) - .HasComment("Indicates that the challenge is only for registration purposes if true to prevent the challenge for being used as authentication."); - - entity.HasOne(d => d.User) - .WithMany(p => p.AttestationChallenges) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.HasOne(d => d.User).WithMany().OnDelete(DeleteBehavior.Cascade); - entity.HasOne(d => d.TargetUser).WithMany().OnDelete(DeleteBehavior.Cascade); - entity.HasOne(d => d.TargetNote).WithMany().OnDelete(DeleteBehavior.Cascade); - entity.HasOne(d => d.TargetBite).WithMany().OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.BlockeeId).HasComment("The blockee user ID."); - entity.Property(e => e.BlockerId).HasComment("The blocker user ID."); - entity.Property(e => e.CreatedAt).HasComment("The created date of the Blocking."); - - entity.HasOne(d => d.Blockee) - .WithMany(p => p.IncomingBlocks) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Blocker) - .WithMany(p => p.OutgoingBlocks) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.BannerId).HasComment("The ID of banner Channel."); - entity.Property(e => e.CreatedAt).HasComment("The created date of the Channel."); - entity.Property(e => e.Description).HasComment("The description of the Channel."); - entity.Property(e => e.Name).HasComment("The name of the Channel."); - entity.Property(e => e.NotesCount) - .HasDefaultValue(0) - .HasComment("The count of notes."); - entity.Property(e => e.UserId).HasComment("The owner ID."); - entity.Property(e => e.UsersCount) - .HasDefaultValue(0) - .HasComment("The count of users."); - - entity.HasOne(d => d.Banner) - .WithMany(p => p.Channels) - .OnDelete(DeleteBehavior.SetNull); - - entity.HasOne(d => d.User) - .WithMany(p => p.Channels) - .OnDelete(DeleteBehavior.SetNull); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the ChannelFollowing."); - entity.Property(e => e.FolloweeId).HasComment("The followee channel ID."); - entity.Property(e => e.FollowerId).HasComment("The follower user ID."); - - entity.HasOne(d => d.Followee) - .WithMany(p => p.ChannelFollowings) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Follower) - .WithMany(p => p.ChannelFollowings) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the ChannelNotePin."); - - entity.HasOne(d => d.Channel) - .WithMany(p => p.ChannelNotePins) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Note) - .WithMany(p => p.ChannelNotePins) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the Clip."); - entity.Property(e => e.Description).HasComment("The description of the Clip."); - entity.Property(e => e.IsPublic).HasDefaultValue(false); - entity.Property(e => e.Name).HasComment("The name of the Clip."); - entity.Property(e => e.UserId).HasComment("The owner ID."); - - entity.HasOne(d => d.User) - .WithMany(p => p.Clips) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.ClipId).HasComment("The clip ID."); - entity.Property(e => e.NoteId).HasComment("The note ID."); - - entity.HasOne(d => d.Clip) - .WithMany(p => p.ClipNotes) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Note) - .WithMany(p => p.ClipNotes) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.Blurhash).HasComment("The BlurHash string."); - entity.Property(e => e.Comment).HasComment("The comment of the DriveFile."); - entity.Property(e => e.CreatedAt).HasComment("The created date of the DriveFile."); - entity.Property(e => e.FolderId) - .HasComment("The parent folder ID. If null, it means the DriveFile is located in root."); - entity.Property(e => e.IsLink) - .HasDefaultValue(false) - .HasComment("Whether the DriveFile is direct link to remote server."); - entity.Property(e => e.IsSensitive) - .HasDefaultValue(false) - .HasComment("Whether the DriveFile is NSFW."); - entity.Property(e => e.Sha256).HasComment("The SHA256 hash of the DriveFile."); - entity.Property(e => e.Name).HasComment("The file name of the DriveFile."); - entity.Property(e => e.Properties) - .HasDefaultValueSql("'{}'::jsonb") - .HasComment("The any properties of the DriveFile. For example, it includes image width/height."); - entity.Property(e => e.RequestHeaders).HasDefaultValueSql("'{}'::jsonb"); - entity.Property(e => e.Size).HasComment("The file size (bytes) of the DriveFile."); - entity.Property(e => e.ThumbnailUrl).HasComment("The URL of the thumbnail of the DriveFile."); - entity.Property(e => e.Type).HasComment("The content type (MIME) of the DriveFile."); - entity.Property(e => e.Uri) - .HasComment("The URI of the DriveFile. it will be null when the DriveFile is local."); - entity.Property(e => e.Url).HasComment("The URL of the DriveFile."); - entity.Property(e => e.UserHost).HasComment("The host of owner. It will be null if the user in local."); - entity.Property(e => e.UserId).HasComment("The owner ID."); - entity.Property(e => e.PublicUrl).HasComment("The URL of the webpublic of the DriveFile."); - - entity.HasOne(d => d.Folder) - .WithMany(p => p.DriveFiles) - .OnDelete(DeleteBehavior.SetNull); - - entity.HasOne(d => d.User) - .WithMany(p => p.DriveFiles) - .OnDelete(DeleteBehavior.SetNull); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the DriveFolder."); - entity.Property(e => e.Name).HasComment("The name of the DriveFolder."); - entity.Property(e => e.ParentId) - .HasComment("The parent folder ID. If null, it means the DriveFolder is located in root."); - entity.Property(e => e.UserId).HasComment("The owner ID."); - - entity.HasOne(d => d.Parent) - .WithMany(p => p.InverseParent) - .OnDelete(DeleteBehavior.SetNull); - - entity.HasOne(d => d.User) - .WithMany(p => p.DriveFolders) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.Aliases).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.Height).HasComment("Image height"); - entity.Property(e => e.PublicUrl).HasDefaultValueSql("''::character varying"); - entity.Property(e => e.Width).HasComment("Image width"); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the FollowRequest."); - entity.Property(e => e.FolloweeHost).HasComment("[Denormalized]"); - entity.Property(e => e.FolloweeId).HasComment("The followee user ID."); - entity.Property(e => e.FolloweeInbox).HasComment("[Denormalized]"); - entity.Property(e => e.FolloweeSharedInbox).HasComment("[Denormalized]"); - entity.Property(e => e.FollowerHost).HasComment("[Denormalized]"); - entity.Property(e => e.FollowerId).HasComment("The follower user ID."); - entity.Property(e => e.FollowerInbox).HasComment("[Denormalized]"); - entity.Property(e => e.FollowerSharedInbox).HasComment("[Denormalized]"); - entity.Property(e => e.RequestId).HasComment("id of Follow Activity."); - - entity.HasOne(d => d.Followee) - .WithMany(p => p.IncomingFollowRequests) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Follower) - .WithMany(p => p.OutgoingFollowRequests) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the Following."); - entity.Property(e => e.FolloweeHost).HasComment("[Denormalized]"); - entity.Property(e => e.FolloweeId).HasComment("The followee user ID."); - entity.Property(e => e.FolloweeInbox).HasComment("[Denormalized]"); - entity.Property(e => e.FolloweeSharedInbox).HasComment("[Denormalized]"); - entity.Property(e => e.FollowerHost).HasComment("[Denormalized]"); - entity.Property(e => e.FollowerId).HasComment("The follower user ID."); - entity.Property(e => e.FollowerInbox).HasComment("[Denormalized]"); - entity.Property(e => e.FollowerSharedInbox).HasComment("[Denormalized]"); - - entity.HasOne(d => d.Followee) - .WithMany(p => p.IncomingFollowRelationships) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Follower) - .WithMany(p => p.OutgoingFollowRelationships) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.HasOne(d => d.Post) - .WithMany(p => p.GalleryLikes) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.GalleryLikes) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the GalleryPost."); - entity.Property(e => e.FileIds).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.IsSensitive) - .HasDefaultValue(false) - .HasComment("Whether the post is sensitive."); - entity.Property(e => e.LikedCount).HasDefaultValue(0); - entity.Property(e => e.Tags).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.UpdatedAt).HasComment("The updated date of the GalleryPost."); - entity.Property(e => e.UserId).HasComment("The ID of author."); - - entity.HasOne(d => d.User) - .WithMany(p => p.GalleryPosts) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CaughtAt).HasComment("The caught date of the Instance."); - entity.Property(e => e.OutgoingFollows).HasDefaultValue(0); - entity.Property(e => e.IncomingFollows).HasDefaultValue(0); - entity.Property(e => e.Host).HasComment("The host of the Instance."); - entity.Property(e => e.IsNotResponding).HasDefaultValue(false); - entity.Property(e => e.IsSuspended).HasDefaultValue(false); - entity.Property(e => e.NotesCount) - .HasDefaultValue(0) - .HasComment("The count of the notes of the Instance."); - entity.Property(e => e.SoftwareName).HasComment("The software of the Instance."); - entity.Property(e => e.UsersCount) - .HasDefaultValue(0) - .HasComment("The count of the users of the Instance."); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the MessagingMessage."); - entity.Property(e => e.GroupId).HasComment("The recipient group ID."); - entity.Property(e => e.IsRead).HasDefaultValue(false); - entity.Property(e => e.Reads).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.RecipientId).HasComment("The recipient user ID."); - entity.Property(e => e.UserId).HasComment("The sender user ID."); - - entity.HasOne(d => d.File) - .WithMany(p => p.MessagingMessages) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Group) - .WithMany(p => p.MessagingMessages) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Recipient) - .WithMany(p => p.MessagingMessageRecipients) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.MessagingMessageUsers) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(d => d.Version).HasDefaultValue(0); - - entity.HasOne(d => d.User) - .WithMany(p => p.Markers) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.AllowedHosts).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.BlockedHosts).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.CacheRemoteFiles).HasDefaultValue(false); - entity.Property(e => e.CustomMotd).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.CustomSplashIcons).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.DeeplIsPro).HasDefaultValue(false); - entity.Property(e => e.DefaultReaction).HasDefaultValueSql("'⭐'::character varying"); - entity.Property(e => e.DisableGlobalTimeline).HasDefaultValue(false); - entity.Property(e => e.DisableLocalTimeline).HasDefaultValue(false); - entity.Property(e => e.DisableRecommendedTimeline).HasDefaultValue(true); - entity.Property(e => e.DisableRegistration).HasDefaultValue(false); - entity.Property(e => e.EmailRequiredForSignup).HasDefaultValue(false); - entity.Property(e => e.EnableActiveEmailValidation).HasDefaultValue(true); - entity.Property(e => e.EnableDiscordIntegration).HasDefaultValue(false); - entity.Property(e => e.EnableEmail).HasDefaultValue(false); - entity.Property(e => e.EnableGithubIntegration).HasDefaultValue(false); - entity.Property(e => e.EnableHcaptcha).HasDefaultValue(false); - entity.Property(e => e.EnableIdenticonGeneration).HasDefaultValue(true); - entity.Property(e => e.EnableIpLogging).HasDefaultValue(false); - entity.Property(e => e.EnableRecaptcha).HasDefaultValue(false); - entity.Property(e => e.EnableServerMachineStats).HasDefaultValue(false); - entity.Property(e => e.ErrorImageUrl) - .HasDefaultValueSql("'/static-assets/badges/error.png'::character varying"); - entity.Property(e => e.ExperimentalFeatures).HasDefaultValueSql("'{}'::jsonb"); - entity.Property(e => e.FeedbackUrl) - .HasDefaultValueSql("'https://iceshrimp.dev/iceshrimp/iceshrimp/issues/new'::character varying"); - entity.Property(e => e.HiddenTags).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.Langs).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.LocalDriveCapacityMb) - .HasDefaultValue(1024) - .HasComment("Drive capacity of a local user (MB)"); - entity.Property(e => e.MascotImageUrl) - .HasDefaultValueSql("'/static-assets/badges/info.png'::character varying"); - entity.Property(e => e.ObjectStorageS3ForcePathStyle).HasDefaultValue(true); - entity.Property(e => e.ObjectStorageSetPublicRead).HasDefaultValue(false); - entity.Property(e => e.ObjectStorageUseProxy).HasDefaultValue(true); - entity.Property(e => e.ObjectStorageUseSsl).HasDefaultValue(true); - entity.Property(e => e.PinnedPages) - .HasDefaultValueSql("'{/featured,/channels,/explore,/pages,/about-iceshrimp}'::character varying[]"); - entity.Property(e => e.PinnedUsers).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.PrivateMode).HasDefaultValue(false); - entity.Property(e => e.RecommendedInstances).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.RemoteDriveCapacityMb) - .HasDefaultValue(32) - .HasComment("Drive capacity of a remote user (MB)"); - entity.Property(e => e.RepositoryUrl) - .HasDefaultValueSql("'https://iceshrimp.dev/iceshrimp/iceshrimp'::character varying"); - entity.Property(e => e.SecureMode).HasDefaultValue(true); - entity.Property(e => e.SilencedHosts).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.SmtpSecure).HasDefaultValue(false); - entity.Property(e => e.UseObjectStorage).HasDefaultValue(false); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the ModerationLog."); - - entity.HasOne(d => d.User) - .WithMany(p => p.ModerationLogs) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the Muting."); - entity.Property(e => e.MuteeId).HasComment("The mutee user ID."); - entity.Property(e => e.MuterId).HasComment("The muter user ID."); - - entity.HasOne(d => d.Mutee) - .WithMany(p => p.IncomingMutes) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Muter) - .WithMany(p => p.OutgoingMutes) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.HasIndex(e => e.Mentions, "GIN_note_mentions").HasMethod("gin"); - entity.HasIndex(e => e.Tags, "GIN_note_tags").HasMethod("gin"); - entity.HasIndex(e => e.VisibleUserIds, "GIN_note_visibleUserIds").HasMethod("gin"); - entity.HasIndex(e => e.Text, "GIN_TRGM_note_text") - .HasMethod("gin") - .HasOperators("gin_trgm_ops"); - entity.HasIndex(e => e.Cw, "GIN_TRGM_note_cw") - .HasMethod("gin") - .HasOperators("gin_trgm_ops"); - entity.HasIndex(e => e.CombinedAltText, "GIN_TRGM_note_combined_alt_text") - .HasMethod("gin") - .HasOperators("gin_trgm_ops"); - - entity.Property(e => e.AttachedFileTypes).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.ChannelId).HasComment("The ID of source channel."); - entity.Property(e => e.CreatedAt).HasComment("The created date of the Note."); - entity.Property(e => e.Emojis).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.FileIds).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.HasPoll).HasDefaultValue(false); - entity.Property(e => e.LikeCount).HasDefaultValue(0); - entity.Property(e => e.LocalOnly).HasDefaultValue(false); - entity.Property(e => e.MentionedRemoteUsers).HasDefaultValueSql("'[]'::jsonb"); - entity.Property(e => e.Mentions).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.Reactions).HasDefaultValueSql("'{}'::jsonb"); - entity.Property(e => e.RenoteCount).HasDefaultValue((short)0); - entity.Property(e => e.RenoteId).HasComment("The ID of renote target."); - entity.Property(e => e.RenoteUserHost).HasComment("[Denormalized]"); - entity.Property(e => e.RenoteUserId).HasComment("[Denormalized]"); - entity.Property(e => e.RepliesCount).HasDefaultValue((short)0); - entity.Property(e => e.ReplyId).HasComment("The ID of reply target."); - entity.Property(e => e.ReplyUserHost).HasComment("[Denormalized]"); - entity.Property(e => e.ReplyUserId).HasComment("[Denormalized]"); - entity.Property(e => e.Score).HasDefaultValue(0); - entity.Property(e => e.Tags).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.UpdatedAt).HasComment("The updated date of the Note."); - entity.Property(e => e.Uri).HasComment("The URI of a note. it will be null when the note is local."); - entity.Property(e => e.Url) - .HasComment("The human readable url of a note. it will be null when the note is local."); - entity.Property(e => e.UserHost).HasComment("[Denormalized]"); - entity.Property(e => e.UserId).HasComment("The ID of author."); - entity.Property(e => e.VisibleUserIds).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.ReplyUri) - .HasComment("The URI of the reply target, if it couldn't be resolved at time of ingestion."); - entity.Property(e => e.RenoteUri) - .HasComment("The URI of the renote target, if it couldn't be resolved at time of ingestion."); - - entity.HasOne(d => d.Channel) - .WithMany(p => p.Notes) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Renote) - .WithMany(p => p.InverseRenote) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Reply) - .WithMany(p => p.InverseReply) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.Notes) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.FileIds).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.NoteId).HasComment("The ID of note."); - entity.Property(e => e.UpdatedAt).HasComment("The updated date of the Note."); - - entity.HasOne(d => d.Note) - .WithMany(p => p.NoteEdits) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the NoteBookmark."); - - entity.HasOne(d => d.Note) - .WithMany(p => p.NoteBookmarks) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.NoteBookmarks) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.HasOne(d => d.Note) - .WithMany(p => p.NoteLikes) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.NoteLikes) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the NoteReaction."); - - entity.HasOne(d => d.Note) - .WithMany(p => p.NoteReactions) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.NoteReactions) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.HasOne(d => d.User) - .WithMany(p => p.NoteThreadMutings) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.NoteChannelId).HasComment("[Denormalized]"); - entity.Property(e => e.NoteUserId).HasComment("[Denormalized]"); - - entity.HasOne(d => d.Note) - .WithMany(p => p.NoteUnreads) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.NoteUnreads) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the NoteWatching."); - entity.Property(e => e.NoteId).HasComment("The target Note ID."); - entity.Property(e => e.NoteUserId).HasComment("[Denormalized]"); - entity.Property(e => e.UserId).HasComment("The watcher ID."); - - entity.HasOne(d => d.Note) - .WithMany(p => p.NoteWatchings) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.NoteWatchings) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the Notification."); - entity.Property(e => e.IsRead) - .HasDefaultValue(false) - .HasComment("Whether the notification was read."); - entity.Property(e => e.NotifieeId).HasComment("The ID of recipient user of the Notification."); - entity.Property(e => e.NotifierId).HasComment("The ID of sender user of the Notification."); - entity.Property(e => e.Type).HasComment("The type of the Notification."); - - entity.HasOne(d => d.FollowRequest) - .WithMany(p => p.Notifications) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Note) - .WithMany(p => p.Notifications) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Notifiee) - .WithMany(p => p.NotificationNotifiees) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Notifier) - .WithMany(p => p.NotificationNotifiers) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.UserGroupInvitation) - .WithMany(p => p.Notifications) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.ClientId).HasComment("The client id of the OAuth application"); - entity.Property(e => e.ClientSecret).HasComment("The client secret of the OAuth application"); - entity.Property(e => e.CreatedAt).HasComment("The created date of the OAuth application"); - entity.Property(e => e.Name).HasComment("The name of the OAuth application"); - entity.Property(e => e.RedirectUris).HasComment("The redirect URIs of the OAuth application"); - entity.Property(e => e.Scopes).HasComment("The scopes requested by the OAuth application"); - entity.Property(e => e.Website).HasComment("The website of the OAuth application"); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.Active).HasComment("Whether or not the token has been activated"); - entity.Property(e => e.Code).HasComment("The auth code for the OAuth token"); - entity.Property(e => e.CreatedAt).HasComment("The created date of the OAuth token"); - entity.Property(e => e.RedirectUri).HasComment("The redirect URI of the OAuth token"); - entity.Property(e => e.Scopes).HasComment("The scopes requested by the OAuth token"); - entity.Property(e => e.Token).HasComment("The OAuth token"); - entity.Property(e => e.SupportsHtmlFormatting) - .HasComment("Whether the client supports HTML inline formatting (bold, italic, strikethrough, ...)") - .HasDefaultValue(true); - entity.Property(e => e.AutoDetectQuotes) - .HasComment("Whether the backend should automatically detect quote posts coming from this client") - .HasDefaultValue(true); - entity.Property(e => e.IsPleroma) - .HasComment("Whether Pleroma or Akkoma specific behavior should be enabled for this client") - .HasDefaultValue(false); - - entity.HasOne(d => d.App) - .WithMany(p => p.OauthTokens) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.OauthTokens) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.Content).HasDefaultValueSql("'[]'::jsonb"); - entity.Property(e => e.CreatedAt).HasComment("The created date of the Page."); - entity.Property(e => e.HideTitleWhenPinned).HasDefaultValue(false); - entity.Property(e => e.LikedCount).HasDefaultValue(0); - entity.Property(e => e.Script).HasDefaultValueSql("''::character varying"); - entity.Property(e => e.UpdatedAt).HasComment("The updated date of the Page."); - entity.Property(e => e.UserId).HasComment("The ID of author."); - entity.Property(e => e.Variables).HasDefaultValueSql("'[]'::jsonb"); - entity.Property(e => e.VisibleUserIds).HasDefaultValueSql("'{}'::character varying[]"); - - entity.HasOne(d => d.EyeCatchingImage) - .WithMany(p => p.Pages) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.Pages) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.HasOne(d => d.Page) - .WithMany(p => p.PageLikes) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.PageLikes) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.HasOne(d => d.User) - .WithMany(p => p.PasswordResetRequests) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.Choices).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.UserHost).HasComment("[Denormalized]"); - entity.Property(e => e.UserId).HasComment("[Denormalized]"); - entity.Property(e => e.NoteVisibility).HasComment("[Denormalized]"); - - entity.HasOne(d => d.Note) - .WithOne(p => p.Poll) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the PollVote."); - - entity.HasOne(d => d.Note) - .WithMany(p => p.PollVotes) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.PollVotes) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.UserId).HasComment("[Denormalized]"); - - entity.HasOne(d => d.Note) - .WithOne(p => p.PromoNote) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the PromoRead."); - - entity.HasOne(d => d.Note) - .WithMany(p => p.PromoReads) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.PromoReads) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the RegistryItem."); - entity.Property(e => e.Key).HasComment("The key of the RegistryItem."); - entity.Property(e => e.Scope).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.UpdatedAt).HasComment("The updated date of the RegistryItem."); - entity.Property(e => e.UserId).HasComment("The owner ID."); - entity.Property(e => e.Value) - .HasDefaultValueSql("'{}'::jsonb") - .HasComment("The value of the RegistryItem."); - - entity.HasOne(d => d.User) - .WithMany(p => p.RegistryItems) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(_ => { }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the Muting."); - entity.Property(e => e.MuteeId).HasComment("The mutee user ID."); - entity.Property(e => e.MuterId).HasComment("The muter user ID."); - - entity.HasOne(d => d.Mutee) - .WithMany(p => p.RenoteMutingMutees) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.Muter) - .WithMany(p => p.RenoteMutingMuters) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.Active) - .HasComment("Whether or not the token has been activated (i.e. 2fa has been confirmed)"); - entity.Property(e => e.CreatedAt).HasComment("The created date of the OAuth token"); - entity.Property(e => e.Token).HasComment("The authorization token"); - - entity.HasOne(d => d.User) - .WithMany(p => p.Sessions) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.SendReadMessage).HasDefaultValue(false); - - entity.HasOne(d => d.User) - .WithMany(p => p.SwSubscriptions) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.Types).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.Policy).HasDefaultValue(PushSubscription.PushPolicy.All); - - entity.HasOne(d => d.User) - .WithMany(p => p.PushSubscriptions) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.OauthToken) - .WithOne(p => p.PushSubscription) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the UserGroup."); - entity.Property(e => e.IsPrivate).HasDefaultValue(false); - entity.Property(e => e.UserId).HasComment("The ID of owner."); - - entity.HasOne(d => d.User) - .WithMany(p => p.UserGroups) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the UserGroupInvitation."); - entity.Property(e => e.UserGroupId).HasComment("The group ID."); - entity.Property(e => e.UserId).HasComment("The user ID."); - - entity.HasOne(d => d.UserGroup) - .WithMany(p => p.UserGroupInvitations) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.UserGroupInvitations) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the UserGroupMember."); - entity.Property(e => e.UserGroupId).HasComment("The group ID."); - entity.Property(e => e.UserId).HasComment("The user ID."); - - entity.HasOne(d => d.UserGroup) - .WithMany(p => p.UserGroupMembers) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.UserGroupMemberships) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.HasOne(d => d.User) - .WithOne(p => p.UserKeypair) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the UserList."); - entity.Property(e => e.HideFromHomeTl) - .HasDefaultValue(false) - .HasComment("Whether posts from list members should be hidden from the home timeline."); - entity.Property(e => e.Name).HasComment("The name of the UserList."); - entity.Property(e => e.UserId).HasComment("The owner ID."); - - entity.HasOne(d => d.User) - .WithMany(p => p.UserLists) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the UserListMember."); - entity.Property(e => e.UserId).HasComment("The user ID."); - entity.Property(e => e.UserListId).HasComment("The list ID."); - - entity.HasOne(d => d.User) - .WithMany(p => p.UserListMembers) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.UserList) - .WithMany(p => p.UserListMembers) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.CreatedAt).HasComment("The created date of the UserNotePins."); - - entity.HasOne(d => d.Note) - .WithMany(p => p.UserNotePins) - .OnDelete(DeleteBehavior.Cascade); - - entity.HasOne(d => d.User) - .WithMany(p => p.UserNotePins) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.Birthday) - .IsFixedLength() - .HasComment("The birthday (YYYY-MM-DD) of the User."); - entity.Property(e => e.Description).HasComment("The description (bio) of the User."); - entity.Property(e => e.Fields).HasDefaultValueSql("'[]'::jsonb"); - entity.Property(e => e.Location).HasComment("The location of the User."); - entity.Property(e => e.Mentions).HasDefaultValueSql("'[]'::jsonb"); - entity.Property(e => e.ModerationNote).HasDefaultValueSql("''::character varying"); - entity.Property(e => e.Url).HasComment("Remote URL of the user."); - entity.Property(e => e.UserHost).HasComment("[Denormalized]"); - entity.Property(e => e.FFVisibility) - .HasDefaultValue(UserProfile.UserProfileFFVisibility.Public); - entity.Property(e => e.MentionsResolved).HasDefaultValue(false); - - entity.HasOne(d => d.PinnedPage) - .WithOne(p => p.UserProfile) - .OnDelete(DeleteBehavior.SetNull); - - entity.HasOne(d => d.User) - .WithOne(p => p.UserProfile) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.HasOne(d => d.User) - .WithOne(p => p.UserPublickey) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.Id).HasComment("Variable-length id given to navigator.credentials.get()"); - entity.Property(e => e.LastUsed) - .HasComment("The date of the last time the UserSecurityKey was successfully validated."); - entity.Property(e => e.Name).HasComment("User-defined name for this key"); - entity.Property(e => e.PublicKey) - .HasComment("Variable-length public key used to verify attestations (hex-encoded)."); - - entity.HasOne(d => d.User) - .WithMany(p => p.UserSecurityKeys) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.PrivateMode).HasDefaultValue(false); - entity.Property(e => e.FilterInaccessible).HasDefaultValue(false); - entity.Property(e => e.DefaultNoteVisibility).HasDefaultValue(Note.NoteVisibility.Public); - entity.Property(e => e.DefaultRenoteVisibility).HasDefaultValue(Note.NoteVisibility.Public); - entity.Property(e => e.AlwaysMarkSensitive).HasDefaultValue(false); - entity.Property(e => e.AutoAcceptFollowed).HasDefaultValue(false); - entity.Property(e => e.Email); - entity.Property(e => e.EmailVerified).HasDefaultValue(false); - entity.Property(e => e.Password); - entity.Property(e => e.TwoFactorEnabled).HasDefaultValue(false); - entity.HasOne(e => e.User).WithOne(e => e.UserSettings); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.Active).HasDefaultValue(true); - entity.Property(e => e.CreatedAt).HasComment("The created date of the Antenna."); - entity.Property(e => e.Name).HasComment("The name of the Antenna."); - entity.Property(e => e.On).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.UserId).HasComment("The owner ID."); - - entity.HasOne(d => d.User) - .WithMany(p => p.Webhooks) - .OnDelete(DeleteBehavior.Cascade); - }); - - modelBuilder.Entity(entity => - { - entity.Property(e => e.Id).ValueGeneratedNever(); - entity.Property(e => e.Status).HasDefaultValue(Job.JobStatus.Queued); - entity.Property(e => e.QueuedAt).HasDefaultValueSql("now()"); - }); - modelBuilder.Entity().ToTable("data_protection_keys"); - modelBuilder.ApplyConfigurationsFromAssembly(typeof(DatabaseContext).Assembly); } diff --git a/Iceshrimp.Backend/Core/Database/Tables/AbuseUserReport.cs b/Iceshrimp.Backend/Core/Database/Tables/AbuseUserReport.cs index 3cb02bc5..24731620 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/AbuseUserReport.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/AbuseUserReport.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -69,4 +70,28 @@ public class AbuseUserReport [ForeignKey(nameof(TargetUserId))] [InverseProperty(nameof(User.AbuseUserReportTargetUsers))] public virtual User TargetUser { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the AbuseUserReport."); + entity.Property(e => e.Forwarded).HasDefaultValue(false); + entity.Property(e => e.ReporterHost).HasComment("[Denormalized]"); + entity.Property(e => e.Resolved).HasDefaultValue(false); + entity.Property(e => e.TargetUserHost).HasComment("[Denormalized]"); + + entity.HasOne(d => d.Assignee) + .WithMany(p => p.AbuseUserReportAssignees) + .OnDelete(DeleteBehavior.SetNull); + + entity.HasOne(d => d.Reporter) + .WithMany(p => p.AbuseUserReportReporters) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.TargetUser) + .WithMany(p => p.AbuseUserReportTargetUsers) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/AllowedInstance.cs b/Iceshrimp.Backend/Core/Database/Tables/AllowedInstance.cs index 875400e9..ded9b5eb 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/AllowedInstance.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/AllowedInstance.cs @@ -14,12 +14,12 @@ public class AllowedInstance public string Host { get; set; } = null!; [Column("imported")] public bool IsImported { get; set; } -} -public class AllowedInstanceEntityTypeConfiguration : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) + private class EntityTypeConfiguration : IEntityTypeConfiguration { - builder.Property(p => p.IsImported).HasDefaultValue(false); + public void Configure(EntityTypeBuilder builder) + { + builder.Property(p => p.IsImported).HasDefaultValue(false); + } } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Announcement.cs b/Iceshrimp.Backend/Core/Database/Tables/Announcement.cs index c0eb9414..0025fd32 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Announcement.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Announcement.cs @@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations.Schema; using EntityFrameworkCore.Projectables; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -45,4 +46,15 @@ public class Announcement [Projectable] public bool IsReadBy(User user) => ReadBy.Contains(user); + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the Announcement."); + entity.Property(e => e.IsGoodNews).HasDefaultValue(false); + entity.Property(e => e.ShowPopup).HasDefaultValue(false); + entity.Property(e => e.UpdatedAt).HasComment("The updated date of the Announcement."); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/AnnouncementRead.cs b/Iceshrimp.Backend/Core/Database/Tables/AnnouncementRead.cs index 79a8b4f9..b5d3f66f 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/AnnouncementRead.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/AnnouncementRead.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -34,4 +35,20 @@ public class AnnouncementRead [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.AnnouncementReads))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the AnnouncementRead."); + + entity.HasOne(d => d.Announcement) + .WithMany(p => p.AnnouncementReads) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.AnnouncementReads) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Antenna.cs b/Iceshrimp.Backend/Core/Database/Tables/Antenna.cs index a147962b..c2762053 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Antenna.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Antenna.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; using NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -91,4 +92,32 @@ public class Antenna [ForeignKey(nameof(UserListId))] [InverseProperty(nameof(Tables.UserList.Antennas))] public virtual UserList? UserList { get; set; } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CaseSensitive).HasDefaultValue(false); + entity.Property(e => e.CreatedAt).HasComment("The created date of the Antenna."); + entity.Property(e => e.ExcludeKeywords).HasDefaultValueSql("'[]'::jsonb"); + entity.Property(e => e.Instances).HasDefaultValueSql("'[]'::jsonb"); + entity.Property(e => e.Keywords).HasDefaultValueSql("'[]'::jsonb"); + entity.Property(e => e.Name).HasComment("The name of the Antenna."); + entity.Property(e => e.UserId).HasComment("The owner ID."); + entity.Property(e => e.Users).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.WithReplies).HasDefaultValue(false); + + entity.HasOne(d => d.UserGroupMember) + .WithMany(p => p.Antennas) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.Antennas) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.UserList) + .WithMany(p => p.Antennas) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/AttestationChallenge.cs b/Iceshrimp.Backend/Core/Database/Tables/AttestationChallenge.cs index e59bc09f..9afe8f69 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/AttestationChallenge.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/AttestationChallenge.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -43,4 +44,20 @@ public class AttestationChallenge [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.AttestationChallenges))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Challenge).HasComment("Hex-encoded sha256 hash of the challenge."); + entity.Property(e => e.CreatedAt).HasComment("The date challenge was created for expiry purposes."); + entity.Property(e => e.RegistrationChallenge) + .HasDefaultValue(false) + .HasComment("Indicates that the challenge is only for registration purposes if true to prevent the challenge for being used as authentication."); + + entity.HasOne(d => d.User) + .WithMany(p => p.AttestationChallenges) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Bite.cs b/Iceshrimp.Backend/Core/Database/Tables/Bite.cs index b0671f70..2bdd2d13 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Bite.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Bite.cs @@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations.Schema; using Iceshrimp.Backend.Core.Configuration; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -57,4 +58,15 @@ public class Bite public string GetPublicUri(string webDomain) => User.IsLocalUser ? $"https://{webDomain}/bites/{Id}" : throw new Exception("Cannot access PublicUri for remote user"); + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.HasOne(d => d.User).WithMany().OnDelete(DeleteBehavior.Cascade); + entity.HasOne(d => d.TargetUser).WithMany().OnDelete(DeleteBehavior.Cascade); + entity.HasOne(d => d.TargetNote).WithMany().OnDelete(DeleteBehavior.Cascade); + entity.HasOne(d => d.TargetBite).WithMany().OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/BlockedInstance.cs b/Iceshrimp.Backend/Core/Database/Tables/BlockedInstance.cs index ac081eab..d19b64d5 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/BlockedInstance.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/BlockedInstance.cs @@ -18,12 +18,12 @@ public class BlockedInstance public string? Reason { get; set; } [Column("imported")] public bool IsImported { get; set; } -} - -public class BlockedInstanceEntityTypeConfiguration : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder builder) + + private class EntityTypeConfiguration : IEntityTypeConfiguration { - builder.Property(p => p.IsImported).HasDefaultValue(false); + public void Configure(EntityTypeBuilder builder) + { + builder.Property(p => p.IsImported).HasDefaultValue(false); + } } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Blocking.cs b/Iceshrimp.Backend/Core/Database/Tables/Blocking.cs index 6d8c013a..30f9ca76 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Blocking.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Blocking.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -43,4 +44,22 @@ public class Blocking [ForeignKey(nameof(BlockerId))] [InverseProperty(nameof(User.OutgoingBlocks))] public virtual User Blocker { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.BlockeeId).HasComment("The blockee user ID."); + entity.Property(e => e.BlockerId).HasComment("The blocker user ID."); + entity.Property(e => e.CreatedAt).HasComment("The created date of the Blocking."); + + entity.HasOne(d => d.Blockee) + .WithMany(p => p.IncomingBlocks) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Blocker) + .WithMany(p => p.OutgoingBlocks) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Channel.cs b/Iceshrimp.Backend/Core/Database/Tables/Channel.cs index b15258ad..2e87b99a 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Channel.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Channel.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -81,4 +82,30 @@ public class Channel [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.Channels))] public virtual User? User { get; set; } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.BannerId).HasComment("The ID of banner Channel."); + entity.Property(e => e.CreatedAt).HasComment("The created date of the Channel."); + entity.Property(e => e.Description).HasComment("The description of the Channel."); + entity.Property(e => e.Name).HasComment("The name of the Channel."); + entity.Property(e => e.NotesCount) + .HasDefaultValue(0) + .HasComment("The count of notes."); + entity.Property(e => e.UserId).HasComment("The owner ID."); + entity.Property(e => e.UsersCount) + .HasDefaultValue(0) + .HasComment("The count of users."); + + entity.HasOne(d => d.Banner) + .WithMany(p => p.Channels) + .OnDelete(DeleteBehavior.SetNull); + + entity.HasOne(d => d.User) + .WithMany(p => p.Channels) + .OnDelete(DeleteBehavior.SetNull); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/ChannelFollowing.cs b/Iceshrimp.Backend/Core/Database/Tables/ChannelFollowing.cs index 51434395..139ada91 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/ChannelFollowing.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/ChannelFollowing.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -43,4 +44,22 @@ public class ChannelFollowing [ForeignKey(nameof(FollowerId))] [InverseProperty(nameof(User.ChannelFollowings))] public virtual User Follower { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the ChannelFollowing."); + entity.Property(e => e.FolloweeId).HasComment("The followee channel ID."); + entity.Property(e => e.FollowerId).HasComment("The follower user ID."); + + entity.HasOne(d => d.Followee) + .WithMany(p => p.ChannelFollowings) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Follower) + .WithMany(p => p.ChannelFollowings) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/ChannelNotePin.cs b/Iceshrimp.Backend/Core/Database/Tables/ChannelNotePin.cs index ef7792b5..93b218d8 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/ChannelNotePin.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/ChannelNotePin.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -33,4 +34,20 @@ public class ChannelNotePin [ForeignKey(nameof(NoteId))] [InverseProperty(nameof(Tables.Note.ChannelNotePins))] public virtual Note Note { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the ChannelNotePin."); + + entity.HasOne(d => d.Channel) + .WithMany(p => p.ChannelNotePins) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Note) + .WithMany(p => p.ChannelNotePins) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Clip.cs b/Iceshrimp.Backend/Core/Database/Tables/Clip.cs index 2d88f4fb..1675b9ad 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Clip.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Clip.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -48,4 +49,20 @@ public class Clip [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.Clips))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the Clip."); + entity.Property(e => e.Description).HasComment("The description of the Clip."); + entity.Property(e => e.IsPublic).HasDefaultValue(false); + entity.Property(e => e.Name).HasComment("The name of the Clip."); + entity.Property(e => e.UserId).HasComment("The owner ID."); + + entity.HasOne(d => d.User) + .WithMany(p => p.Clips) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/ClipNote.cs b/Iceshrimp.Backend/Core/Database/Tables/ClipNote.cs index c3d2ac86..90b60985 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/ClipNote.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/ClipNote.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -36,4 +37,21 @@ public class ClipNote [ForeignKey(nameof(NoteId))] [InverseProperty(nameof(Tables.Note.ClipNotes))] public virtual Note Note { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.ClipId).HasComment("The clip ID."); + entity.Property(e => e.NoteId).HasComment("The note ID."); + + entity.HasOne(d => d.Clip) + .WithMany(p => p.ClipNotes) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Note) + .WithMany(p => p.ClipNotes) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/DriveFile.cs b/Iceshrimp.Backend/Core/Database/Tables/DriveFile.cs index 6e42b237..4c563404 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/DriveFile.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/DriveFile.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; using J = System.Text.Json.Serialization.JsonPropertyNameAttribute; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -201,4 +202,45 @@ public class DriveFile : IEntity [J("width")] public int? Width { get; set; } [J("height")] public int? Height { get; set; } } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Blurhash).HasComment("The BlurHash string."); + entity.Property(e => e.Comment).HasComment("The comment of the DriveFile."); + entity.Property(e => e.CreatedAt).HasComment("The created date of the DriveFile."); + entity.Property(e => e.FolderId) + .HasComment("The parent folder ID. If null, it means the DriveFile is located in root."); + entity.Property(e => e.IsLink) + .HasDefaultValue(false) + .HasComment("Whether the DriveFile is direct link to remote server."); + entity.Property(e => e.IsSensitive) + .HasDefaultValue(false) + .HasComment("Whether the DriveFile is NSFW."); + entity.Property(e => e.Sha256).HasComment("The SHA256 hash of the DriveFile."); + entity.Property(e => e.Name).HasComment("The file name of the DriveFile."); + entity.Property(e => e.Properties) + .HasDefaultValueSql("'{}'::jsonb") + .HasComment("The any properties of the DriveFile. For example, it includes image width/height."); + entity.Property(e => e.RequestHeaders).HasDefaultValueSql("'{}'::jsonb"); + entity.Property(e => e.Size).HasComment("The file size (bytes) of the DriveFile."); + entity.Property(e => e.ThumbnailUrl).HasComment("The URL of the thumbnail of the DriveFile."); + entity.Property(e => e.Type).HasComment("The content type (MIME) of the DriveFile."); + entity.Property(e => e.Uri) + .HasComment("The URI of the DriveFile. it will be null when the DriveFile is local."); + entity.Property(e => e.Url).HasComment("The URL of the DriveFile."); + entity.Property(e => e.UserHost).HasComment("The host of owner. It will be null if the user in local."); + entity.Property(e => e.UserId).HasComment("The owner ID."); + entity.Property(e => e.PublicUrl).HasComment("The URL of the webpublic of the DriveFile."); + + entity.HasOne(d => d.Folder) + .WithMany(p => p.DriveFiles) + .OnDelete(DeleteBehavior.SetNull); + + entity.HasOne(d => d.User) + .WithMany(p => p.DriveFiles) + .OnDelete(DeleteBehavior.SetNull); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/DriveFolder.cs b/Iceshrimp.Backend/Core/Database/Tables/DriveFolder.cs index 700ab699..bbc02a07 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/DriveFolder.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/DriveFolder.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -55,4 +56,24 @@ public class DriveFolder [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.DriveFolders))] public virtual User? User { get; set; } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the DriveFolder."); + entity.Property(e => e.Name).HasComment("The name of the DriveFolder."); + entity.Property(e => e.ParentId) + .HasComment("The parent folder ID. If null, it means the DriveFolder is located in root."); + entity.Property(e => e.UserId).HasComment("The owner ID."); + + entity.HasOne(d => d.Parent) + .WithMany(p => p.InverseParent) + .OnDelete(DeleteBehavior.SetNull); + + entity.HasOne(d => d.User) + .WithMany(p => p.DriveFolders) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Emoji.cs b/Iceshrimp.Backend/Core/Database/Tables/Emoji.cs index 5b5ca7e9..8f0d0a74 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Emoji.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Emoji.cs @@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations.Schema; using Iceshrimp.Backend.Core.Configuration; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -67,4 +68,15 @@ public class Emoji public string? GetPublicUriOrNull(Config.InstanceSection config) => Host == null ? $"https://{config.WebDomain}/emoji/{Name}" : null; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Aliases).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.Height).HasComment("Image height"); + entity.Property(e => e.PublicUrl).HasDefaultValueSql("''::character varying"); + entity.Property(e => e.Width).HasComment("Image width"); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Filter.cs b/Iceshrimp.Backend/Core/Database/Tables/Filter.cs index 3302c1df..360e7b9a 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Filter.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Filter.cs @@ -55,18 +55,18 @@ public class Filter User = user! }; } -} - -public class FilterEntityTypeConfiguration : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder entity) + + private class EntityTypeConfiguration : IEntityTypeConfiguration { - entity.HasOne(p => p.User) - .WithMany(p => p.Filters) - .OnDelete(DeleteBehavior.Cascade) - .HasForeignKey("user_id"); + public void Configure(EntityTypeBuilder entity) + { + entity.HasOne(p => p.User) + .WithMany(p => p.Filters) + .OnDelete(DeleteBehavior.Cascade) + .HasForeignKey("user_id"); - entity.Property(p => p.Keywords).HasDefaultValueSql("'{}'::varchar[]"); - entity.Property(p => p.Contexts).HasDefaultValueSql("'{}'::public.filter_context_enum[]"); + entity.Property(p => p.Keywords).HasDefaultValueSql("'{}'::varchar[]"); + entity.Property(p => p.Contexts).HasDefaultValueSql("'{}'::public.filter_context_enum[]"); + } } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/FollowRequest.cs b/Iceshrimp.Backend/Core/Database/Tables/FollowRequest.cs index f3420da4..739c2c20 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/FollowRequest.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/FollowRequest.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -96,4 +97,29 @@ public class FollowRequest : IEntity [Column("id")] [StringLength(32)] public string Id { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the FollowRequest."); + entity.Property(e => e.FolloweeHost).HasComment("[Denormalized]"); + entity.Property(e => e.FolloweeId).HasComment("The followee user ID."); + entity.Property(e => e.FolloweeInbox).HasComment("[Denormalized]"); + entity.Property(e => e.FolloweeSharedInbox).HasComment("[Denormalized]"); + entity.Property(e => e.FollowerHost).HasComment("[Denormalized]"); + entity.Property(e => e.FollowerId).HasComment("The follower user ID."); + entity.Property(e => e.FollowerInbox).HasComment("[Denormalized]"); + entity.Property(e => e.FollowerSharedInbox).HasComment("[Denormalized]"); + entity.Property(e => e.RequestId).HasComment("id of Follow Activity."); + + entity.HasOne(d => d.Followee) + .WithMany(p => p.IncomingFollowRequests) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Follower) + .WithMany(p => p.OutgoingFollowRequests) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Following.cs b/Iceshrimp.Backend/Core/Database/Tables/Following.cs index 823d5817..1d1e1435 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Following.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Following.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -89,4 +90,28 @@ public class Following [ForeignKey(nameof(FollowerId))] [InverseProperty(nameof(User.OutgoingFollowRelationships))] public virtual User Follower { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the Following."); + entity.Property(e => e.FolloweeHost).HasComment("[Denormalized]"); + entity.Property(e => e.FolloweeId).HasComment("The followee user ID."); + entity.Property(e => e.FolloweeInbox).HasComment("[Denormalized]"); + entity.Property(e => e.FolloweeSharedInbox).HasComment("[Denormalized]"); + entity.Property(e => e.FollowerHost).HasComment("[Denormalized]"); + entity.Property(e => e.FollowerId).HasComment("The follower user ID."); + entity.Property(e => e.FollowerInbox).HasComment("[Denormalized]"); + entity.Property(e => e.FollowerSharedInbox).HasComment("[Denormalized]"); + + entity.HasOne(d => d.Followee) + .WithMany(p => p.IncomingFollowRelationships) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Follower) + .WithMany(p => p.OutgoingFollowRelationships) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/GalleryLike.cs b/Iceshrimp.Backend/Core/Database/Tables/GalleryLike.cs index 56909329..75df6612 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/GalleryLike.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/GalleryLike.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -27,4 +28,18 @@ public class GalleryLike [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.GalleryLikes))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.HasOne(d => d.Post) + .WithMany(p => p.GalleryLikes) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.GalleryLikes) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/GalleryPost.cs b/Iceshrimp.Backend/Core/Database/Tables/GalleryPost.cs index 7fb34ea6..54d29767 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/GalleryPost.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/GalleryPost.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -64,4 +65,24 @@ public class GalleryPost [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.GalleryPosts))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the GalleryPost."); + entity.Property(e => e.FileIds).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.IsSensitive) + .HasDefaultValue(false) + .HasComment("Whether the post is sensitive."); + entity.Property(e => e.LikedCount).HasDefaultValue(0); + entity.Property(e => e.Tags).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.UpdatedAt).HasComment("The updated date of the GalleryPost."); + entity.Property(e => e.UserId).HasComment("The ID of author."); + + entity.HasOne(d => d.User) + .WithMany(p => p.GalleryPosts) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Hashtag.cs b/Iceshrimp.Backend/Core/Database/Tables/Hashtag.cs index 6e14bbbd..2b2bb912 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Hashtag.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Hashtag.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -14,4 +15,9 @@ public class Hashtag : IEntity [Column("id")] [StringLength(32)] public string Id { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) { } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Instance.cs b/Iceshrimp.Backend/Core/Database/Tables/Instance.cs index 2a75e783..5838c8fe 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Instance.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Instance.cs @@ -2,6 +2,7 @@ using System.ComponentModel.DataAnnotations.Schema; using EntityFrameworkCore.Projectables; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -103,4 +104,24 @@ public class Instance [NotMapped] [Projectable] public bool NeedsUpdate => InfoUpdatedAt == null || InfoUpdatedAt < DateTime.Now - TimeSpan.FromHours(24); + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CaughtAt).HasComment("The caught date of the Instance."); + entity.Property(e => e.OutgoingFollows).HasDefaultValue(0); + entity.Property(e => e.IncomingFollows).HasDefaultValue(0); + entity.Property(e => e.Host).HasComment("The host of the Instance."); + entity.Property(e => e.IsNotResponding).HasDefaultValue(false); + entity.Property(e => e.IsSuspended).HasDefaultValue(false); + entity.Property(e => e.NotesCount) + .HasDefaultValue(0) + .HasComment("The count of the notes of the Instance."); + entity.Property(e => e.SoftwareName).HasComment("The software of the Instance."); + entity.Property(e => e.UsersCount) + .HasDefaultValue(0) + .HasComment("The count of the users of the Instance."); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Job.cs b/Iceshrimp.Backend/Core/Database/Tables/Job.cs index fd5b4cb8..e23b55a4 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Job.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Job.cs @@ -3,6 +3,7 @@ using System.ComponentModel.DataAnnotations.Schema; using EntityFrameworkCore.Projectables; using Iceshrimp.Backend.Core.Extensions; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -45,4 +46,14 @@ public class Job [NotMapped] public long QueueDuration => ((StartedAt ?? DateTime.UtcNow) - QueuedAt).GetTotalMilliseconds(); [NotMapped] [Projectable] public DateTime LastUpdatedAt => FinishedAt ?? StartedAt ?? QueuedAt; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Id).ValueGeneratedNever(); + entity.Property(e => e.Status).HasDefaultValue(JobStatus.Queued); + entity.Property(e => e.QueuedAt).HasDefaultValueSql("now()"); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Marker.cs b/Iceshrimp.Backend/Core/Database/Tables/Marker.cs index db59f2af..5a1e43aa 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Marker.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Marker.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; using NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -32,4 +33,16 @@ public class Marker [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.Markers))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(d => d.Version).HasDefaultValue(0); + + entity.HasOne(d => d.User) + .WithMany(p => p.Markers) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/MessagingMessage.cs b/Iceshrimp.Backend/Core/Database/Tables/MessagingMessage.cs index 98c4b4eb..6aac3055 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/MessagingMessage.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/MessagingMessage.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -69,4 +70,33 @@ public class MessagingMessage [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.MessagingMessageUsers))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the MessagingMessage."); + entity.Property(e => e.GroupId).HasComment("The recipient group ID."); + entity.Property(e => e.IsRead).HasDefaultValue(false); + entity.Property(e => e.Reads).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.RecipientId).HasComment("The recipient user ID."); + entity.Property(e => e.UserId).HasComment("The sender user ID."); + + entity.HasOne(d => d.File) + .WithMany(p => p.MessagingMessages) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Group) + .WithMany(p => p.MessagingMessages) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Recipient) + .WithMany(p => p.MessagingMessageRecipients) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.MessagingMessageUsers) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Meta.cs b/Iceshrimp.Backend/Core/Database/Tables/Meta.cs index b4e9fa45..190106da 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Meta.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Meta.cs @@ -1,5 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -283,4 +285,62 @@ public class Meta [Column("autofollowedAccount")] [StringLength(128)] public string? AutofollowedAccount { get; set; } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.AllowedHosts).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.BlockedHosts).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.CacheRemoteFiles).HasDefaultValue(false); + entity.Property(e => e.CustomMotd).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.CustomSplashIcons).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.DeeplIsPro).HasDefaultValue(false); + entity.Property(e => e.DefaultReaction).HasDefaultValueSql("'⭐'::character varying"); + entity.Property(e => e.DisableGlobalTimeline).HasDefaultValue(false); + entity.Property(e => e.DisableLocalTimeline).HasDefaultValue(false); + entity.Property(e => e.DisableRecommendedTimeline).HasDefaultValue(true); + entity.Property(e => e.DisableRegistration).HasDefaultValue(false); + entity.Property(e => e.EmailRequiredForSignup).HasDefaultValue(false); + entity.Property(e => e.EnableActiveEmailValidation).HasDefaultValue(true); + entity.Property(e => e.EnableDiscordIntegration).HasDefaultValue(false); + entity.Property(e => e.EnableEmail).HasDefaultValue(false); + entity.Property(e => e.EnableGithubIntegration).HasDefaultValue(false); + entity.Property(e => e.EnableHcaptcha).HasDefaultValue(false); + entity.Property(e => e.EnableIdenticonGeneration).HasDefaultValue(true); + entity.Property(e => e.EnableIpLogging).HasDefaultValue(false); + entity.Property(e => e.EnableRecaptcha).HasDefaultValue(false); + entity.Property(e => e.EnableServerMachineStats).HasDefaultValue(false); + entity.Property(e => e.ErrorImageUrl) + .HasDefaultValueSql("'/static-assets/badges/error.png'::character varying"); + entity.Property(e => e.ExperimentalFeatures).HasDefaultValueSql("'{}'::jsonb"); + entity.Property(e => e.FeedbackUrl) + .HasDefaultValueSql("'https://iceshrimp.dev/iceshrimp/iceshrimp/issues/new'::character varying"); + entity.Property(e => e.HiddenTags).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.Langs).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.LocalDriveCapacityMb) + .HasDefaultValue(1024) + .HasComment("Drive capacity of a local user (MB)"); + entity.Property(e => e.MascotImageUrl) + .HasDefaultValueSql("'/static-assets/badges/info.png'::character varying"); + entity.Property(e => e.ObjectStorageS3ForcePathStyle).HasDefaultValue(true); + entity.Property(e => e.ObjectStorageSetPublicRead).HasDefaultValue(false); + entity.Property(e => e.ObjectStorageUseProxy).HasDefaultValue(true); + entity.Property(e => e.ObjectStorageUseSsl).HasDefaultValue(true); + entity.Property(e => e.PinnedPages) + .HasDefaultValueSql("'{/featured,/channels,/explore,/pages,/about-iceshrimp}'::character varying[]"); + entity.Property(e => e.PinnedUsers).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.PrivateMode).HasDefaultValue(false); + entity.Property(e => e.RecommendedInstances).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.RemoteDriveCapacityMb) + .HasDefaultValue(32) + .HasComment("Drive capacity of a remote user (MB)"); + entity.Property(e => e.RepositoryUrl) + .HasDefaultValueSql("'https://iceshrimp.dev/iceshrimp/iceshrimp'::character varying"); + entity.Property(e => e.SecureMode).HasDefaultValue(true); + entity.Property(e => e.SilencedHosts).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.SmtpSecure).HasDefaultValue(false); + entity.Property(e => e.UseObjectStorage).HasDefaultValue(false); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/ModerationLog.cs b/Iceshrimp.Backend/Core/Database/Tables/ModerationLog.cs index 0e26fe9f..c9da4dac 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/ModerationLog.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/ModerationLog.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -29,4 +30,16 @@ public class ModerationLog [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.ModerationLogs))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the ModerationLog."); + + entity.HasOne(d => d.User) + .WithMany(p => p.ModerationLogs) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Muting.cs b/Iceshrimp.Backend/Core/Database/Tables/Muting.cs index eb79cafe..e8af50cb 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Muting.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Muting.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -46,4 +47,22 @@ public class Muting [ForeignKey(nameof(MuterId))] [InverseProperty(nameof(User.OutgoingMutes))] public virtual User Muter { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the Muting."); + entity.Property(e => e.MuteeId).HasComment("The mutee user ID."); + entity.Property(e => e.MuterId).HasComment("The muter user ID."); + + entity.HasOne(d => d.Mutee) + .WithMany(p => p.IncomingMutes) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Muter) + .WithMany(p => p.OutgoingMutes) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Note.cs b/Iceshrimp.Backend/Core/Database/Tables/Note.cs index eed747bb..91b9c46c 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Note.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Note.cs @@ -5,6 +5,7 @@ using EntityFrameworkCore.Projectables; using Iceshrimp.Backend.Core.Configuration; using Iceshrimp.Backend.Core.Helpers; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; using NpgsqlTypes; using J = System.Text.Json.Serialization.JsonPropertyNameAttribute; @@ -371,4 +372,72 @@ public class Note : IEntity [J("username")] public required string Username { get; set; } [J("host")] public required string? Host { get; set; } } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.HasIndex(e => e.Mentions, "GIN_note_mentions").HasMethod("gin"); + entity.HasIndex(e => e.Tags, "GIN_note_tags").HasMethod("gin"); + entity.HasIndex(e => e.VisibleUserIds, "GIN_note_visibleUserIds").HasMethod("gin"); + entity.HasIndex(e => e.Text, "GIN_TRGM_note_text") + .HasMethod("gin") + .HasOperators("gin_trgm_ops"); + entity.HasIndex(e => e.Cw, "GIN_TRGM_note_cw") + .HasMethod("gin") + .HasOperators("gin_trgm_ops"); + entity.HasIndex(e => e.CombinedAltText, "GIN_TRGM_note_combined_alt_text") + .HasMethod("gin") + .HasOperators("gin_trgm_ops"); + + entity.Property(e => e.AttachedFileTypes).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.ChannelId).HasComment("The ID of source channel."); + entity.Property(e => e.CreatedAt).HasComment("The created date of the Note."); + entity.Property(e => e.Emojis).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.FileIds).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.HasPoll).HasDefaultValue(false); + entity.Property(e => e.LikeCount).HasDefaultValue(0); + entity.Property(e => e.LocalOnly).HasDefaultValue(false); + entity.Property(e => e.MentionedRemoteUsers).HasDefaultValueSql("'[]'::jsonb"); + entity.Property(e => e.Mentions).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.Reactions).HasDefaultValueSql("'{}'::jsonb"); + entity.Property(e => e.RenoteCount).HasDefaultValue((short)0); + entity.Property(e => e.RenoteId).HasComment("The ID of renote target."); + entity.Property(e => e.RenoteUserHost).HasComment("[Denormalized]"); + entity.Property(e => e.RenoteUserId).HasComment("[Denormalized]"); + entity.Property(e => e.RepliesCount).HasDefaultValue((short)0); + entity.Property(e => e.ReplyId).HasComment("The ID of reply target."); + entity.Property(e => e.ReplyUserHost).HasComment("[Denormalized]"); + entity.Property(e => e.ReplyUserId).HasComment("[Denormalized]"); + entity.Property(e => e.Score).HasDefaultValue(0); + entity.Property(e => e.Tags).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.UpdatedAt).HasComment("The updated date of the Note."); + entity.Property(e => e.Uri).HasComment("The URI of a note. it will be null when the note is local."); + entity.Property(e => e.Url) + .HasComment("The human readable url of a note. it will be null when the note is local."); + entity.Property(e => e.UserHost).HasComment("[Denormalized]"); + entity.Property(e => e.UserId).HasComment("The ID of author."); + entity.Property(e => e.VisibleUserIds).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.ReplyUri) + .HasComment("The URI of the reply target, if it couldn't be resolved at time of ingestion."); + entity.Property(e => e.RenoteUri) + .HasComment("The URI of the renote target, if it couldn't be resolved at time of ingestion."); + + entity.HasOne(d => d.Channel) + .WithMany(p => p.Notes) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Renote) + .WithMany(p => p.InverseRenote) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Reply) + .WithMany(p => p.InverseReply) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.Notes) + .OnDelete(DeleteBehavior.Cascade); + } + } } diff --git a/Iceshrimp.Backend/Core/Database/Tables/NoteBookmark.cs b/Iceshrimp.Backend/Core/Database/Tables/NoteBookmark.cs index 02220ef3..fd57eaaf 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/NoteBookmark.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/NoteBookmark.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -31,4 +32,20 @@ public class NoteBookmark [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.NoteBookmarks))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the NoteBookmark."); + + entity.HasOne(d => d.Note) + .WithMany(p => p.NoteBookmarks) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.NoteBookmarks) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/NoteEdit.cs b/Iceshrimp.Backend/Core/Database/Tables/NoteEdit.cs index 90037e47..335e76e7 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/NoteEdit.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/NoteEdit.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -36,4 +37,18 @@ public class NoteEdit [ForeignKey(nameof(NoteId))] [InverseProperty(nameof(Tables.Note.NoteEdits))] public virtual Note Note { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.FileIds).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.NoteId).HasComment("The ID of note."); + entity.Property(e => e.UpdatedAt).HasComment("The updated date of the Note."); + + entity.HasOne(d => d.Note) + .WithMany(p => p.NoteEdits) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/NoteLike.cs b/Iceshrimp.Backend/Core/Database/Tables/NoteLike.cs index 49de3e26..92241fbf 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/NoteLike.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/NoteLike.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -28,4 +29,18 @@ public class NoteLike : IEntity [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.NoteLikes))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.HasOne(d => d.Note) + .WithMany(p => p.NoteLikes) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.NoteLikes) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/NoteReaction.cs b/Iceshrimp.Backend/Core/Database/Tables/NoteReaction.cs index dbb243d3..5870ab6f 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/NoteReaction.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/NoteReaction.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -37,4 +38,20 @@ public class NoteReaction [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.NoteReactions))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the NoteReaction."); + + entity.HasOne(d => d.Note) + .WithMany(p => p.NoteReactions) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.NoteReactions) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/NoteThreadMuting.cs b/Iceshrimp.Backend/Core/Database/Tables/NoteThreadMuting.cs index 9fffdf74..75839393 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/NoteThreadMuting.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/NoteThreadMuting.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -30,4 +31,14 @@ public class NoteThreadMuting [ForeignKey(nameof(ThreadId))] [InverseProperty(nameof(NoteThread.NoteThreadMutings))] public virtual NoteThread Thread { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.HasOne(d => d.User) + .WithMany(p => p.NoteThreadMutings) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/NoteUnread.cs b/Iceshrimp.Backend/Core/Database/Tables/NoteUnread.cs index 413d99c7..2644b39b 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/NoteUnread.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/NoteUnread.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -48,4 +49,21 @@ public class NoteUnread [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.NoteUnreads))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.NoteChannelId).HasComment("[Denormalized]"); + entity.Property(e => e.NoteUserId).HasComment("[Denormalized]"); + + entity.HasOne(d => d.Note) + .WithMany(p => p.NoteUnreads) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.NoteUnreads) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/NoteWatching.cs b/Iceshrimp.Backend/Core/Database/Tables/NoteWatching.cs index f8dd2e08..9d48ee29 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/NoteWatching.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/NoteWatching.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -51,4 +52,23 @@ public class NoteWatching [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.NoteWatchings))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the NoteWatching."); + entity.Property(e => e.NoteId).HasComment("The target Note ID."); + entity.Property(e => e.NoteUserId).HasComment("[Denormalized]"); + entity.Property(e => e.UserId).HasComment("The watcher ID."); + + entity.HasOne(d => d.Note) + .WithMany(p => p.NoteWatchings) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.NoteWatchings) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Notification.cs b/Iceshrimp.Backend/Core/Database/Tables/Notification.cs index d60f4059..56ff2118 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Notification.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Notification.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; using NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -133,4 +134,38 @@ public class Notification : IEntity Note = Note?.WithPrecomputedVisibilities(reply, renote, renoteRenote); return this; } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the Notification."); + entity.Property(e => e.IsRead) + .HasDefaultValue(false) + .HasComment("Whether the notification was read."); + entity.Property(e => e.NotifieeId).HasComment("The ID of recipient user of the Notification."); + entity.Property(e => e.NotifierId).HasComment("The ID of sender user of the Notification."); + entity.Property(e => e.Type).HasComment("The type of the Notification."); + + entity.HasOne(d => d.FollowRequest) + .WithMany(p => p.Notifications) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Note) + .WithMany(p => p.Notifications) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Notifiee) + .WithMany(p => p.NotificationNotifiees) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Notifier) + .WithMany(p => p.NotificationNotifiers) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.UserGroupInvitation) + .WithMany(p => p.Notifications) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/OauthApp.cs b/Iceshrimp.Backend/Core/Database/Tables/OauthApp.cs index 2333b539..dee63f45 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/OauthApp.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/OauthApp.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -67,4 +68,18 @@ public class OauthApp /// [Column("appToken")] [StringLength(64)] public string? Token; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.ClientId).HasComment("The client id of the OAuth application"); + entity.Property(e => e.ClientSecret).HasComment("The client secret of the OAuth application"); + entity.Property(e => e.CreatedAt).HasComment("The created date of the OAuth application"); + entity.Property(e => e.Name).HasComment("The name of the OAuth application"); + entity.Property(e => e.RedirectUris).HasComment("The redirect URIs of the OAuth application"); + entity.Property(e => e.Scopes).HasComment("The scopes requested by the OAuth application"); + entity.Property(e => e.Website).HasComment("The website of the OAuth application"); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/OauthToken.cs b/Iceshrimp.Backend/Core/Database/Tables/OauthToken.cs index f7f41f5b..f3c4fc88 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/OauthToken.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/OauthToken.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -73,4 +74,34 @@ public class OauthToken [Column("isPleroma")] public bool IsPleroma { get; set; } [Column("lastActiveDate")] public DateTime? LastActiveDate { get; set; } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Active).HasComment("Whether or not the token has been activated"); + entity.Property(e => e.Code).HasComment("The auth code for the OAuth token"); + entity.Property(e => e.CreatedAt).HasComment("The created date of the OAuth token"); + entity.Property(e => e.RedirectUri).HasComment("The redirect URI of the OAuth token"); + entity.Property(e => e.Scopes).HasComment("The scopes requested by the OAuth token"); + entity.Property(e => e.Token).HasComment("The OAuth token"); + entity.Property(e => e.SupportsHtmlFormatting) + .HasComment("Whether the client supports HTML inline formatting (bold, italic, strikethrough, ...)") + .HasDefaultValue(true); + entity.Property(e => e.AutoDetectQuotes) + .HasComment("Whether the backend should automatically detect quote posts coming from this client") + .HasDefaultValue(true); + entity.Property(e => e.IsPleroma) + .HasComment("Whether Pleroma or Akkoma specific behavior should be enabled for this client") + .HasDefaultValue(false); + + entity.HasOne(d => d.App) + .WithMany(p => p.OauthTokens) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.OauthTokens) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Page.cs b/Iceshrimp.Backend/Core/Database/Tables/Page.cs index 856f310a..67c89e4d 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Page.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Page.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; using NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -98,4 +99,28 @@ public class Page [InverseProperty(nameof(Tables.UserProfile.PinnedPage))] public virtual UserProfile? UserProfile { get; set; } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Content).HasDefaultValueSql("'[]'::jsonb"); + entity.Property(e => e.CreatedAt).HasComment("The created date of the Page."); + entity.Property(e => e.HideTitleWhenPinned).HasDefaultValue(false); + entity.Property(e => e.LikedCount).HasDefaultValue(0); + entity.Property(e => e.Script).HasDefaultValueSql("''::character varying"); + entity.Property(e => e.UpdatedAt).HasComment("The updated date of the Page."); + entity.Property(e => e.UserId).HasComment("The ID of author."); + entity.Property(e => e.Variables).HasDefaultValueSql("'[]'::jsonb"); + entity.Property(e => e.VisibleUserIds).HasDefaultValueSql("'{}'::character varying[]"); + + entity.HasOne(d => d.EyeCatchingImage) + .WithMany(p => p.Pages) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.Pages) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/PageLike.cs b/Iceshrimp.Backend/Core/Database/Tables/PageLike.cs index 69805fa3..b6e52dbc 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/PageLike.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/PageLike.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -27,4 +28,18 @@ public class PageLike [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.PageLikes))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.HasOne(d => d.Page) + .WithMany(p => p.PageLikes) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.PageLikes) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/PasswordResetRequest.cs b/Iceshrimp.Backend/Core/Database/Tables/PasswordResetRequest.cs index a326fb6d..e7b6b640 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/PasswordResetRequest.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/PasswordResetRequest.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -23,4 +24,14 @@ public class PasswordResetRequest [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.PasswordResetRequests))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.HasOne(d => d.User) + .WithMany(p => p.PasswordResetRequests) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/PluginStoreEntry.cs b/Iceshrimp.Backend/Core/Database/Tables/PluginStoreEntry.cs index 6b56289d..7e32a65a 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/PluginStoreEntry.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/PluginStoreEntry.cs @@ -12,12 +12,14 @@ public class PluginStoreEntry [Key] [Column("id")] public Guid Id { get; set; } [Column("name")] public string Name { get; set; } = null!; [Column("data", TypeName = "jsonb")] public string Data { get; set; } = null!; -} -public class PluginStoreEntityTypeConfiguration : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder entity) + private class EntityTypeConfiguration : IEntityTypeConfiguration { - entity.Property(e => e.Data).HasDefaultValueSql("'{}'::jsonb").HasComment("The plugin-specific data object"); + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Data) + .HasDefaultValueSql("'{}'::jsonb") + .HasComment("The plugin-specific data object"); + } } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/PolicyConfiguration.cs b/Iceshrimp.Backend/Core/Database/Tables/PolicyConfiguration.cs index 464bac39..b0735929 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/PolicyConfiguration.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/PolicyConfiguration.cs @@ -10,12 +10,12 @@ public class PolicyConfiguration { [Key] [Column("name")] public string Name { get; set; } = null!; [Column("data", TypeName = "jsonb")] public string Data { get; set; } = null!; -} - -public class PolicyConfigurationeEntityTypeConfiguration : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder entity) + + private class EntityTypeConfiguration : IEntityTypeConfiguration { - entity.Property(e => e.Data).HasDefaultValueSql("'{}'::jsonb").HasComment("The plugin-specific data object"); + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Data).HasDefaultValueSql("'{}'::jsonb").HasComment("The plugin-specific data object"); + } } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Poll.cs b/Iceshrimp.Backend/Core/Database/Tables/Poll.cs index 27f7e180..8edb3b42 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Poll.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Poll.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -48,4 +49,19 @@ public class Poll /// [Column("noteVisibility")] public Note.NoteVisibility NoteVisibility { get; set; } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Choices).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.UserHost).HasComment("[Denormalized]"); + entity.Property(e => e.UserId).HasComment("[Denormalized]"); + entity.Property(e => e.NoteVisibility).HasComment("[Denormalized]"); + + entity.HasOne(d => d.Note) + .WithOne(p => p.Poll) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/PollVote.cs b/Iceshrimp.Backend/Core/Database/Tables/PollVote.cs index 15255e08..4036fb23 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/PollVote.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/PollVote.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -35,4 +36,20 @@ public class PollVote [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.PollVotes))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the PollVote."); + + entity.HasOne(d => d.Note) + .WithMany(p => p.PollVotes) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.PollVotes) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/PromoNote.cs b/Iceshrimp.Backend/Core/Database/Tables/PromoNote.cs index 25d7984a..35b191ce 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/PromoNote.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/PromoNote.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -25,4 +26,16 @@ public class PromoNote [ForeignKey(nameof(NoteId))] [InverseProperty(nameof(Tables.Note.PromoNote))] public virtual Note Note { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.UserId).HasComment("[Denormalized]"); + + entity.HasOne(d => d.Note) + .WithOne(p => p.PromoNote) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/PromoRead.cs b/Iceshrimp.Backend/Core/Database/Tables/PromoRead.cs index 28935f54..ccf7e2b2 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/PromoRead.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/PromoRead.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -31,4 +32,20 @@ public class PromoRead [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.PromoReads))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the PromoRead."); + + entity.HasOne(d => d.Note) + .WithMany(p => p.PromoReads) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.PromoReads) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/PushSubscription.cs b/Iceshrimp.Backend/Core/Database/Tables/PushSubscription.cs index 00369d98..d329e7af 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/PushSubscription.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/PushSubscription.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; using NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -54,4 +55,21 @@ public class PushSubscription [ForeignKey(nameof(OauthTokenId))] [InverseProperty(nameof(Tables.OauthToken.PushSubscription))] public virtual OauthToken OauthToken { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Types).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.Policy).HasDefaultValue(PushPolicy.All); + + entity.HasOne(d => d.User) + .WithMany(p => p.PushSubscriptions) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.OauthToken) + .WithOne(p => p.PushSubscription) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/RegistrationInvite.cs b/Iceshrimp.Backend/Core/Database/Tables/RegistrationInvite.cs index 80217a7b..cf628965 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/RegistrationInvite.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/RegistrationInvite.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -16,4 +17,9 @@ public class RegistrationInvite [Column("createdAt")] public DateTime CreatedAt { get; set; } [Column("code")] [StringLength(64)] public string Code { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) { } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/RegistryItem.cs b/Iceshrimp.Backend/Core/Database/Tables/RegistryItem.cs index 3187c548..3f8d67dc 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/RegistryItem.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/RegistryItem.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -56,4 +57,23 @@ public class RegistryItem [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.RegistryItems))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the RegistryItem."); + entity.Property(e => e.Key).HasComment("The key of the RegistryItem."); + entity.Property(e => e.Scope).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.UpdatedAt).HasComment("The updated date of the RegistryItem."); + entity.Property(e => e.UserId).HasComment("The owner ID."); + entity.Property(e => e.Value) + .HasDefaultValueSql("'{}'::jsonb") + .HasComment("The value of the RegistryItem."); + + entity.HasOne(d => d.User) + .WithMany(p => p.RegistryItems) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Relay.cs b/Iceshrimp.Backend/Core/Database/Tables/Relay.cs index c139032c..e9858094 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Relay.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Relay.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; using NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -13,8 +14,8 @@ public class Relay public enum RelayStatus { [PgName("requesting")] Requesting = 0, - [PgName("accepted")] Accepted = 1, - [PgName("rejected")] Rejected = 2 + [PgName("accepted")] Accepted = 1, + [PgName("rejected")] Rejected = 2 } [Key] @@ -25,4 +26,9 @@ public class Relay [Column("inbox")] [StringLength(512)] public string Inbox { get; set; } = null!; [Column("status")] public RelayStatus Status { get; set; } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) { } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/RenoteMuting.cs b/Iceshrimp.Backend/Core/Database/Tables/RenoteMuting.cs index 6a9b6eb4..2d44551e 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/RenoteMuting.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/RenoteMuting.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -43,4 +44,22 @@ public class RenoteMuting [ForeignKey(nameof(MuterId))] [InverseProperty(nameof(User.RenoteMutingMuters))] public virtual User Muter { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the Muting."); + entity.Property(e => e.MuteeId).HasComment("The mutee user ID."); + entity.Property(e => e.MuterId).HasComment("The muter user ID."); + + entity.HasOne(d => d.Mutee) + .WithMany(p => p.RenoteMutingMutees) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.Muter) + .WithMany(p => p.RenoteMutingMuters) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Session.cs b/Iceshrimp.Backend/Core/Database/Tables/Session.cs index 42c93c4d..058fdef1 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Session.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Session.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -39,4 +40,19 @@ public class Session public virtual User User { get; set; } = null!; [Column("lastActiveDate")] public DateTime? LastActiveDate { get; set; } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Active) + .HasComment("Whether or not the token has been activated (i.e. 2fa has been confirmed)"); + entity.Property(e => e.CreatedAt).HasComment("The created date of the OAuth token"); + entity.Property(e => e.Token).HasComment("The authorization token"); + + entity.HasOne(d => d.User) + .WithMany(p => p.Sessions) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/SwSubscription.cs b/Iceshrimp.Backend/Core/Database/Tables/SwSubscription.cs index 91d6e29b..94029ed6 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/SwSubscription.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/SwSubscription.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -32,4 +33,16 @@ public class SwSubscription [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.SwSubscriptions))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.SendReadMessage).HasDefaultValue(false); + + entity.HasOne(d => d.User) + .WithMany(p => p.SwSubscriptions) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UsedUsername.cs b/Iceshrimp.Backend/Core/Database/Tables/UsedUsername.cs index 658b0556..8c715897 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UsedUsername.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UsedUsername.cs @@ -1,5 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -12,4 +14,9 @@ public class UsedUsername public string Username { get; set; } = null!; [Column("createdAt")] public DateTime CreatedAt { get; set; } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) { } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/User.cs b/Iceshrimp.Backend/Core/Database/Tables/User.cs index 3b3bd025..00c78c6a 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/User.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/User.cs @@ -633,87 +633,87 @@ public class User : IEntity [Projectable] public string PublicUrlPath => $"/@{Username}"; public string GetIdenticonUrl(string webDomain) => $"https://{webDomain}{IdenticonUrlPath}"; -} -public class UserEntityTypeConfiguration : IEntityTypeConfiguration -{ - public void Configure(EntityTypeBuilder entity) + private class EntityTypeConfiguration : IEntityTypeConfiguration { - entity.Property(e => e.AlsoKnownAs).HasComment("URIs the user is known as too"); - entity.Property(e => e.AvatarBlurhash).HasComment("The blurhash of the avatar DriveFile"); - entity.Property(e => e.AvatarId).HasComment("The ID of avatar DriveFile."); - entity.Property(e => e.AvatarUrl).HasComment("The URL of the avatar DriveFile"); - entity.Property(e => e.BannerBlurhash).HasComment("The blurhash of the banner DriveFile"); - entity.Property(e => e.BannerId).HasComment("The ID of banner DriveFile."); - entity.Property(e => e.BannerUrl).HasComment("The URL of the banner DriveFile"); - entity.Property(e => e.CreatedAt).HasComment("The created date of the User."); - entity.Property(e => e.DriveCapacityOverrideMb).HasComment("Overrides user drive capacity limit"); - entity.Property(e => e.Emojis).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.Featured) - .HasComment("The featured URL of the User. It will be null if the origin of the user is local."); - entity.Property(e => e.FollowersCount) - .HasDefaultValue(0) - .HasComment("The count of followers."); - entity.Property(e => e.FollowersUri) - .HasComment("The URI of the user Follower Collection. It will be null if the origin of the user is local."); - entity.Property(e => e.FollowingCount) - .HasDefaultValue(0) - .HasComment("The count of following."); - entity.Property(e => e.Host) - .HasComment("The host of the User. It will be null if the origin of the user is local."); - entity.Property(e => e.Inbox) - .HasComment("The inbox URL of the User. It will be null if the origin of the user is local."); - entity.Property(e => e.IsAdmin) - .HasDefaultValue(false) - .HasComment("Whether the User is the admin."); - entity.Property(e => e.IsBot) - .HasDefaultValue(false) - .HasComment("Whether the User is a bot."); - entity.Property(e => e.IsCat) - .HasDefaultValue(false) - .HasComment("Whether the User is a cat."); - entity.Property(e => e.IsDeleted) - .HasDefaultValue(false) - .HasComment("Whether the User is deleted."); - entity.Property(e => e.IsExplorable) - .HasDefaultValue(true) - .HasComment("Whether the User is explorable."); - entity.Property(e => e.IsLocked) - .HasDefaultValue(false) - .HasComment("Whether the User is locked."); - entity.Property(e => e.IsModerator) - .HasDefaultValue(false) - .HasComment("Whether the User is a moderator."); - entity.Property(e => e.IsSilenced) - .HasDefaultValue(false) - .HasComment("Whether the User is silenced."); - entity.Property(e => e.IsSuspended) - .HasDefaultValue(false) - .HasComment("Whether the User is suspended."); - entity.Property(e => e.MovedToUri).HasComment("The URI of the new account of the User"); - entity.Property(e => e.DisplayName).HasComment("The name of the User."); - entity.Property(e => e.NotesCount) - .HasDefaultValue(0) - .HasComment("The count of notes."); - entity.Property(e => e.SharedInbox) - .HasComment("The sharedInbox URL of the User. It will be null if the origin of the user is local."); - entity.Property(e => e.SpeakAsCat) - .HasDefaultValue(true) - .HasComment("Whether to speak as a cat if isCat."); - entity.Property(e => e.Tags).HasDefaultValueSql("'{}'::character varying[]"); - entity.Property(e => e.UpdatedAt).HasComment("The updated date of the User."); - entity.Property(e => e.Uri) - .HasComment("The URI of the User. It will be null if the origin of the user is local."); - entity.Property(e => e.Username).HasComment("The username of the User."); - entity.Property(e => e.UsernameLower).HasComment("The username (lowercased) of the User."); - entity.Property(e => e.SplitDomainResolved).HasDefaultValue(false); + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.AlsoKnownAs).HasComment("URIs the user is known as too"); + entity.Property(e => e.AvatarBlurhash).HasComment("The blurhash of the avatar DriveFile"); + entity.Property(e => e.AvatarId).HasComment("The ID of avatar DriveFile."); + entity.Property(e => e.AvatarUrl).HasComment("The URL of the avatar DriveFile"); + entity.Property(e => e.BannerBlurhash).HasComment("The blurhash of the banner DriveFile"); + entity.Property(e => e.BannerId).HasComment("The ID of banner DriveFile."); + entity.Property(e => e.BannerUrl).HasComment("The URL of the banner DriveFile"); + entity.Property(e => e.CreatedAt).HasComment("The created date of the User."); + entity.Property(e => e.DriveCapacityOverrideMb).HasComment("Overrides user drive capacity limit"); + entity.Property(e => e.Emojis).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.Featured) + .HasComment("The featured URL of the User. It will be null if the origin of the user is local."); + entity.Property(e => e.FollowersCount) + .HasDefaultValue(0) + .HasComment("The count of followers."); + entity.Property(e => e.FollowersUri) + .HasComment("The URI of the user Follower Collection. It will be null if the origin of the user is local."); + entity.Property(e => e.FollowingCount) + .HasDefaultValue(0) + .HasComment("The count of following."); + entity.Property(e => e.Host) + .HasComment("The host of the User. It will be null if the origin of the user is local."); + entity.Property(e => e.Inbox) + .HasComment("The inbox URL of the User. It will be null if the origin of the user is local."); + entity.Property(e => e.IsAdmin) + .HasDefaultValue(false) + .HasComment("Whether the User is the admin."); + entity.Property(e => e.IsBot) + .HasDefaultValue(false) + .HasComment("Whether the User is a bot."); + entity.Property(e => e.IsCat) + .HasDefaultValue(false) + .HasComment("Whether the User is a cat."); + entity.Property(e => e.IsDeleted) + .HasDefaultValue(false) + .HasComment("Whether the User is deleted."); + entity.Property(e => e.IsExplorable) + .HasDefaultValue(true) + .HasComment("Whether the User is explorable."); + entity.Property(e => e.IsLocked) + .HasDefaultValue(false) + .HasComment("Whether the User is locked."); + entity.Property(e => e.IsModerator) + .HasDefaultValue(false) + .HasComment("Whether the User is a moderator."); + entity.Property(e => e.IsSilenced) + .HasDefaultValue(false) + .HasComment("Whether the User is silenced."); + entity.Property(e => e.IsSuspended) + .HasDefaultValue(false) + .HasComment("Whether the User is suspended."); + entity.Property(e => e.MovedToUri).HasComment("The URI of the new account of the User"); + entity.Property(e => e.DisplayName).HasComment("The name of the User."); + entity.Property(e => e.NotesCount) + .HasDefaultValue(0) + .HasComment("The count of notes."); + entity.Property(e => e.SharedInbox) + .HasComment("The sharedInbox URL of the User. It will be null if the origin of the user is local."); + entity.Property(e => e.SpeakAsCat) + .HasDefaultValue(true) + .HasComment("Whether to speak as a cat if isCat."); + entity.Property(e => e.Tags).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.UpdatedAt).HasComment("The updated date of the User."); + entity.Property(e => e.Uri) + .HasComment("The URI of the User. It will be null if the origin of the user is local."); + entity.Property(e => e.Username).HasComment("The username of the User."); + entity.Property(e => e.UsernameLower).HasComment("The username (lowercased) of the User."); + entity.Property(e => e.SplitDomainResolved).HasDefaultValue(false); - entity.HasOne(d => d.Avatar) - .WithOne(p => p.UserAvatar) - .OnDelete(DeleteBehavior.SetNull); + entity.HasOne(d => d.Avatar) + .WithOne(p => p.UserAvatar) + .OnDelete(DeleteBehavior.SetNull); - entity.HasOne(d => d.Banner) - .WithOne(p => p.UserBanner) - .OnDelete(DeleteBehavior.SetNull); + entity.HasOne(d => d.Banner) + .WithOne(p => p.UserBanner) + .OnDelete(DeleteBehavior.SetNull); + } } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UserGroup.cs b/Iceshrimp.Backend/Core/Database/Tables/UserGroup.cs index 39658ff1..25c6fed2 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UserGroup.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UserGroup.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -44,4 +45,18 @@ public class UserGroup [InverseProperty(nameof(UserGroupMember.UserGroup))] public virtual ICollection UserGroupMembers { get; set; } = new List(); + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the UserGroup."); + entity.Property(e => e.IsPrivate).HasDefaultValue(false); + entity.Property(e => e.UserId).HasComment("The ID of owner."); + + entity.HasOne(d => d.User) + .WithMany(p => p.UserGroups) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UserGroupInvitation.cs b/Iceshrimp.Backend/Core/Database/Tables/UserGroupInvitation.cs index 3cb54270..4257f598 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UserGroupInvitation.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UserGroupInvitation.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -45,4 +46,22 @@ public class UserGroupInvitation [ForeignKey(nameof(UserGroupId))] [InverseProperty(nameof(Tables.UserGroup.UserGroupInvitations))] public virtual UserGroup UserGroup { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the UserGroupInvitation."); + entity.Property(e => e.UserGroupId).HasComment("The group ID."); + entity.Property(e => e.UserId).HasComment("The user ID."); + + entity.HasOne(d => d.UserGroup) + .WithMany(p => p.UserGroupInvitations) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.UserGroupInvitations) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UserGroupMember.cs b/Iceshrimp.Backend/Core/Database/Tables/UserGroupMember.cs index bb4b14cb..ef2a0c9b 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UserGroupMember.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UserGroupMember.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -45,4 +46,22 @@ public class UserGroupMember [ForeignKey(nameof(UserGroupId))] [InverseProperty(nameof(Tables.UserGroup.UserGroupMembers))] public virtual UserGroup UserGroup { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the UserGroupMember."); + entity.Property(e => e.UserGroupId).HasComment("The group ID."); + entity.Property(e => e.UserId).HasComment("The user ID."); + + entity.HasOne(d => d.UserGroup) + .WithMany(p => p.UserGroupMembers) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.UserGroupMemberships) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UserKeypair.cs b/Iceshrimp.Backend/Core/Database/Tables/UserKeypair.cs index 7fa8e174..0ddf9041 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UserKeypair.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UserKeypair.cs @@ -1,5 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -22,4 +24,14 @@ public class UserKeypair [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.UserKeypair))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.HasOne(d => d.User) + .WithOne(p => p.UserKeypair) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UserList.cs b/Iceshrimp.Backend/Core/Database/Tables/UserList.cs index a29c1dcb..7b3019d2 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UserList.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UserList.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -48,4 +49,21 @@ public class UserList [InverseProperty(nameof(UserListMember.UserList))] public virtual ICollection UserListMembers { get; set; } = new List(); + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the UserList."); + entity.Property(e => e.HideFromHomeTl) + .HasDefaultValue(false) + .HasComment("Whether posts from list members should be hidden from the home timeline."); + entity.Property(e => e.Name).HasComment("The name of the UserList."); + entity.Property(e => e.UserId).HasComment("The owner ID."); + + entity.HasOne(d => d.User) + .WithMany(p => p.UserLists) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UserListMember.cs b/Iceshrimp.Backend/Core/Database/Tables/UserListMember.cs index 3ace49db..0c749b0a 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UserListMember.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UserListMember.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -42,4 +43,22 @@ public class UserListMember : IEntity [Column("id")] [StringLength(32)] public string Id { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the UserListMember."); + entity.Property(e => e.UserId).HasComment("The user ID."); + entity.Property(e => e.UserListId).HasComment("The list ID."); + + entity.HasOne(d => d.User) + .WithMany(p => p.UserListMembers) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.UserList) + .WithMany(p => p.UserListMembers) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UserNotePin.cs b/Iceshrimp.Backend/Core/Database/Tables/UserNotePin.cs index 4b9012e7..07fcbb01 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UserNotePin.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UserNotePin.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -31,4 +32,20 @@ public class UserNotePin [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.UserNotePins))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.CreatedAt).HasComment("The created date of the UserNotePins."); + + entity.HasOne(d => d.Note) + .WithMany(p => p.UserNotePins) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(d => d.User) + .WithMany(p => p.UserNotePins) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UserPending.cs b/Iceshrimp.Backend/Core/Database/Tables/UserPending.cs index 467b7ae6..15f3941b 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UserPending.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UserPending.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -26,4 +27,9 @@ public class UserPending [Column("password")] [StringLength(128)] public string Password { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) { } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UserProfile.cs b/Iceshrimp.Backend/Core/Database/Tables/UserProfile.cs index ff1c66c5..8141612c 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UserProfile.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UserProfile.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; using NpgsqlTypes; using J = System.Text.Json.Serialization.JsonPropertyNameAttribute; @@ -92,4 +93,32 @@ public class UserProfile [PgName("followers")] Followers = 1, [PgName("private")] Private = 2 } + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Birthday) + .IsFixedLength() + .HasComment("The birthday (YYYY-MM-DD) of the User."); + entity.Property(e => e.Description).HasComment("The description (bio) of the User."); + entity.Property(e => e.Fields).HasDefaultValueSql("'[]'::jsonb"); + entity.Property(e => e.Location).HasComment("The location of the User."); + entity.Property(e => e.Mentions).HasDefaultValueSql("'[]'::jsonb"); + entity.Property(e => e.ModerationNote).HasDefaultValueSql("''::character varying"); + entity.Property(e => e.Url).HasComment("Remote URL of the user."); + entity.Property(e => e.UserHost).HasComment("[Denormalized]"); + entity.Property(e => e.FFVisibility) + .HasDefaultValue(UserProfileFFVisibility.Public); + entity.Property(e => e.MentionsResolved).HasDefaultValue(false); + + entity.HasOne(d => d.PinnedPage) + .WithOne(p => p.UserProfile) + .OnDelete(DeleteBehavior.SetNull); + + entity.HasOne(d => d.User) + .WithOne(p => p.UserProfile) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UserPublickey.cs b/Iceshrimp.Backend/Core/Database/Tables/UserPublickey.cs index 9ccdf8c6..e530c628 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UserPublickey.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UserPublickey.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -22,4 +23,14 @@ public class UserPublickey [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.UserPublickey))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.HasOne(d => d.User) + .WithOne(p => p.UserPublickey) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UserSecurityKey.cs b/Iceshrimp.Backend/Core/Database/Tables/UserSecurityKey.cs index a2e24946..62275a79 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UserSecurityKey.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UserSecurityKey.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -40,4 +41,21 @@ public class UserSecurityKey [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.UserSecurityKeys))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Id).HasComment("Variable-length id given to navigator.credentials.get()"); + entity.Property(e => e.LastUsed) + .HasComment("The date of the last time the UserSecurityKey was successfully validated."); + entity.Property(e => e.Name).HasComment("User-defined name for this key"); + entity.Property(e => e.PublicKey) + .HasComment("Variable-length public key used to verify attestations (hex-encoded)."); + + entity.HasOne(d => d.User) + .WithMany(p => p.UserSecurityKeys) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/UserSettings.cs b/Iceshrimp.Backend/Core/Database/Tables/UserSettings.cs index e7dfc843..a7b32943 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/UserSettings.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/UserSettings.cs @@ -1,5 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -47,4 +49,22 @@ public class UserSettings public string? Password { get; set; } // @formatter:on + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.PrivateMode).HasDefaultValue(false); + entity.Property(e => e.FilterInaccessible).HasDefaultValue(false); + entity.Property(e => e.DefaultNoteVisibility).HasDefaultValue(Note.NoteVisibility.Public); + entity.Property(e => e.DefaultRenoteVisibility).HasDefaultValue(Note.NoteVisibility.Public); + entity.Property(e => e.AlwaysMarkSensitive).HasDefaultValue(false); + entity.Property(e => e.AutoAcceptFollowed).HasDefaultValue(false); + entity.Property(e => e.Email); + entity.Property(e => e.EmailVerified).HasDefaultValue(false); + entity.Property(e => e.Password); + entity.Property(e => e.TwoFactorEnabled).HasDefaultValue(false); + entity.HasOne(e => e.User).WithOne(e => e.UserSettings); + } + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Webhook.cs b/Iceshrimp.Backend/Core/Database/Tables/Webhook.cs index bfb86f13..23e3c509 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Webhook.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Webhook.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -53,4 +54,20 @@ public class Webhook [ForeignKey(nameof(UserId))] [InverseProperty(nameof(Tables.User.Webhooks))] public virtual User User { get; set; } = null!; + + private class EntityTypeConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder entity) + { + entity.Property(e => e.Active).HasDefaultValue(true); + entity.Property(e => e.CreatedAt).HasComment("The created date of the Antenna."); + entity.Property(e => e.Name).HasComment("The name of the Antenna."); + entity.Property(e => e.On).HasDefaultValueSql("'{}'::character varying[]"); + entity.Property(e => e.UserId).HasComment("The owner ID."); + + entity.HasOne(d => d.User) + .WithMany(p => p.Webhooks) + .OnDelete(DeleteBehavior.Cascade); + } + } } \ No newline at end of file