diff --git a/Iceshrimp.Backend/Core/Database/DatabaseContext.cs b/Iceshrimp.Backend/Core/Database/DatabaseContext.cs index ef9f7e58..0c563f0e 100644 --- a/Iceshrimp.Backend/Core/Database/DatabaseContext.cs +++ b/Iceshrimp.Backend/Core/Database/DatabaseContext.cs @@ -1,5 +1,6 @@ using Iceshrimp.Backend.Core.Database.Tables; using Microsoft.EntityFrameworkCore; +using Npgsql; namespace Iceshrimp.Backend.Core.Database; @@ -9,227 +10,234 @@ public partial class DatabaseContext : DbContext { public DatabaseContext(DbContextOptions options) : base(options) { } - public virtual DbSet AbuseUserReports { get; set; } + public virtual DbSet AbuseUserReports { get; init; } - public virtual DbSet AccessTokens { get; set; } + public virtual DbSet AccessTokens { get; init; } - public virtual DbSet Announcements { get; set; } + public virtual DbSet Announcements { get; init; } - public virtual DbSet AnnouncementReads { get; set; } + public virtual DbSet AnnouncementReads { get; init; } - public virtual DbSet Antennas { get; set; } + public virtual DbSet Antennas { get; init; } - public virtual DbSet Apps { get; set; } + public virtual DbSet Apps { get; init; } - public virtual DbSet AttestationChallenges { get; set; } + public virtual DbSet AttestationChallenges { get; init; } - public virtual DbSet AuthSessions { get; set; } + public virtual DbSet AuthSessions { get; init; } - public virtual DbSet Blockings { get; set; } + public virtual DbSet Blockings { get; init; } - public virtual DbSet Channels { get; set; } + public virtual DbSet Channels { get; init; } - public virtual DbSet ChannelFollowings { get; set; } + public virtual DbSet ChannelFollowings { get; init; } - public virtual DbSet ChannelNotePinings { get; set; } + public virtual DbSet ChannelNotePinings { get; init; } - public virtual DbSet ChartActiveUsers { get; set; } + public virtual DbSet ChartActiveUsers { get; init; } - public virtual DbSet ChartApRequests { get; set; } + public virtual DbSet ChartApRequests { get; init; } - public virtual DbSet ChartDayActiveUsers { get; set; } + public virtual DbSet ChartDayActiveUsers { get; init; } - public virtual DbSet ChartDayApRequests { get; set; } + public virtual DbSet ChartDayApRequests { get; init; } - public virtual DbSet ChartDayDrives { get; set; } + public virtual DbSet ChartDayDrives { get; init; } - public virtual DbSet ChartDayFederations { get; set; } + public virtual DbSet ChartDayFederations { get; init; } - public virtual DbSet ChartDayHashtags { get; set; } + public virtual DbSet ChartDayHashtags { get; init; } - public virtual DbSet ChartDayInstances { get; set; } + public virtual DbSet ChartDayInstances { get; init; } - public virtual DbSet ChartDayNetworks { get; set; } + public virtual DbSet ChartDayNetworks { get; init; } - public virtual DbSet ChartDayNotes { get; set; } + public virtual DbSet ChartDayNotes { get; init; } - public virtual DbSet ChartDayPerUserDrives { get; set; } + public virtual DbSet ChartDayPerUserDrives { get; init; } - public virtual DbSet ChartDayPerUserFollowings { get; set; } + public virtual DbSet ChartDayPerUserFollowings { get; init; } - public virtual DbSet ChartDayPerUserNotes { get; set; } + public virtual DbSet ChartDayPerUserNotes { get; init; } - public virtual DbSet ChartDayPerUserReactions { get; set; } + public virtual DbSet ChartDayPerUserReactions { get; init; } - public virtual DbSet ChartDayUsers { get; set; } + public virtual DbSet ChartDayUsers { get; init; } - public virtual DbSet ChartDrives { get; set; } + public virtual DbSet ChartDrives { get; init; } - public virtual DbSet ChartFederations { get; set; } + public virtual DbSet ChartFederations { get; init; } - public virtual DbSet ChartHashtags { get; set; } + public virtual DbSet ChartHashtags { get; init; } - public virtual DbSet ChartInstances { get; set; } + public virtual DbSet ChartInstances { get; init; } - public virtual DbSet ChartNetworks { get; set; } + public virtual DbSet ChartNetworks { get; init; } - public virtual DbSet ChartNotes { get; set; } + public virtual DbSet ChartNotes { get; init; } - public virtual DbSet ChartPerUserDrives { get; set; } + public virtual DbSet ChartPerUserDrives { get; init; } - public virtual DbSet ChartPerUserFollowings { get; set; } + public virtual DbSet ChartPerUserFollowings { get; init; } - public virtual DbSet ChartPerUserNotes { get; set; } + public virtual DbSet ChartPerUserNotes { get; init; } - public virtual DbSet ChartPerUserReactions { get; set; } + public virtual DbSet ChartPerUserReactions { get; init; } - public virtual DbSet ChartTests { get; set; } + public virtual DbSet ChartTests { get; init; } - public virtual DbSet ChartTestGroupeds { get; set; } + public virtual DbSet ChartTestGroupeds { get; init; } - public virtual DbSet ChartTestUniques { get; set; } + public virtual DbSet ChartTestUniques { get; init; } - public virtual DbSet ChartUsers { get; set; } + public virtual DbSet ChartUsers { get; init; } - public virtual DbSet Clips { get; set; } + public virtual DbSet Clips { get; init; } - public virtual DbSet ClipNotes { get; set; } + public virtual DbSet ClipNotes { get; init; } - public virtual DbSet DriveFiles { get; set; } + public virtual DbSet DriveFiles { get; init; } - public virtual DbSet DriveFolders { get; set; } + public virtual DbSet DriveFolders { get; init; } - public virtual DbSet Emojis { get; set; } + public virtual DbSet Emojis { get; init; } - public virtual DbSet FollowRequests { get; set; } + public virtual DbSet FollowRequests { get; init; } - public virtual DbSet Followings { get; set; } + public virtual DbSet Followings { get; init; } - public virtual DbSet GalleryLikes { get; set; } + public virtual DbSet GalleryLikes { get; init; } - public virtual DbSet GalleryPosts { get; set; } + public virtual DbSet GalleryPosts { get; init; } - public virtual DbSet Hashtags { get; set; } + public virtual DbSet Hashtags { get; init; } - public virtual DbSet HtmlNoteCacheEntries { get; set; } + public virtual DbSet HtmlNoteCacheEntries { get; init; } - public virtual DbSet HtmlUserCacheEntries { get; set; } + public virtual DbSet HtmlUserCacheEntries { get; init; } - public virtual DbSet Instances { get; set; } + public virtual DbSet Instances { get; init; } - public virtual DbSet MessagingMessages { get; set; } + public virtual DbSet MessagingMessages { get; init; } - public virtual DbSet Meta { get; set; } + public virtual DbSet Meta { get; init; } - public virtual DbSet Migrations { get; set; } + public virtual DbSet Migrations { get; init; } - public virtual DbSet ModerationLogs { get; set; } + public virtual DbSet ModerationLogs { get; init; } - public virtual DbSet Mutings { get; set; } + public virtual DbSet Mutings { get; init; } - public virtual DbSet Notes { get; set; } + public virtual DbSet Notes { get; init; } - public virtual DbSet NoteEdits { get; set; } + public virtual DbSet NoteEdits { get; init; } - public virtual DbSet NoteFavorites { get; set; } + public virtual DbSet NoteFavorites { get; init; } - public virtual DbSet NoteReactions { get; set; } + public virtual DbSet NoteReactions { get; init; } - public virtual DbSet NoteThreadMutings { get; set; } + public virtual DbSet NoteThreadMutings { get; init; } - public virtual DbSet NoteUnreads { get; set; } + public virtual DbSet NoteUnreads { get; init; } - public virtual DbSet NoteWatchings { get; set; } + public virtual DbSet NoteWatchings { get; init; } - public virtual DbSet Notifications { get; set; } + public virtual DbSet Notifications { get; init; } - public virtual DbSet OauthApps { get; set; } + public virtual DbSet OauthApps { get; init; } - public virtual DbSet OauthTokens { get; set; } + public virtual DbSet OauthTokens { get; init; } - public virtual DbSet Pages { get; set; } + public virtual DbSet Pages { get; init; } - public virtual DbSet PageLikes { get; set; } + public virtual DbSet PageLikes { get; init; } - public virtual DbSet PasswordResetRequests { get; set; } + public virtual DbSet PasswordResetRequests { get; init; } - public virtual DbSet Polls { get; set; } + public virtual DbSet Polls { get; init; } - public virtual DbSet PollVotes { get; set; } + public virtual DbSet PollVotes { get; init; } - public virtual DbSet PromoNotes { get; set; } + public virtual DbSet PromoNotes { get; init; } - public virtual DbSet PromoReads { get; set; } + public virtual DbSet PromoReads { get; init; } - public virtual DbSet RegistrationTickets { get; set; } + public virtual DbSet RegistrationTickets { get; init; } - public virtual DbSet RegistryItems { get; set; } + public virtual DbSet RegistryItems { get; init; } - public virtual DbSet Relays { get; set; } + public virtual DbSet Relays { get; init; } - public virtual DbSet RenoteMutings { get; set; } + public virtual DbSet RenoteMutings { get; init; } - public virtual DbSet Sessions { get; set; } + public virtual DbSet Sessions { get; init; } - public virtual DbSet Signins { get; set; } + public virtual DbSet Signins { get; init; } - public virtual DbSet SwSubscriptions { get; set; } + public virtual DbSet SwSubscriptions { get; init; } - public virtual DbSet UsedUsernames { get; set; } + public virtual DbSet UsedUsernames { get; init; } - public virtual DbSet Users { get; set; } + public virtual DbSet Users { get; init; } - public virtual DbSet UserGroups { get; set; } + public virtual DbSet UserGroups { get; init; } - public virtual DbSet UserGroupInvitations { get; set; } + public virtual DbSet UserGroupInvitations { get; init; } - public virtual DbSet UserGroupInvites { get; set; } + public virtual DbSet UserGroupInvites { get; init; } - public virtual DbSet UserGroupJoinings { get; set; } + public virtual DbSet UserGroupJoinings { get; init; } - public virtual DbSet UserIps { get; set; } + public virtual DbSet UserIps { get; init; } - public virtual DbSet UserKeypairs { get; set; } + public virtual DbSet UserKeypairs { get; init; } - public virtual DbSet UserLists { get; set; } + public virtual DbSet UserLists { get; init; } - public virtual DbSet UserListJoinings { get; set; } + public virtual DbSet UserListJoinings { get; init; } - public virtual DbSet UserNotePinings { get; set; } + public virtual DbSet UserNotePinings { get; init; } - public virtual DbSet UserPendings { get; set; } + public virtual DbSet UserPendings { get; init; } - public virtual DbSet UserProfiles { get; set; } + public virtual DbSet UserProfiles { get; init; } - public virtual DbSet UserPublickeys { get; set; } + public virtual DbSet UserPublickeys { get; init; } - public virtual DbSet UserSecurityKeys { get; set; } + public virtual DbSet UserSecurityKeys { get; init; } - public virtual DbSet Webhooks { get; set; } + public virtual DbSet Webhooks { get; init; } - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) -#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https: //go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263. - => optionsBuilder.UseNpgsql("Host=localhost;Username=zotan;Database=iceshrimp"); + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { + //TODO: load from configuration + var dataSourceBuilder = new NpgsqlDataSourceBuilder("Host=localhost;Username=zotan;Database=iceshrimp"); + dataSourceBuilder.MapEnum(); + dataSourceBuilder.MapEnum(); + dataSourceBuilder.MapEnum(); + dataSourceBuilder.MapEnum(); + //dataSourceBuilder.MapEnum(); // FIXME: WHY IS THIS ITS OWN ENUM + dataSourceBuilder.MapEnum(); + dataSourceBuilder.MapEnum(); + //dataSourceBuilder.MapEnum(); // FIXME: WHY IS THIS ITS OWN ENUM + + optionsBuilder.UseNpgsql(dataSourceBuilder.Build()); + } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder - .HasPostgresEnum("antenna_src_enum", new[] { "home", "all", "users", "list", "group", "instances" }) - .HasPostgresEnum("log_level_enum", new[] { "error", "warning", "info", "success", "debug" }) - .HasPostgresEnum("note_visibility_enum", new[] { "public", "home", "followers", "specified", "hidden" }) - .HasPostgresEnum("notification_type_enum", - new[] { - "follow", "mention", "reply", "renote", "quote", "reaction", "pollVote", "pollEnded", - "receiveFollowRequest", "followRequestAccepted", "groupInvited", "app" - }) - .HasPostgresEnum("page_visibility_enum", new[] { "public", "followers", "specified" }) - .HasPostgresEnum("poll_notevisibility_enum", new[] { "public", "home", "followers", "specified", "hidden" }) - .HasPostgresEnum("relay_status_enum", new[] { "requesting", "accepted", "rejected" }) - .HasPostgresEnum("user_profile_ffvisibility_enum", new[] { "public", "followers", "private" }) + .HasPostgresEnum() + //.HasPostgresEnum("log_level_enum", ["error", "warning", "info", "success", "debug"]) // TODO: not in use, add migration that removes this if it exists + .HasPostgresEnum() + .HasPostgresEnum() + .HasPostgresEnum() + .HasPostgresEnum("poll_notevisibility_enum", ["public", "home", "followers", "specified", "hidden"]) + .HasPostgresEnum() + .HasPostgresEnum() .HasPostgresEnum("user_profile_mutingnotificationtypes_enum", - new[] { - "follow", "mention", "reply", "renote", "quote", "reaction", "pollVote", "pollEnded", + [ + "follow", "mention", "reply", "renote", "quote", "reaction", "pollVote", "pollEnded", "receiveFollowRequest", "followRequestAccepted", "groupInvited", "app" - }) + ]) .HasPostgresExtension("pg_trgm"); modelBuilder.Entity(entity => { @@ -1095,7 +1103,7 @@ public partial class DatabaseContext : DbContext { entity.Property(e => e.UseObjectStorage).HasDefaultValue(false); }); - modelBuilder.Entity(entity => { + modelBuilder.Entity(entity => { entity.HasKey(e => e.Id).HasName("PK_8c82d7f526340ab734260ea46be"); }); diff --git a/Iceshrimp.Backend/Core/Database/Tables/Antenna.cs b/Iceshrimp.Backend/Core/Database/Tables/Antenna.cs index 9340f98a..f728cbf0 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 NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -31,6 +32,8 @@ public class Antenna { [Column("name")] [StringLength(128)] public string Name { get; set; } = null!; + + [Column("src")] public AntennaSource Source { get; set; } [Column("userListId")] [StringLength(32)] @@ -75,4 +78,14 @@ public class Antenna { [ForeignKey("UserListId")] [InverseProperty("Antennas")] public virtual UserList? UserList { get; set; } + + [PgName("antenna_src_enum")] + public enum AntennaSource { + [PgName("home")] Home, + [PgName("all")] All, + [PgName("users")] Users, + [PgName("list")] List, + [PgName("group")] Group, + [PgName("instances")] Instances + } } \ No newline at end of file diff --git a/Iceshrimp.Backend/Core/Database/Tables/Migration.cs b/Iceshrimp.Backend/Core/Database/Tables/LegacyMigrations.cs similarity index 89% rename from Iceshrimp.Backend/Core/Database/Tables/Migration.cs rename to Iceshrimp.Backend/Core/Database/Tables/LegacyMigrations.cs index ec8c08cc..2a4d784e 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Migration.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/LegacyMigrations.cs @@ -4,7 +4,7 @@ using System.ComponentModel.DataAnnotations.Schema; namespace Iceshrimp.Backend.Core.Database.Tables; [Table("migrations")] -public class Migration { +public class LegacyMigrations { [Key] [Column("id")] public int Id { get; set; } [Column("timestamp")] public long Timestamp { get; set; } diff --git a/Iceshrimp.Backend/Core/Database/Tables/Note.cs b/Iceshrimp.Backend/Core/Database/Tables/Note.cs index 9d068a5d..60e3d7df 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Note.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Note.cs @@ -1,6 +1,7 @@ using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Microsoft.EntityFrameworkCore; +using NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -61,6 +62,8 @@ public class Note { [StringLength(32)] public string UserId { get; set; } = null!; + [Column("visibility")] public NoteVisibility Visibility { get; set; } + [Column("localOnly")] public bool LocalOnly { get; set; } [Column("renoteCount")] public short RenoteCount { get; set; } @@ -213,4 +216,13 @@ public class Note { [InverseProperty("Note")] public virtual ICollection UserNotePinings { get; set; } = new List(); + + [PgName("note_visibility_enum")] + public enum NoteVisibility { + [PgName("public")] Public, + [PgName("home")] Home, + [PgName("followers")] Followers, + [PgName("specified")] Specified, + [PgName("hidden")] Hidden + } } \ 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 0867c1f2..6b93ac40 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 NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -41,6 +42,8 @@ public class Notification { /// [Column("isRead")] public bool IsRead { get; set; } + + [Column("type")] public NotificationType Type { get; set; } [Column("noteId")] [StringLength(32)] public string? NoteId { get; set; } @@ -97,4 +100,20 @@ public class Notification { [ForeignKey("UserGroupInvitationId")] [InverseProperty("Notifications")] public virtual UserGroupInvitation? UserGroupInvitation { get; set; } + + [PgName("notification_type_enum")] + public enum NotificationType { + [PgName("follow")] Follow, + [PgName("mention")] Mention, + [PgName("reply")] Reply, + [PgName("renote")] Renote, + [PgName("quote")] Quote, + [PgName("reaction")] Reaction, + [PgName("pollVote")] PollVote, + [PgName("pollEnded")] PollEnded, + [PgName("receiveFollowRequest")] FollowRequestReceived, + [PgName("followRequestAccepted")] FollowRequestAccepted, + [PgName("groupInvited")] GroupInvited, + [PgName("app")] App, + } } \ 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 2f8d4335..5796acbe 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 NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -32,6 +33,8 @@ public class Page { [Column("title")] [StringLength(256)] public string Title { get; set; } = null!; [Column("name")] [StringLength(256)] public string Name { get; set; } = null!; + + [Column("visibility")] public PageVisibility Visibility { get; set; } [Column("summary")] [StringLength(256)] @@ -82,4 +85,11 @@ public class Page { public virtual User User { get; set; } = null!; [InverseProperty("PinnedPage")] public virtual UserProfile? UserProfile { get; set; } + + [PgName("page_visibility_enum")] + public enum PageVisibility { + [PgName("public")] Public, + [PgName("followers")] Followers, + [PgName("specified")] Specified, + } } \ 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 6db24dc6..aa7b81e5 100644 --- a/Iceshrimp.Backend/Core/Database/Tables/Poll.cs +++ b/Iceshrimp.Backend/Core/Database/Tables/Poll.cs @@ -39,4 +39,10 @@ public class Poll { [ForeignKey("NoteId")] [InverseProperty("Poll")] public virtual Note Note { get; set; } = null!; + + /// + /// [Denormalized] + /// + [Column("noteVisibility")] + public Note.NoteVisibility NoteVisibility { get; set; } } \ 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 f7475fcb..a4243852 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 NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -13,4 +14,13 @@ public class Relay { public string Id { get; set; } = null!; [Column("inbox")] [StringLength(512)] public string Inbox { get; set; } = null!; + + [Column("status")] public RelayStatus Status { get; set; } + + [PgName("relay_status_enum")] + public enum RelayStatus { + [PgName("requesting")] Requesting, + [PgName("accepted")] Accepted, + [PgName("rejected")] Rejected, + } } \ 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 bb4dfac6..d2ae7db2 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 NpgsqlTypes; namespace Iceshrimp.Backend.Core.Database.Tables; @@ -43,6 +44,12 @@ public class UserProfile { [Column("url")] [StringLength(512)] public string? Url { get; set; } + + [Column("ffVisibility")] + public UserProfileFFVisibility FFVisibility { get; set; } + + [Column("mutingNotificationTypes")] + public List MutingNotificationTypes { get; set; } = null!; /// /// The email address of the User. @@ -154,4 +161,11 @@ public class UserProfile { [ForeignKey("UserId")] [InverseProperty("UserProfile")] public virtual User User { get; set; } = null!; + + [PgName("user_profile_ffvisibility_enum")] + public enum UserProfileFFVisibility { + [PgName("public")] Public, + [PgName("followers")] Followers, + [PgName("private")] Private, + } } \ No newline at end of file diff --git a/Iceshrimp.NET.sln.DotSettings b/Iceshrimp.NET.sln.DotSettings index 8a53a813..ea24ca6b 100644 --- a/Iceshrimp.NET.sln.DotSettings +++ b/Iceshrimp.NET.sln.DotSettings @@ -29,6 +29,7 @@ END_OF_LINE AP AS + FF LD True True