diff --git a/Migrations/20231130204741_Feature Permissions.Designer.cs b/Migrations/20231130204741_Feature Permissions.Designer.cs
new file mode 100644
index 0000000..bde3b8e
--- /dev/null
+++ b/Migrations/20231130204741_Feature Permissions.Designer.cs
@@ -0,0 +1,349 @@
+//
+using System;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+using vassago.Models;
+
+#nullable disable
+
+namespace vassago.Migrations
+{
+ [DbContext(typeof(ChattingContext))]
+ [Migration("20231130204741_Feature Permissions")]
+ partial class FeaturePermissions
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("ProductVersion", "7.0.5")
+ .HasAnnotation("Relational:MaxIdentifierLength", 63);
+
+ NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
+
+ modelBuilder.Entity("vassago.Models.Account", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("DisplayName")
+ .HasColumnType("text");
+
+ b.Property("ExternalId")
+ .HasColumnType("text");
+
+ b.Property("FeaturePermissionId")
+ .HasColumnType("uuid");
+
+ b.Property("IsBot")
+ .HasColumnType("boolean");
+
+ b.Property("IsUserId")
+ .HasColumnType("uuid");
+
+ b.Property("Protocol")
+ .HasColumnType("text");
+
+ b.Property("SeenInChannelId")
+ .HasColumnType("uuid");
+
+ b.Property("Username")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FeaturePermissionId");
+
+ b.HasIndex("IsUserId");
+
+ b.HasIndex("SeenInChannelId");
+
+ b.ToTable("Accounts");
+ });
+
+ modelBuilder.Entity("vassago.Models.Attachment", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("Content")
+ .HasColumnType("bytea");
+
+ b.Property("ContentType")
+ .HasColumnType("text");
+
+ b.Property("Description")
+ .HasColumnType("text");
+
+ b.Property("ExternalId")
+ .HasColumnType("numeric(20,0)");
+
+ b.Property("Filename")
+ .HasColumnType("text");
+
+ b.Property("MessageId")
+ .HasColumnType("uuid");
+
+ b.Property("Size")
+ .HasColumnType("integer");
+
+ b.Property("Source")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("MessageId");
+
+ b.ToTable("Attachments");
+ });
+
+ modelBuilder.Entity("vassago.Models.Channel", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("DisplayName")
+ .HasColumnType("text");
+
+ b.Property("ExternalId")
+ .HasColumnType("text");
+
+ b.Property("FeaturePermissionId")
+ .HasColumnType("uuid");
+
+ b.Property("IsDM")
+ .HasColumnType("boolean");
+
+ b.Property("ParentChannelId")
+ .HasColumnType("uuid");
+
+ b.Property("PermissionsId")
+ .HasColumnType("integer");
+
+ b.Property("Protocol")
+ .HasColumnType("text");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FeaturePermissionId");
+
+ b.HasIndex("ParentChannelId");
+
+ b.HasIndex("PermissionsId");
+
+ b.ToTable("Channels");
+ });
+
+ modelBuilder.Entity("vassago.Models.ChannelPermissions", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("LewdnessFilterLevel")
+ .HasColumnType("integer");
+
+ b.Property("LinksAllowed")
+ .HasColumnType("boolean");
+
+ b.Property("MaxAttachmentBytes")
+ .HasColumnType("numeric(20,0)");
+
+ b.Property("MaxTextChars")
+ .HasColumnType("bigint");
+
+ b.Property("MeannessFilterLevel")
+ .HasColumnType("integer");
+
+ b.Property("ReactionsPossible")
+ .HasColumnType("boolean");
+
+ b.HasKey("Id");
+
+ b.ToTable("ChannelPermissions");
+ });
+
+ modelBuilder.Entity("vassago.Models.FeaturePermission", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("Inheritable")
+ .HasColumnType("boolean");
+
+ b.Property("InternalName")
+ .HasColumnType("text");
+
+ b.Property("InternalTag")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.ToTable("FeaturePermissions");
+ });
+
+ modelBuilder.Entity("vassago.Models.Message", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("ActedOn")
+ .HasColumnType("boolean");
+
+ b.Property("AuthorId")
+ .HasColumnType("uuid");
+
+ b.Property("ChannelId")
+ .HasColumnType("uuid");
+
+ b.Property("Content")
+ .HasColumnType("text");
+
+ b.Property("ExternalId")
+ .HasColumnType("text");
+
+ b.Property("MentionsMe")
+ .HasColumnType("boolean");
+
+ b.Property("Protocol")
+ .HasColumnType("text");
+
+ b.Property("Timestamp")
+ .HasColumnType("timestamp with time zone");
+
+ b.HasKey("Id");
+
+ b.HasIndex("AuthorId");
+
+ b.HasIndex("ChannelId");
+
+ b.ToTable("Messages");
+ });
+
+ modelBuilder.Entity("vassago.Models.User", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("FeaturePermissionId")
+ .HasColumnType("uuid");
+
+ b.HasKey("Id");
+
+ b.HasIndex("FeaturePermissionId");
+
+ b.ToTable("Users");
+ });
+
+ modelBuilder.Entity("vassago.Models.Account", b =>
+ {
+ b.HasOne("vassago.Models.FeaturePermission", null)
+ .WithMany("RestrictedToAccounts")
+ .HasForeignKey("FeaturePermissionId");
+
+ b.HasOne("vassago.Models.User", "IsUser")
+ .WithMany("Accounts")
+ .HasForeignKey("IsUserId");
+
+ b.HasOne("vassago.Models.Channel", "SeenInChannel")
+ .WithMany("Users")
+ .HasForeignKey("SeenInChannelId");
+
+ b.Navigation("IsUser");
+
+ b.Navigation("SeenInChannel");
+ });
+
+ modelBuilder.Entity("vassago.Models.Attachment", b =>
+ {
+ b.HasOne("vassago.Models.Message", "Message")
+ .WithMany("Attachments")
+ .HasForeignKey("MessageId");
+
+ b.Navigation("Message");
+ });
+
+ modelBuilder.Entity("vassago.Models.Channel", b =>
+ {
+ b.HasOne("vassago.Models.FeaturePermission", null)
+ .WithMany("RestrictedToChannels")
+ .HasForeignKey("FeaturePermissionId");
+
+ b.HasOne("vassago.Models.Channel", "ParentChannel")
+ .WithMany("SubChannels")
+ .HasForeignKey("ParentChannelId");
+
+ b.HasOne("vassago.Models.ChannelPermissions", "Permissions")
+ .WithMany()
+ .HasForeignKey("PermissionsId");
+
+ b.Navigation("ParentChannel");
+
+ b.Navigation("Permissions");
+ });
+
+ modelBuilder.Entity("vassago.Models.Message", b =>
+ {
+ b.HasOne("vassago.Models.Account", "Author")
+ .WithMany()
+ .HasForeignKey("AuthorId");
+
+ b.HasOne("vassago.Models.Channel", "Channel")
+ .WithMany("Messages")
+ .HasForeignKey("ChannelId");
+
+ b.Navigation("Author");
+
+ b.Navigation("Channel");
+ });
+
+ modelBuilder.Entity("vassago.Models.User", b =>
+ {
+ b.HasOne("vassago.Models.FeaturePermission", null)
+ .WithMany("RestrictedToUsers")
+ .HasForeignKey("FeaturePermissionId");
+ });
+
+ modelBuilder.Entity("vassago.Models.Channel", b =>
+ {
+ b.Navigation("Messages");
+
+ b.Navigation("SubChannels");
+
+ b.Navigation("Users");
+ });
+
+ modelBuilder.Entity("vassago.Models.FeaturePermission", b =>
+ {
+ b.Navigation("RestrictedToAccounts");
+
+ b.Navigation("RestrictedToChannels");
+
+ b.Navigation("RestrictedToUsers");
+ });
+
+ modelBuilder.Entity("vassago.Models.Message", b =>
+ {
+ b.Navigation("Attachments");
+ });
+
+ modelBuilder.Entity("vassago.Models.User", b =>
+ {
+ b.Navigation("Accounts");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/Migrations/20231130204741_Feature Permissions.cs b/Migrations/20231130204741_Feature Permissions.cs
new file mode 100644
index 0000000..e9d704c
--- /dev/null
+++ b/Migrations/20231130204741_Feature Permissions.cs
@@ -0,0 +1,211 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
+
+#nullable disable
+
+namespace vassago.Migrations
+{
+ ///
+ public partial class FeaturePermissions : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_Channels_PermissionSettings_PermissionsId",
+ table: "Channels");
+
+ migrationBuilder.DropTable(
+ name: "PermissionSettings");
+
+ migrationBuilder.DropColumn(
+ name: "PermissionTags",
+ table: "Users");
+
+ migrationBuilder.DropColumn(
+ name: "PermissionTags",
+ table: "Accounts");
+
+ migrationBuilder.AddColumn(
+ name: "FeaturePermissionId",
+ table: "Users",
+ type: "uuid",
+ nullable: true);
+
+ migrationBuilder.AddColumn(
+ name: "FeaturePermissionId",
+ table: "Channels",
+ type: "uuid",
+ nullable: true);
+
+ migrationBuilder.AddColumn(
+ name: "FeaturePermissionId",
+ table: "Accounts",
+ type: "uuid",
+ nullable: true);
+
+ migrationBuilder.CreateTable(
+ name: "ChannelPermissions",
+ columns: table => new
+ {
+ Id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ MaxAttachmentBytes = table.Column(type: "numeric(20,0)", nullable: true),
+ MaxTextChars = table.Column(type: "bigint", nullable: true),
+ LinksAllowed = table.Column(type: "boolean", nullable: true),
+ ReactionsPossible = table.Column(type: "boolean", nullable: true),
+ LewdnessFilterLevel = table.Column(type: "integer", nullable: true),
+ MeannessFilterLevel = table.Column(type: "integer", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_ChannelPermissions", x => x.Id);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "FeaturePermissions",
+ columns: table => new
+ {
+ Id = table.Column(type: "uuid", nullable: false),
+ InternalName = table.Column(type: "text", nullable: true),
+ InternalTag = table.Column(type: "integer", nullable: true),
+ Inheritable = table.Column(type: "boolean", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_FeaturePermissions", x => x.Id);
+ });
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Users_FeaturePermissionId",
+ table: "Users",
+ column: "FeaturePermissionId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Channels_FeaturePermissionId",
+ table: "Channels",
+ column: "FeaturePermissionId");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_Accounts_FeaturePermissionId",
+ table: "Accounts",
+ column: "FeaturePermissionId");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Accounts_FeaturePermissions_FeaturePermissionId",
+ table: "Accounts",
+ column: "FeaturePermissionId",
+ principalTable: "FeaturePermissions",
+ principalColumn: "Id");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Channels_ChannelPermissions_PermissionsId",
+ table: "Channels",
+ column: "PermissionsId",
+ principalTable: "ChannelPermissions",
+ principalColumn: "Id");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Channels_FeaturePermissions_FeaturePermissionId",
+ table: "Channels",
+ column: "FeaturePermissionId",
+ principalTable: "FeaturePermissions",
+ principalColumn: "Id");
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Users_FeaturePermissions_FeaturePermissionId",
+ table: "Users",
+ column: "FeaturePermissionId",
+ principalTable: "FeaturePermissions",
+ principalColumn: "Id");
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropForeignKey(
+ name: "FK_Accounts_FeaturePermissions_FeaturePermissionId",
+ table: "Accounts");
+
+ migrationBuilder.DropForeignKey(
+ name: "FK_Channels_ChannelPermissions_PermissionsId",
+ table: "Channels");
+
+ migrationBuilder.DropForeignKey(
+ name: "FK_Channels_FeaturePermissions_FeaturePermissionId",
+ table: "Channels");
+
+ migrationBuilder.DropForeignKey(
+ name: "FK_Users_FeaturePermissions_FeaturePermissionId",
+ table: "Users");
+
+ migrationBuilder.DropTable(
+ name: "ChannelPermissions");
+
+ migrationBuilder.DropTable(
+ name: "FeaturePermissions");
+
+ migrationBuilder.DropIndex(
+ name: "IX_Users_FeaturePermissionId",
+ table: "Users");
+
+ migrationBuilder.DropIndex(
+ name: "IX_Channels_FeaturePermissionId",
+ table: "Channels");
+
+ migrationBuilder.DropIndex(
+ name: "IX_Accounts_FeaturePermissionId",
+ table: "Accounts");
+
+ migrationBuilder.DropColumn(
+ name: "FeaturePermissionId",
+ table: "Users");
+
+ migrationBuilder.DropColumn(
+ name: "FeaturePermissionId",
+ table: "Channels");
+
+ migrationBuilder.DropColumn(
+ name: "FeaturePermissionId",
+ table: "Accounts");
+
+ migrationBuilder.AddColumn(
+ name: "PermissionTags",
+ table: "Users",
+ type: "integer[]",
+ nullable: true);
+
+ migrationBuilder.AddColumn(
+ name: "PermissionTags",
+ table: "Accounts",
+ type: "integer[]",
+ nullable: true);
+
+ migrationBuilder.CreateTable(
+ name: "PermissionSettings",
+ columns: table => new
+ {
+ Id = table.Column(type: "integer", nullable: false)
+ .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
+ LewdnessFilterLevel = table.Column(type: "integer", nullable: true),
+ LinksAllowed = table.Column(type: "boolean", nullable: true),
+ MaxAttachmentBytes = table.Column(type: "numeric(20,0)", nullable: true),
+ MaxTextChars = table.Column(type: "bigint", nullable: true),
+ MeannessFilterLevel = table.Column(type: "integer", nullable: true),
+ ReactionsPossible = table.Column(type: "boolean", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_PermissionSettings", x => x.Id);
+ });
+
+ migrationBuilder.AddForeignKey(
+ name: "FK_Channels_PermissionSettings_PermissionsId",
+ table: "Channels",
+ column: "PermissionsId",
+ principalTable: "PermissionSettings",
+ principalColumn: "Id");
+ }
+ }
+}
diff --git a/Migrations/ChattingContextModelSnapshot.cs b/Migrations/ChattingContextModelSnapshot.cs
index cf5df66..026e761 100644
--- a/Migrations/ChattingContextModelSnapshot.cs
+++ b/Migrations/ChattingContextModelSnapshot.cs
@@ -34,15 +34,15 @@ namespace vassago.Migrations
b.Property("ExternalId")
.HasColumnType("text");
+ b.Property("FeaturePermissionId")
+ .HasColumnType("uuid");
+
b.Property("IsBot")
.HasColumnType("boolean");
b.Property("IsUserId")
.HasColumnType("uuid");
- b.Property("PermissionTags")
- .HasColumnType("integer[]");
-
b.Property("Protocol")
.HasColumnType("text");
@@ -54,6 +54,8 @@ namespace vassago.Migrations
b.HasKey("Id");
+ b.HasIndex("FeaturePermissionId");
+
b.HasIndex("IsUserId");
b.HasIndex("SeenInChannelId");
@@ -110,6 +112,9 @@ namespace vassago.Migrations
b.Property("ExternalId")
.HasColumnType("text");
+ b.Property("FeaturePermissionId")
+ .HasColumnType("uuid");
+
b.Property("IsDM")
.HasColumnType("boolean");
@@ -124,6 +129,8 @@ namespace vassago.Migrations
b.HasKey("Id");
+ b.HasIndex("FeaturePermissionId");
+
b.HasIndex("ParentChannelId");
b.HasIndex("PermissionsId");
@@ -131,6 +138,57 @@ namespace vassago.Migrations
b.ToTable("Channels");
});
+ modelBuilder.Entity("vassago.Models.ChannelPermissions", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("integer");
+
+ NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
+
+ b.Property("LewdnessFilterLevel")
+ .HasColumnType("integer");
+
+ b.Property("LinksAllowed")
+ .HasColumnType("boolean");
+
+ b.Property("MaxAttachmentBytes")
+ .HasColumnType("numeric(20,0)");
+
+ b.Property("MaxTextChars")
+ .HasColumnType("bigint");
+
+ b.Property("MeannessFilterLevel")
+ .HasColumnType("integer");
+
+ b.Property("ReactionsPossible")
+ .HasColumnType("boolean");
+
+ b.HasKey("Id");
+
+ b.ToTable("ChannelPermissions");
+ });
+
+ modelBuilder.Entity("vassago.Models.FeaturePermission", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("uuid");
+
+ b.Property("Inheritable")
+ .HasColumnType("boolean");
+
+ b.Property("InternalName")
+ .HasColumnType("text");
+
+ b.Property("InternalTag")
+ .HasColumnType("integer");
+
+ b.HasKey("Id");
+
+ b.ToTable("FeaturePermissions");
+ });
+
modelBuilder.Entity("vassago.Models.Message", b =>
{
b.Property("Id")
@@ -170,53 +228,28 @@ namespace vassago.Migrations
b.ToTable("Messages");
});
- modelBuilder.Entity("vassago.Models.PermissionSettings", b =>
- {
- b.Property("Id")
- .ValueGeneratedOnAdd()
- .HasColumnType("integer");
-
- NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id"));
-
- b.Property("LewdnessFilterLevel")
- .HasColumnType("integer");
-
- b.Property("LinksAllowed")
- .HasColumnType("boolean");
-
- b.Property("MaxAttachmentBytes")
- .HasColumnType("numeric(20,0)");
-
- b.Property("MaxTextChars")
- .HasColumnType("bigint");
-
- b.Property("MeannessFilterLevel")
- .HasColumnType("integer");
-
- b.Property("ReactionsPossible")
- .HasColumnType("boolean");
-
- b.HasKey("Id");
-
- b.ToTable("PermissionSettings");
- });
-
modelBuilder.Entity("vassago.Models.User", b =>
{
b.Property("Id")
.ValueGeneratedOnAdd()
.HasColumnType("uuid");
- b.Property("PermissionTags")
- .HasColumnType("integer[]");
+ b.Property("FeaturePermissionId")
+ .HasColumnType("uuid");
b.HasKey("Id");
+ b.HasIndex("FeaturePermissionId");
+
b.ToTable("Users");
});
modelBuilder.Entity("vassago.Models.Account", b =>
{
+ b.HasOne("vassago.Models.FeaturePermission", null)
+ .WithMany("RestrictedToAccounts")
+ .HasForeignKey("FeaturePermissionId");
+
b.HasOne("vassago.Models.User", "IsUser")
.WithMany("Accounts")
.HasForeignKey("IsUserId");
@@ -241,11 +274,15 @@ namespace vassago.Migrations
modelBuilder.Entity("vassago.Models.Channel", b =>
{
+ b.HasOne("vassago.Models.FeaturePermission", null)
+ .WithMany("RestrictedToChannels")
+ .HasForeignKey("FeaturePermissionId");
+
b.HasOne("vassago.Models.Channel", "ParentChannel")
.WithMany("SubChannels")
.HasForeignKey("ParentChannelId");
- b.HasOne("vassago.Models.PermissionSettings", "Permissions")
+ b.HasOne("vassago.Models.ChannelPermissions", "Permissions")
.WithMany()
.HasForeignKey("PermissionsId");
@@ -269,6 +306,13 @@ namespace vassago.Migrations
b.Navigation("Channel");
});
+ modelBuilder.Entity("vassago.Models.User", b =>
+ {
+ b.HasOne("vassago.Models.FeaturePermission", null)
+ .WithMany("RestrictedToUsers")
+ .HasForeignKey("FeaturePermissionId");
+ });
+
modelBuilder.Entity("vassago.Models.Channel", b =>
{
b.Navigation("Messages");
@@ -278,6 +322,15 @@ namespace vassago.Migrations
b.Navigation("Users");
});
+ modelBuilder.Entity("vassago.Models.FeaturePermission", b =>
+ {
+ b.Navigation("RestrictedToAccounts");
+
+ b.Navigation("RestrictedToChannels");
+
+ b.Navigation("RestrictedToUsers");
+ });
+
modelBuilder.Entity("vassago.Models.Message", b =>
{
b.Navigation("Attachments");
diff --git a/Models/ChattingContext.cs b/Models/ChattingContext.cs
index e1195bb..f666d1d 100644
--- a/Models/ChattingContext.cs
+++ b/Models/ChattingContext.cs
@@ -9,7 +9,8 @@ public class ChattingContext : DbContext
public DbSet Channels { get; set; }
//public DbSet Emoji {get;set;}
public DbSet Messages { get; set; }
- public DbSet PermissionSettings{get;set;}
+ public DbSet ChannelPermissions{get;set;}
+ public DbSet FeaturePermissions{get;set;}
public DbSet Accounts { get; set; }
public DbSet Users { get; set; }