Mare 0.9 (#27)

* add jwt expiry

* update api

* merge

* start rework permissions

* ok so in theory this compiles

* make it work I guess

* reuse some permissions

* fix intermediate connectivity issues

* fixes

* whatever

* some fixes I guess

* fix some stuff

* idk some random fixes I guess

* change some defaults

* update nuget

* adjust order of operations

* adjust deletion of account

* remove todo

---------

Co-authored-by: rootdarkarchon <root.darkarchon@outlook.com>
This commit is contained in:
rootdarkarchon
2023-10-17 21:36:33 +02:00
committed by GitHub
parent 2c9d432fed
commit 302e6ffb62
39 changed files with 3564 additions and 454 deletions

View File

@@ -45,6 +45,11 @@ public class MareDbContext : DbContext
public DbSet<UserProfileData> UserProfileData { get; set; }
public DbSet<UserProfileDataReport> UserProfileReports { get; set; }
public DbSet<User> Users { get; set; }
public DbSet<UserPermissionSet> Permissions { get; set; }
public DbSet<GroupPairPreferredPermission> GroupPairPreferredPermissions { get; set; }
public DbSet<UserDefaultPreferredPermission> UserDefaultPreferredPermissions { get; set; }
public IQueryable<UserPermissionQuery> GetAllPairsForUser(string uid) => FromExpression(() => GetAllPairsForUser(uid));
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
@@ -77,5 +82,21 @@ public class MareDbContext : DbContext
modelBuilder.Entity<UserProfileData>().ToTable("user_profile_data");
modelBuilder.Entity<UserProfileData>().HasKey(c => c.UserUID);
modelBuilder.Entity<UserProfileDataReport>().ToTable("user_profile_data_reports");
modelBuilder.Entity<UserPermissionSet>().ToTable("user_permission_sets");
modelBuilder.Entity<UserPermissionSet>().HasKey(u => new { u.UserUID, u.OtherUserUID });
modelBuilder.Entity<UserPermissionSet>().HasIndex(c => c.UserUID);
modelBuilder.Entity<UserPermissionSet>().HasIndex(c => c.OtherUserUID);
modelBuilder.Entity<GroupPairPreferredPermission>().ToTable("group_pair_preferred_permissions");
modelBuilder.Entity<GroupPairPreferredPermission>().HasKey(u => new { u.UserUID, u.GroupGID });
modelBuilder.Entity<GroupPairPreferredPermission>().HasIndex(c => c.UserUID);
modelBuilder.Entity<GroupPairPreferredPermission>().HasIndex(c => c.GroupGID);
modelBuilder.Entity<UserDefaultPreferredPermission>().ToTable("user_default_preferred_permissions");
modelBuilder.Entity<UserDefaultPreferredPermission>().HasKey(u => u.UserUID);
modelBuilder.Entity<UserDefaultPreferredPermission>().HasIndex(u => u.UserUID);
modelBuilder.Entity<UserDefaultPreferredPermission>().HasOne(u => u.User);
modelBuilder.HasDbFunction(typeof(MareDbContext).GetMethod(nameof(GetAllPairsForUser), new[] { typeof(string) }))
.HasName("get_all_pairs_for_user");
modelBuilder.Entity<UserPermissionQuery>().HasNoKey();
modelBuilder.Entity<UserPermissionQuery>().ToTable("user_permission_query", t => t.ExcludeFromMigrations());
}
}

View File

@@ -20,13 +20,13 @@
<ItemGroup>
<PackageReference Include="ByteSize" Version="2.1.1" />
<PackageReference Include="EFCore.NamingConventions" Version="7.0.2" />
<PackageReference Include="Grpc.AspNetCore" Version="2.53.0" />
<PackageReference Include="IDisposableAnalyzers" Version="4.0.6">
<PackageReference Include="Grpc.AspNetCore" Version="2.57.0" />
<PackageReference Include="IDisposableAnalyzers" Version="4.0.7">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Karambolo.Extensions.Logging.File" Version="3.4.0" />
<PackageReference Include="Meziantou.Analyzer" Version="2.0.49">
<PackageReference Include="Karambolo.Extensions.Logging.File" Version="3.5.0" />
<PackageReference Include="Meziantou.Analyzer" Version="2.0.93">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
@@ -35,25 +35,25 @@
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.Core" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.5" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="7.0.5" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.5" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.5">
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.12" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.Protocols.MessagePack" Version="7.0.12" />
<PackageReference Include="Microsoft.AspNetCore.SignalR.StackExchangeRedis" Version="7.0.12" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.12" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.12" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.12">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="7.0.5" />
<PackageReference Include="Microsoft.IdentityModel.Tokens" Version="6.30.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.4" />
<PackageReference Include="Microsoft.Extensions.Caching.StackExchangeRedis" Version="7.0.12" />
<PackageReference Include="Microsoft.IdentityModel.Tokens" Version="7.0.2" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.11" />
<PackageReference Include="prometheus-net" Version="7.0.0" />
<PackageReference Include="prometheus-net.AspNetCore" Version="7.0.0" />
<PackageReference Include="StackExchange.Redis" Version="2.6.111" />
<PackageReference Include="StackExchange.Redis" Version="2.6.122" />
<PackageReference Include="StackExchange.Redis.Extensions.AspNetCore" Version="9.1.0" />
<PackageReference Include="StackExchange.Redis.Extensions.Core" Version="9.1.0" />
<PackageReference Include="StackExchange.Redis.Extensions.System.Text.Json" Version="9.1.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.30.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.0.2" />
<PackageReference Include="System.Linq.Async" Version="6.0.1" />
</ItemGroup>

View File

@@ -19,9 +19,9 @@ public class MetricsAPI
public const string CounterAuthenticationCacheHits = "mare_auth_requests_cachehit";
public const string CounterAuthenticationFailures = "mare_auth_requests_fail";
public const string CounterAuthenticationSuccesses = "mare_auth_requests_success";
public const string GaugeAuthenticationCacheEntries = "mare_auth_cache";
public const string GaugeGroups = "mare_groups";
public const string GaugeGroupPairs = "mare_groups_pairs";
public const string GaugeGroupPairsPaused = "mare_groups_pairs_paused";
public const string GaugeFilesUniquePastHour = "mare_files_unique_past_hour";
public const string GaugeFilesUniquePastHourSize = "mare_files_unique_past_hour_size";
public const string GaugeFilesUniquePastDay = "mare_files_unique_past_day";

View File

@@ -0,0 +1,805 @@
// <auto-generated />
using System;
using MareSynchronosShared.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace MareSynchronosServer.Migrations
{
[DbContext(typeof(MareDbContext))]
[Migration("20230924190113_permissions")]
partial class permissions
{
/// <inheritdoc />
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("MareSynchronosShared.Models.Auth", b =>
{
b.Property<string>("HashedKey")
.HasMaxLength(64)
.HasColumnType("character varying(64)")
.HasColumnName("hashed_key");
b.Property<bool>("IsBanned")
.HasColumnType("boolean")
.HasColumnName("is_banned");
b.Property<string>("PrimaryUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("primary_user_uid");
b.Property<string>("UserUID")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.HasKey("HashedKey")
.HasName("pk_auth");
b.HasIndex("PrimaryUserUID")
.HasDatabaseName("ix_auth_primary_user_uid");
b.HasIndex("UserUID")
.HasDatabaseName("ix_auth_user_uid");
b.ToTable("auth", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.Banned", b =>
{
b.Property<string>("CharacterIdentification")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("character_identification");
b.Property<string>("Reason")
.HasColumnType("text")
.HasColumnName("reason");
b.Property<byte[]>("Timestamp")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("bytea")
.HasColumnName("timestamp");
b.HasKey("CharacterIdentification")
.HasName("pk_banned_users");
b.ToTable("banned_users", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b =>
{
b.Property<string>("DiscordIdOrLodestoneAuth")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("discord_id_or_lodestone_auth");
b.HasKey("DiscordIdOrLodestoneAuth")
.HasName("pk_banned_registrations");
b.ToTable("banned_registrations", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b =>
{
b.Property<string>("UserUID")
.HasMaxLength(10)
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.Property<string>("OtherUserUID")
.HasMaxLength(10)
.HasColumnType("character varying(10)")
.HasColumnName("other_user_uid");
b.Property<byte[]>("Timestamp")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("bytea")
.HasColumnName("timestamp");
b.HasKey("UserUID", "OtherUserUID")
.HasName("pk_client_pairs");
b.HasIndex("OtherUserUID")
.HasDatabaseName("ix_client_pairs_other_user_uid");
b.HasIndex("UserUID")
.HasDatabaseName("ix_client_pairs_user_uid");
b.ToTable("client_pairs", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b =>
{
b.Property<string>("Hash")
.HasMaxLength(40)
.HasColumnType("character varying(40)")
.HasColumnName("hash");
b.Property<long>("Size")
.HasColumnType("bigint")
.HasColumnName("size");
b.Property<byte[]>("Timestamp")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("bytea")
.HasColumnName("timestamp");
b.Property<DateTime>("UploadDate")
.HasColumnType("timestamp with time zone")
.HasColumnName("upload_date");
b.Property<bool>("Uploaded")
.HasColumnType("boolean")
.HasColumnName("uploaded");
b.Property<string>("UploaderUID")
.HasMaxLength(10)
.HasColumnType("character varying(10)")
.HasColumnName("uploader_uid");
b.HasKey("Hash")
.HasName("pk_file_caches");
b.HasIndex("UploaderUID")
.HasDatabaseName("ix_file_caches_uploader_uid");
b.ToTable("file_caches", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b =>
{
b.Property<string>("Hash")
.HasMaxLength(40)
.HasColumnType("character varying(40)")
.HasColumnName("hash");
b.Property<string>("ForbiddenBy")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("forbidden_by");
b.Property<byte[]>("Timestamp")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("bytea")
.HasColumnName("timestamp");
b.HasKey("Hash")
.HasName("pk_forbidden_upload_entries");
b.ToTable("forbidden_upload_entries", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.Group", b =>
{
b.Property<string>("GID")
.HasMaxLength(20)
.HasColumnType("character varying(20)")
.HasColumnName("gid");
b.Property<string>("Alias")
.HasMaxLength(50)
.HasColumnType("character varying(50)")
.HasColumnName("alias");
b.Property<string>("HashedPassword")
.HasColumnType("text")
.HasColumnName("hashed_password");
b.Property<bool>("InvitesEnabled")
.HasColumnType("boolean")
.HasColumnName("invites_enabled");
b.Property<string>("OwnerUID")
.HasColumnType("character varying(10)")
.HasColumnName("owner_uid");
b.Property<bool>("PreferDisableAnimations")
.HasColumnType("boolean")
.HasColumnName("prefer_disable_animations");
b.Property<bool>("PreferDisableSounds")
.HasColumnType("boolean")
.HasColumnName("prefer_disable_sounds");
b.Property<bool>("PreferDisableVFX")
.HasColumnType("boolean")
.HasColumnName("prefer_disable_vfx");
b.HasKey("GID")
.HasName("pk_groups");
b.HasIndex("OwnerUID")
.HasDatabaseName("ix_groups_owner_uid");
b.ToTable("groups", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b =>
{
b.Property<string>("GroupGID")
.HasColumnType("character varying(20)")
.HasColumnName("group_gid");
b.Property<string>("BannedUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("banned_user_uid");
b.Property<string>("BannedByUID")
.HasColumnType("character varying(10)")
.HasColumnName("banned_by_uid");
b.Property<DateTime>("BannedOn")
.HasColumnType("timestamp with time zone")
.HasColumnName("banned_on");
b.Property<string>("BannedReason")
.HasColumnType("text")
.HasColumnName("banned_reason");
b.HasKey("GroupGID", "BannedUserUID")
.HasName("pk_group_bans");
b.HasIndex("BannedByUID")
.HasDatabaseName("ix_group_bans_banned_by_uid");
b.HasIndex("BannedUserUID")
.HasDatabaseName("ix_group_bans_banned_user_uid");
b.HasIndex("GroupGID")
.HasDatabaseName("ix_group_bans_group_gid");
b.ToTable("group_bans", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b =>
{
b.Property<string>("GroupGID")
.HasColumnType("character varying(20)")
.HasColumnName("group_gid");
b.Property<string>("GroupUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("group_user_uid");
b.Property<bool>("IsModerator")
.HasColumnType("boolean")
.HasColumnName("is_moderator");
b.Property<bool>("IsPinned")
.HasColumnType("boolean")
.HasColumnName("is_pinned");
b.HasKey("GroupGID", "GroupUserUID")
.HasName("pk_group_pairs");
b.HasIndex("GroupGID")
.HasDatabaseName("ix_group_pairs_group_gid");
b.HasIndex("GroupUserUID")
.HasDatabaseName("ix_group_pairs_group_user_uid");
b.ToTable("group_pairs", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupPairPreferredPermission", b =>
{
b.Property<string>("UserUID")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.Property<string>("GroupGID")
.HasColumnType("character varying(20)")
.HasColumnName("group_gid");
b.Property<bool>("DisableAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_animations");
b.Property<bool>("DisableSounds")
.HasColumnType("boolean")
.HasColumnName("disable_sounds");
b.Property<bool>("DisableVFX")
.HasColumnType("boolean")
.HasColumnName("disable_vfx");
b.Property<bool>("IsPaused")
.HasColumnType("boolean")
.HasColumnName("is_paused");
b.HasKey("UserUID", "GroupGID")
.HasName("pk_group_pair_preferred_permissions");
b.HasIndex("GroupGID")
.HasDatabaseName("ix_group_pair_preferred_permissions_group_gid");
b.HasIndex("UserUID")
.HasDatabaseName("ix_group_pair_preferred_permissions_user_uid");
b.ToTable("group_pair_preferred_permissions", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b =>
{
b.Property<string>("GroupGID")
.HasColumnType("character varying(20)")
.HasColumnName("group_gid");
b.Property<string>("Invite")
.HasMaxLength(64)
.HasColumnType("character varying(64)")
.HasColumnName("invite");
b.Property<DateTime>("ExpirationDate")
.HasColumnType("timestamp with time zone")
.HasColumnName("expiration_date");
b.HasKey("GroupGID", "Invite")
.HasName("pk_group_temp_invites");
b.HasIndex("GroupGID")
.HasDatabaseName("ix_group_temp_invites_group_gid");
b.HasIndex("Invite")
.HasDatabaseName("ix_group_temp_invites_invite");
b.ToTable("group_temp_invites", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b =>
{
b.Property<decimal>("DiscordId")
.ValueGeneratedOnAdd()
.HasColumnType("numeric(20,0)")
.HasColumnName("discord_id");
b.Property<string>("HashedLodestoneId")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("hashed_lodestone_id");
b.Property<string>("LodestoneAuthString")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("lodestone_auth_string");
b.Property<DateTime?>("StartedAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("started_at");
b.Property<string>("UserUID")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.HasKey("DiscordId")
.HasName("pk_lodestone_auth");
b.HasIndex("UserUID")
.HasDatabaseName("ix_lodestone_auth_user_uid");
b.ToTable("lodestone_auth", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.User", b =>
{
b.Property<string>("UID")
.HasMaxLength(10)
.HasColumnType("character varying(10)")
.HasColumnName("uid");
b.Property<string>("Alias")
.HasMaxLength(15)
.HasColumnType("character varying(15)")
.HasColumnName("alias");
b.Property<bool>("IsAdmin")
.HasColumnType("boolean")
.HasColumnName("is_admin");
b.Property<bool>("IsModerator")
.HasColumnType("boolean")
.HasColumnName("is_moderator");
b.Property<DateTime>("LastLoggedIn")
.HasColumnType("timestamp with time zone")
.HasColumnName("last_logged_in");
b.Property<byte[]>("Timestamp")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("bytea")
.HasColumnName("timestamp");
b.HasKey("UID")
.HasName("pk_users");
b.ToTable("users", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.UserDefaultPreferredPermission", b =>
{
b.Property<string>("UserUID")
.HasColumnType("text")
.HasColumnName("user_uid");
b.Property<bool>("DisableGroupAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_group_animations");
b.Property<bool>("DisableGroupSounds")
.HasColumnType("boolean")
.HasColumnName("disable_group_sounds");
b.Property<bool>("DisableGroupVFX")
.HasColumnType("boolean")
.HasColumnName("disable_group_vfx");
b.Property<bool>("DisableIndividualAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_individual_animations");
b.Property<bool>("DisableIndividualSounds")
.HasColumnType("boolean")
.HasColumnName("disable_individual_sounds");
b.Property<bool>("DisableIndividualVFX")
.HasColumnType("boolean")
.HasColumnName("disable_individual_vfx");
b.Property<bool>("IndividualIsSticky")
.HasColumnType("boolean")
.HasColumnName("individual_is_sticky");
b.Property<string>("UserUID1")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid1");
b.HasKey("UserUID")
.HasName("pk_user_default_preferred_permissions");
b.HasIndex("UserUID1")
.HasDatabaseName("ix_user_default_preferred_permissions_user_uid1");
b.ToTable("user_default_preferred_permissions", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.UserPermissionSet", b =>
{
b.Property<string>("UserUID")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.Property<string>("OtherUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("other_user_uid");
b.Property<bool>("DisableAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_animations");
b.Property<bool>("DisableSounds")
.HasColumnType("boolean")
.HasColumnName("disable_sounds");
b.Property<bool>("DisableVFX")
.HasColumnType("boolean")
.HasColumnName("disable_vfx");
b.Property<bool>("IsPaused")
.HasColumnType("boolean")
.HasColumnName("is_paused");
b.Property<bool>("Sticky")
.HasColumnType("boolean")
.HasColumnName("sticky");
b.HasKey("UserUID", "OtherUserUID")
.HasName("pk_user_permission_sets");
b.HasIndex("OtherUserUID")
.HasDatabaseName("ix_user_permission_sets_other_user_uid");
b.HasIndex("UserUID")
.HasDatabaseName("ix_user_permission_sets_user_uid");
b.ToTable("user_permission_sets", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b =>
{
b.Property<string>("UserUID")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.Property<string>("Base64ProfileImage")
.HasColumnType("text")
.HasColumnName("base64profile_image");
b.Property<bool>("FlaggedForReport")
.HasColumnType("boolean")
.HasColumnName("flagged_for_report");
b.Property<bool>("IsNSFW")
.HasColumnType("boolean")
.HasColumnName("is_nsfw");
b.Property<bool>("ProfileDisabled")
.HasColumnType("boolean")
.HasColumnName("profile_disabled");
b.Property<string>("UserDescription")
.HasColumnType("text")
.HasColumnName("user_description");
b.HasKey("UserUID")
.HasName("pk_user_profile_data");
b.ToTable("user_profile_data", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("id");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<DateTime>("ReportDate")
.HasColumnType("timestamp with time zone")
.HasColumnName("report_date");
b.Property<string>("ReportReason")
.HasColumnType("text")
.HasColumnName("report_reason");
b.Property<string>("ReportedUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("reported_user_uid");
b.Property<string>("ReportingUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("reporting_user_uid");
b.HasKey("Id")
.HasName("pk_user_profile_data_reports");
b.HasIndex("ReportedUserUID")
.HasDatabaseName("ix_user_profile_data_reports_reported_user_uid");
b.HasIndex("ReportingUserUID")
.HasDatabaseName("ix_user_profile_data_reports_reporting_user_uid");
b.ToTable("user_profile_data_reports", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.Auth", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "PrimaryUser")
.WithMany()
.HasForeignKey("PrimaryUserUID")
.HasConstraintName("fk_auth_users_primary_user_temp_id");
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.HasConstraintName("fk_auth_users_user_temp_id1");
b.Navigation("PrimaryUser");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "OtherUser")
.WithMany()
.HasForeignKey("OtherUserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_client_pairs_users_other_user_temp_id2");
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_client_pairs_users_user_temp_id3");
b.Navigation("OtherUser");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "Uploader")
.WithMany()
.HasForeignKey("UploaderUID")
.HasConstraintName("fk_file_caches_users_uploader_uid");
b.Navigation("Uploader");
});
modelBuilder.Entity("MareSynchronosShared.Models.Group", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "Owner")
.WithMany()
.HasForeignKey("OwnerUID")
.HasConstraintName("fk_groups_users_owner_temp_id9");
b.Navigation("Owner");
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "BannedBy")
.WithMany()
.HasForeignKey("BannedByUID")
.HasConstraintName("fk_group_bans_users_banned_by_temp_id5");
b.HasOne("MareSynchronosShared.Models.User", "BannedUser")
.WithMany()
.HasForeignKey("BannedUserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_bans_users_banned_user_temp_id6");
b.HasOne("MareSynchronosShared.Models.Group", "Group")
.WithMany()
.HasForeignKey("GroupGID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_bans_groups_group_temp_id");
b.Navigation("BannedBy");
b.Navigation("BannedUser");
b.Navigation("Group");
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b =>
{
b.HasOne("MareSynchronosShared.Models.Group", "Group")
.WithMany()
.HasForeignKey("GroupGID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_pairs_groups_group_temp_id2");
b.HasOne("MareSynchronosShared.Models.User", "GroupUser")
.WithMany()
.HasForeignKey("GroupUserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_pairs_users_group_user_temp_id8");
b.Navigation("Group");
b.Navigation("GroupUser");
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupPairPreferredPermission", b =>
{
b.HasOne("MareSynchronosShared.Models.Group", "Group")
.WithMany()
.HasForeignKey("GroupGID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_pair_preferred_permissions_groups_group_temp_id1");
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_pair_preferred_permissions_users_user_temp_id7");
b.Navigation("Group");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b =>
{
b.HasOne("MareSynchronosShared.Models.Group", "Group")
.WithMany()
.HasForeignKey("GroupGID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_temp_invites_groups_group_gid");
b.Navigation("Group");
});
modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.HasConstraintName("fk_lodestone_auth_users_user_uid");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.UserDefaultPreferredPermission", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID1")
.HasConstraintName("fk_user_default_preferred_permissions_users_user_temp_id13");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.UserPermissionSet", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "OtherUser")
.WithMany()
.HasForeignKey("OtherUserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_user_permission_sets_users_other_user_uid");
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_user_permission_sets_users_user_uid");
b.Navigation("OtherUser");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_user_profile_data_users_user_uid");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "ReportedUser")
.WithMany()
.HasForeignKey("ReportedUserUID")
.HasConstraintName("fk_user_profile_data_reports_users_reported_user_uid");
b.HasOne("MareSynchronosShared.Models.User", "ReportingUser")
.WithMany()
.HasForeignKey("ReportingUserUID")
.HasConstraintName("fk_user_profile_data_reports_users_reporting_user_uid");
b.Navigation("ReportedUser");
b.Navigation("ReportingUser");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,442 @@
using MareSynchronosShared.Models;
using Microsoft.EntityFrameworkCore.Migrations;
using static System.Runtime.InteropServices.JavaScript.JSType;
#nullable disable
namespace MareSynchronosServer.Migrations
{
/// <inheritdoc />
public partial class permissions : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "group_pair_preferred_permissions",
columns: table => new
{
group_gid = table.Column<string>(type: "character varying(20)", nullable: false),
user_uid = table.Column<string>(type: "character varying(10)", nullable: false),
is_paused = table.Column<bool>(type: "boolean", nullable: false),
disable_animations = table.Column<bool>(type: "boolean", nullable: false),
disable_sounds = table.Column<bool>(type: "boolean", nullable: false),
disable_vfx = table.Column<bool>(type: "boolean", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("pk_group_pair_preferred_permissions", x => new { x.user_uid, x.group_gid });
table.ForeignKey(
name: "fk_group_pair_preferred_permissions_groups_group_temp_id1",
column: x => x.group_gid,
principalTable: "groups",
principalColumn: "gid",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "fk_group_pair_preferred_permissions_users_user_temp_id7",
column: x => x.user_uid,
principalTable: "users",
principalColumn: "uid",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.CreateTable(
name: "user_default_preferred_permissions",
columns: table => new
{
user_uid = table.Column<string>(type: "text", nullable: false),
user_uid1 = table.Column<string>(type: "character varying(10)", nullable: true),
disable_individual_animations = table.Column<bool>(type: "boolean", nullable: false),
disable_individual_sounds = table.Column<bool>(type: "boolean", nullable: false),
disable_individual_vfx = table.Column<bool>(type: "boolean", nullable: false),
disable_group_animations = table.Column<bool>(type: "boolean", nullable: false),
disable_group_sounds = table.Column<bool>(type: "boolean", nullable: false),
disable_group_vfx = table.Column<bool>(type: "boolean", nullable: false),
individual_is_sticky = table.Column<bool>(type: "boolean", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("pk_user_default_preferred_permissions", x => x.user_uid);
table.ForeignKey(
name: "fk_user_default_preferred_permissions_users_user_temp_id13",
column: x => x.user_uid1,
principalTable: "users",
principalColumn: "uid");
});
migrationBuilder.CreateTable(
name: "user_permission_sets",
columns: table => new
{
user_uid = table.Column<string>(type: "character varying(10)", nullable: false),
other_user_uid = table.Column<string>(type: "character varying(10)", nullable: false),
sticky = table.Column<bool>(type: "boolean", nullable: false),
is_paused = table.Column<bool>(type: "boolean", nullable: false),
disable_animations = table.Column<bool>(type: "boolean", nullable: false),
disable_vfx = table.Column<bool>(type: "boolean", nullable: false),
disable_sounds = table.Column<bool>(type: "boolean", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("pk_user_permission_sets", x => new { x.user_uid, x.other_user_uid });
table.ForeignKey(
name: "fk_user_permission_sets_users_other_user_uid",
column: x => x.other_user_uid,
principalTable: "users",
principalColumn: "uid",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "fk_user_permission_sets_users_user_uid",
column: x => x.user_uid,
principalTable: "users",
principalColumn: "uid",
onDelete: ReferentialAction.Cascade);
});
migrationBuilder.Sql(@"insert into user_permission_sets
select user1.user_uid as user_uid, user1.other_user_uid as other_user_uid,
true,
user1.is_paused as is_paused,
user1.disable_animations as disable_animations,
user1.disable_sounds as disable_sounds,
user1.disable_vfx as disable_vfx
from client_pairs as user1;");
migrationBuilder.Sql(@"insert into user_permission_sets
select gp.group_user_uid, gp2.group_user_uid,
false,
bool_and(gp.is_paused),
bool_and(g.disable_animations or gp.disable_animations),
bool_and(g.disable_sounds or gp.disable_sounds),
bool_and(g.disable_vfx or gp.disable_vfx)
from group_pairs gp
left join group_pairs gp2 on gp2.group_gid = gp.group_gid
left join groups g on g.gid = gp2.group_gid
where gp2.group_user_uid <> gp.group_user_uid
group by gp.group_user_uid, gp2.group_user_uid
on conflict do nothing;");
migrationBuilder.Sql(@"insert into group_pair_preferred_permissions
select group_gid
, group_user_uid
, gp.is_paused
, gp.disable_animations or g.disable_animations as disable_animations
, gp.disable_sounds or g.disable_sounds as disable_sounds
, gp.disable_vfx or g.disable_vfx as disable_vfx
from group_pairs as gp
left join groups g on g.gid = gp.group_gid");
migrationBuilder.DropForeignKey(
name: "fk_group_pairs_groups_group_temp_id1",
table: "group_pairs");
migrationBuilder.DropForeignKey(
name: "fk_group_pairs_users_group_user_temp_id7",
table: "group_pairs");
migrationBuilder.DropForeignKey(
name: "fk_groups_users_owner_temp_id8",
table: "groups");
migrationBuilder.DropColumn(
name: "disable_animations",
table: "group_pairs");
migrationBuilder.DropColumn(
name: "disable_sounds",
table: "group_pairs");
migrationBuilder.DropColumn(
name: "disable_vfx",
table: "group_pairs");
migrationBuilder.DropColumn(
name: "is_paused",
table: "group_pairs");
migrationBuilder.DropColumn(
name: "allow_receiving_messages",
table: "client_pairs");
migrationBuilder.DropColumn(
name: "disable_animations",
table: "client_pairs");
migrationBuilder.DropColumn(
name: "disable_sounds",
table: "client_pairs");
migrationBuilder.DropColumn(
name: "disable_vfx",
table: "client_pairs");
migrationBuilder.DropColumn(
name: "is_paused",
table: "client_pairs");
migrationBuilder.RenameColumn(
name: "disable_vfx",
table: "groups",
newName: "prefer_disable_vfx");
migrationBuilder.RenameColumn(
name: "disable_sounds",
table: "groups",
newName: "prefer_disable_sounds");
migrationBuilder.RenameColumn(
name: "disable_animations",
table: "groups",
newName: "prefer_disable_animations");
migrationBuilder.CreateIndex(
name: "ix_group_pair_preferred_permissions_group_gid",
table: "group_pair_preferred_permissions",
column: "group_gid");
migrationBuilder.CreateIndex(
name: "ix_group_pair_preferred_permissions_user_uid",
table: "group_pair_preferred_permissions",
column: "user_uid");
migrationBuilder.CreateIndex(
name: "ix_user_default_preferred_permissions_user_uid1",
table: "user_default_preferred_permissions",
column: "user_uid1");
migrationBuilder.CreateIndex(
name: "ix_user_permission_sets_other_user_uid",
table: "user_permission_sets",
column: "other_user_uid");
migrationBuilder.CreateIndex(
name: "ix_user_permission_sets_user_uid",
table: "user_permission_sets",
column: "user_uid");
migrationBuilder.AddForeignKey(
name: "fk_group_pairs_groups_group_temp_id2",
table: "group_pairs",
column: "group_gid",
principalTable: "groups",
principalColumn: "gid",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "fk_group_pairs_users_group_user_temp_id8",
table: "group_pairs",
column: "group_user_uid",
principalTable: "users",
principalColumn: "uid",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "fk_groups_users_owner_temp_id9",
table: "groups",
column: "owner_uid",
principalTable: "users",
principalColumn: "uid");
migrationBuilder.Sql(@"create function get_all_pairs_for_user(req_uid text)
returns table(
user_uid varchar(10)
,other_user_uid varchar(10)
,alias varchar(15)
,gid varchar(20)
,synced bool
,ownperm_is_paused bool
,ownperm_sticky bool
,ownperm_disable_animations bool
,ownperm_disable_sounds bool
,ownperm_disable_vfx bool
,otherperm_is_paused bool
,otherperm_disable_animations bool
,otherperm_disable_sounds bool
,otherperm_disable_vfx bool)
as
$$
begin
return query(
WITH query1 AS (
SELECT user1.user_uid AS user_uid
,user1.other_user_uid AS other_user_uid
,NULL AS gid
,NOT (user2 IS NULL) AS synced
FROM client_pairs AS user1
LEFT JOIN client_pairs user2 ON user1.user_uid = user2.other_user_uid
AND user2.user_uid = user1.other_user_uid
WHERE user1.user_uid = req_uid
),
query2 AS (
SELECT gp.group_user_uid
,gp2.group_user_uid
,gp.group_gid
,true
FROM group_pairs gp
LEFT JOIN group_pairs gp2 ON gp2.group_gid = gp.group_gid
WHERE gp.group_user_uid = req_uid
AND gp2.group_user_uid <> req_uid
AND gp2.group_gid = gp.group_gid
)
SELECT pairs.user_uid
,pairs.other_user_uid
,u.alias
,cast(pairs.gid as varchar(20))
,pairs.synced
,ownperm.is_paused
,ownperm.sticky
,ownperm.disable_animations
,ownperm.disable_sounds
,ownperm.disable_vfx
,otherperm.is_paused
,otherperm.disable_animations
,otherperm.disable_sounds
,otherperm.disable_vfx
FROM (SELECT * FROM query1
union all
SELECT * FROM query2) AS pairs
LEFT JOIN users AS u ON pairs.other_user_uid = u.uid
LEFT JOIN user_permission_sets AS ownperm ON pairs.user_uid = ownperm.user_uid
AND pairs.other_user_uid = ownperm.other_user_uid
LEFT JOIN user_permission_sets AS otherperm ON pairs.user_uid = otherperm.other_user_uid
AND pairs.other_user_uid = otherperm.user_uid
WHERE pairs.user_uid = req_uid
AND u.uid = pairs.other_user_uid
AND (
(ownperm.user_uid = req_uid)
OR (otherperm.other_user_uid = req_uid)
)
);
end;
$$
language plpgsql;");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "fk_group_pairs_groups_group_temp_id2",
table: "group_pairs");
migrationBuilder.DropForeignKey(
name: "fk_group_pairs_users_group_user_temp_id8",
table: "group_pairs");
migrationBuilder.DropForeignKey(
name: "fk_groups_users_owner_temp_id9",
table: "groups");
migrationBuilder.DropTable(
name: "group_pair_preferred_permissions");
migrationBuilder.DropTable(
name: "user_default_preferred_permissions");
migrationBuilder.DropTable(
name: "user_permission_sets");
migrationBuilder.RenameColumn(
name: "prefer_disable_vfx",
table: "groups",
newName: "disable_vfx");
migrationBuilder.RenameColumn(
name: "prefer_disable_sounds",
table: "groups",
newName: "disable_sounds");
migrationBuilder.RenameColumn(
name: "prefer_disable_animations",
table: "groups",
newName: "disable_animations");
migrationBuilder.AddColumn<bool>(
name: "disable_animations",
table: "group_pairs",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "disable_sounds",
table: "group_pairs",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "disable_vfx",
table: "group_pairs",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "is_paused",
table: "group_pairs",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "allow_receiving_messages",
table: "client_pairs",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "disable_animations",
table: "client_pairs",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "disable_sounds",
table: "client_pairs",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "disable_vfx",
table: "client_pairs",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddColumn<bool>(
name: "is_paused",
table: "client_pairs",
type: "boolean",
nullable: false,
defaultValue: false);
migrationBuilder.AddForeignKey(
name: "fk_group_pairs_groups_group_temp_id1",
table: "group_pairs",
column: "group_gid",
principalTable: "groups",
principalColumn: "gid",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "fk_group_pairs_users_group_user_temp_id7",
table: "group_pairs",
column: "group_user_uid",
principalTable: "users",
principalColumn: "uid",
onDelete: ReferentialAction.Cascade);
migrationBuilder.AddForeignKey(
name: "fk_groups_users_owner_temp_id8",
table: "groups",
column: "owner_uid",
principalTable: "users",
principalColumn: "uid");
}
}
}

View File

@@ -0,0 +1,868 @@
// <auto-generated />
using System;
using MareSynchronosShared.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace MareSynchronosServer.Migrations
{
[DbContext(typeof(MareDbContext))]
[Migration("20230926212023_AlterPermissions")]
partial class AlterPermissions
{
/// <inheritdoc />
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("MareSynchronosShared.Models.Auth", b =>
{
b.Property<string>("HashedKey")
.HasMaxLength(64)
.HasColumnType("character varying(64)")
.HasColumnName("hashed_key");
b.Property<bool>("IsBanned")
.HasColumnType("boolean")
.HasColumnName("is_banned");
b.Property<string>("PrimaryUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("primary_user_uid");
b.Property<string>("UserUID")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.HasKey("HashedKey")
.HasName("pk_auth");
b.HasIndex("PrimaryUserUID")
.HasDatabaseName("ix_auth_primary_user_uid");
b.HasIndex("UserUID")
.HasDatabaseName("ix_auth_user_uid");
b.ToTable("auth", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.Banned", b =>
{
b.Property<string>("CharacterIdentification")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("character_identification");
b.Property<string>("Reason")
.HasColumnType("text")
.HasColumnName("reason");
b.Property<byte[]>("Timestamp")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("bytea")
.HasColumnName("timestamp");
b.HasKey("CharacterIdentification")
.HasName("pk_banned_users");
b.ToTable("banned_users", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.BannedRegistrations", b =>
{
b.Property<string>("DiscordIdOrLodestoneAuth")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("discord_id_or_lodestone_auth");
b.HasKey("DiscordIdOrLodestoneAuth")
.HasName("pk_banned_registrations");
b.ToTable("banned_registrations", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b =>
{
b.Property<string>("UserUID")
.HasMaxLength(10)
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.Property<string>("OtherUserUID")
.HasMaxLength(10)
.HasColumnType("character varying(10)")
.HasColumnName("other_user_uid");
b.Property<byte[]>("Timestamp")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("bytea")
.HasColumnName("timestamp");
b.HasKey("UserUID", "OtherUserUID")
.HasName("pk_client_pairs");
b.HasIndex("OtherUserUID")
.HasDatabaseName("ix_client_pairs_other_user_uid");
b.HasIndex("UserUID")
.HasDatabaseName("ix_client_pairs_user_uid");
b.ToTable("client_pairs", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b =>
{
b.Property<string>("Hash")
.HasMaxLength(40)
.HasColumnType("character varying(40)")
.HasColumnName("hash");
b.Property<long>("Size")
.HasColumnType("bigint")
.HasColumnName("size");
b.Property<byte[]>("Timestamp")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("bytea")
.HasColumnName("timestamp");
b.Property<DateTime>("UploadDate")
.HasColumnType("timestamp with time zone")
.HasColumnName("upload_date");
b.Property<bool>("Uploaded")
.HasColumnType("boolean")
.HasColumnName("uploaded");
b.Property<string>("UploaderUID")
.HasMaxLength(10)
.HasColumnType("character varying(10)")
.HasColumnName("uploader_uid");
b.HasKey("Hash")
.HasName("pk_file_caches");
b.HasIndex("UploaderUID")
.HasDatabaseName("ix_file_caches_uploader_uid");
b.ToTable("file_caches", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.ForbiddenUploadEntry", b =>
{
b.Property<string>("Hash")
.HasMaxLength(40)
.HasColumnType("character varying(40)")
.HasColumnName("hash");
b.Property<string>("ForbiddenBy")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("forbidden_by");
b.Property<byte[]>("Timestamp")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("bytea")
.HasColumnName("timestamp");
b.HasKey("Hash")
.HasName("pk_forbidden_upload_entries");
b.ToTable("forbidden_upload_entries", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.Group", b =>
{
b.Property<string>("GID")
.HasMaxLength(20)
.HasColumnType("character varying(20)")
.HasColumnName("gid");
b.Property<string>("Alias")
.HasMaxLength(50)
.HasColumnType("character varying(50)")
.HasColumnName("alias");
b.Property<string>("HashedPassword")
.HasColumnType("text")
.HasColumnName("hashed_password");
b.Property<bool>("InvitesEnabled")
.HasColumnType("boolean")
.HasColumnName("invites_enabled");
b.Property<string>("OwnerUID")
.HasColumnType("character varying(10)")
.HasColumnName("owner_uid");
b.Property<bool>("PreferDisableAnimations")
.HasColumnType("boolean")
.HasColumnName("prefer_disable_animations");
b.Property<bool>("PreferDisableSounds")
.HasColumnType("boolean")
.HasColumnName("prefer_disable_sounds");
b.Property<bool>("PreferDisableVFX")
.HasColumnType("boolean")
.HasColumnName("prefer_disable_vfx");
b.HasKey("GID")
.HasName("pk_groups");
b.HasIndex("OwnerUID")
.HasDatabaseName("ix_groups_owner_uid");
b.ToTable("groups", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b =>
{
b.Property<string>("GroupGID")
.HasColumnType("character varying(20)")
.HasColumnName("group_gid");
b.Property<string>("BannedUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("banned_user_uid");
b.Property<string>("BannedByUID")
.HasColumnType("character varying(10)")
.HasColumnName("banned_by_uid");
b.Property<DateTime>("BannedOn")
.HasColumnType("timestamp with time zone")
.HasColumnName("banned_on");
b.Property<string>("BannedReason")
.HasColumnType("text")
.HasColumnName("banned_reason");
b.HasKey("GroupGID", "BannedUserUID")
.HasName("pk_group_bans");
b.HasIndex("BannedByUID")
.HasDatabaseName("ix_group_bans_banned_by_uid");
b.HasIndex("BannedUserUID")
.HasDatabaseName("ix_group_bans_banned_user_uid");
b.HasIndex("GroupGID")
.HasDatabaseName("ix_group_bans_group_gid");
b.ToTable("group_bans", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b =>
{
b.Property<string>("GroupGID")
.HasColumnType("character varying(20)")
.HasColumnName("group_gid");
b.Property<string>("GroupUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("group_user_uid");
b.Property<bool>("IsModerator")
.HasColumnType("boolean")
.HasColumnName("is_moderator");
b.Property<bool>("IsPinned")
.HasColumnType("boolean")
.HasColumnName("is_pinned");
b.HasKey("GroupGID", "GroupUserUID")
.HasName("pk_group_pairs");
b.HasIndex("GroupGID")
.HasDatabaseName("ix_group_pairs_group_gid");
b.HasIndex("GroupUserUID")
.HasDatabaseName("ix_group_pairs_group_user_uid");
b.ToTable("group_pairs", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupPairPreferredPermission", b =>
{
b.Property<string>("UserUID")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.Property<string>("GroupGID")
.HasColumnType("character varying(20)")
.HasColumnName("group_gid");
b.Property<bool>("DisableAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_animations");
b.Property<bool>("DisableSounds")
.HasColumnType("boolean")
.HasColumnName("disable_sounds");
b.Property<bool>("DisableVFX")
.HasColumnType("boolean")
.HasColumnName("disable_vfx");
b.Property<bool>("IsPaused")
.HasColumnType("boolean")
.HasColumnName("is_paused");
b.HasKey("UserUID", "GroupGID")
.HasName("pk_group_pair_preferred_permissions");
b.HasIndex("GroupGID")
.HasDatabaseName("ix_group_pair_preferred_permissions_group_gid");
b.HasIndex("UserUID")
.HasDatabaseName("ix_group_pair_preferred_permissions_user_uid");
b.ToTable("group_pair_preferred_permissions", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b =>
{
b.Property<string>("GroupGID")
.HasColumnType("character varying(20)")
.HasColumnName("group_gid");
b.Property<string>("Invite")
.HasMaxLength(64)
.HasColumnType("character varying(64)")
.HasColumnName("invite");
b.Property<DateTime>("ExpirationDate")
.HasColumnType("timestamp with time zone")
.HasColumnName("expiration_date");
b.HasKey("GroupGID", "Invite")
.HasName("pk_group_temp_invites");
b.HasIndex("GroupGID")
.HasDatabaseName("ix_group_temp_invites_group_gid");
b.HasIndex("Invite")
.HasDatabaseName("ix_group_temp_invites_invite");
b.ToTable("group_temp_invites", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b =>
{
b.Property<decimal>("DiscordId")
.ValueGeneratedOnAdd()
.HasColumnType("numeric(20,0)")
.HasColumnName("discord_id");
b.Property<string>("HashedLodestoneId")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("hashed_lodestone_id");
b.Property<string>("LodestoneAuthString")
.HasMaxLength(100)
.HasColumnType("character varying(100)")
.HasColumnName("lodestone_auth_string");
b.Property<DateTime?>("StartedAt")
.HasColumnType("timestamp with time zone")
.HasColumnName("started_at");
b.Property<string>("UserUID")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.HasKey("DiscordId")
.HasName("pk_lodestone_auth");
b.HasIndex("UserUID")
.HasDatabaseName("ix_lodestone_auth_user_uid");
b.ToTable("lodestone_auth", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.User", b =>
{
b.Property<string>("UID")
.HasMaxLength(10)
.HasColumnType("character varying(10)")
.HasColumnName("uid");
b.Property<string>("Alias")
.HasMaxLength(15)
.HasColumnType("character varying(15)")
.HasColumnName("alias");
b.Property<bool>("IsAdmin")
.HasColumnType("boolean")
.HasColumnName("is_admin");
b.Property<bool>("IsModerator")
.HasColumnType("boolean")
.HasColumnName("is_moderator");
b.Property<DateTime>("LastLoggedIn")
.HasColumnType("timestamp with time zone")
.HasColumnName("last_logged_in");
b.Property<byte[]>("Timestamp")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
.HasColumnType("bytea")
.HasColumnName("timestamp");
b.HasKey("UID")
.HasName("pk_users");
b.ToTable("users", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.UserDefaultPreferredPermission", b =>
{
b.Property<string>("UserUID")
.HasMaxLength(10)
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.Property<bool>("DisableGroupAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_group_animations");
b.Property<bool>("DisableGroupSounds")
.HasColumnType("boolean")
.HasColumnName("disable_group_sounds");
b.Property<bool>("DisableGroupVFX")
.HasColumnType("boolean")
.HasColumnName("disable_group_vfx");
b.Property<bool>("DisableIndividualAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_individual_animations");
b.Property<bool>("DisableIndividualSounds")
.HasColumnType("boolean")
.HasColumnName("disable_individual_sounds");
b.Property<bool>("DisableIndividualVFX")
.HasColumnType("boolean")
.HasColumnName("disable_individual_vfx");
b.Property<bool>("IndividualIsSticky")
.HasColumnType("boolean")
.HasColumnName("individual_is_sticky");
b.HasKey("UserUID")
.HasName("pk_user_default_preferred_permissions");
b.HasIndex("UserUID")
.HasDatabaseName("ix_user_default_preferred_permissions_user_uid");
b.ToTable("user_default_preferred_permissions", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.UserPermissionQuery", b =>
{
b.Property<string>("Alias")
.HasColumnType("text")
.HasColumnName("alias");
b.Property<string>("GID")
.HasColumnType("text")
.HasColumnName("gid");
b.Property<string>("OtherUserUID")
.HasColumnType("text")
.HasColumnName("other_user_uid");
b.Property<bool>("OtherpermDisableAnimations")
.HasColumnType("boolean")
.HasColumnName("otherperm_disable_animations");
b.Property<bool>("OtherpermDisableSounds")
.HasColumnType("boolean")
.HasColumnName("otherperm_disable_sounds");
b.Property<bool>("OtherpermDisableVFX")
.HasColumnType("boolean")
.HasColumnName("otherperm_disable_vfx");
b.Property<bool>("OtherpermIsPaused")
.HasColumnType("boolean")
.HasColumnName("otherperm_is_paused");
b.Property<bool>("OwnPermSticky")
.HasColumnType("boolean")
.HasColumnName("own_perm_sticky");
b.Property<bool>("OwnpermDisableAnimations")
.HasColumnType("boolean")
.HasColumnName("ownperm_disable_animations");
b.Property<bool>("OwnpermDisableSounds")
.HasColumnType("boolean")
.HasColumnName("ownperm_disable_sounds");
b.Property<bool>("OwnpermDisableVFX")
.HasColumnType("boolean")
.HasColumnName("ownperm_disable_vfx");
b.Property<bool>("OwnpermIsPaused")
.HasColumnType("boolean")
.HasColumnName("ownperm_is_paused");
b.Property<bool>("Synced")
.HasColumnType("boolean")
.HasColumnName("synced");
b.Property<string>("UserUID")
.HasColumnType("text")
.HasColumnName("user_uid");
b.ToTable("user_permission_query", null, t =>
{
t.ExcludeFromMigrations();
});
});
modelBuilder.Entity("MareSynchronosShared.Models.UserPermissionSet", b =>
{
b.Property<string>("UserUID")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.Property<string>("OtherUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("other_user_uid");
b.Property<bool>("DisableAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_animations");
b.Property<bool>("DisableSounds")
.HasColumnType("boolean")
.HasColumnName("disable_sounds");
b.Property<bool>("DisableVFX")
.HasColumnType("boolean")
.HasColumnName("disable_vfx");
b.Property<bool>("IsPaused")
.HasColumnType("boolean")
.HasColumnName("is_paused");
b.Property<bool>("Sticky")
.HasColumnType("boolean")
.HasColumnName("sticky");
b.HasKey("UserUID", "OtherUserUID")
.HasName("pk_user_permission_sets");
b.HasIndex("OtherUserUID")
.HasDatabaseName("ix_user_permission_sets_other_user_uid");
b.HasIndex("UserUID")
.HasDatabaseName("ix_user_permission_sets_user_uid");
b.ToTable("user_permission_sets", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b =>
{
b.Property<string>("UserUID")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.Property<string>("Base64ProfileImage")
.HasColumnType("text")
.HasColumnName("base64profile_image");
b.Property<bool>("FlaggedForReport")
.HasColumnType("boolean")
.HasColumnName("flagged_for_report");
b.Property<bool>("IsNSFW")
.HasColumnType("boolean")
.HasColumnName("is_nsfw");
b.Property<bool>("ProfileDisabled")
.HasColumnType("boolean")
.HasColumnName("profile_disabled");
b.Property<string>("UserDescription")
.HasColumnType("text")
.HasColumnName("user_description");
b.HasKey("UserUID")
.HasName("pk_user_profile_data");
b.ToTable("user_profile_data", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("id");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<DateTime>("ReportDate")
.HasColumnType("timestamp with time zone")
.HasColumnName("report_date");
b.Property<string>("ReportReason")
.HasColumnType("text")
.HasColumnName("report_reason");
b.Property<string>("ReportedUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("reported_user_uid");
b.Property<string>("ReportingUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("reporting_user_uid");
b.HasKey("Id")
.HasName("pk_user_profile_data_reports");
b.HasIndex("ReportedUserUID")
.HasDatabaseName("ix_user_profile_data_reports_reported_user_uid");
b.HasIndex("ReportingUserUID")
.HasDatabaseName("ix_user_profile_data_reports_reporting_user_uid");
b.ToTable("user_profile_data_reports", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.Auth", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "PrimaryUser")
.WithMany()
.HasForeignKey("PrimaryUserUID")
.HasConstraintName("fk_auth_users_primary_user_temp_id");
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.HasConstraintName("fk_auth_users_user_temp_id1");
b.Navigation("PrimaryUser");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.ClientPair", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "OtherUser")
.WithMany()
.HasForeignKey("OtherUserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_client_pairs_users_other_user_temp_id2");
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_client_pairs_users_user_temp_id3");
b.Navigation("OtherUser");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.FileCache", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "Uploader")
.WithMany()
.HasForeignKey("UploaderUID")
.HasConstraintName("fk_file_caches_users_uploader_uid");
b.Navigation("Uploader");
});
modelBuilder.Entity("MareSynchronosShared.Models.Group", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "Owner")
.WithMany()
.HasForeignKey("OwnerUID")
.HasConstraintName("fk_groups_users_owner_temp_id9");
b.Navigation("Owner");
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupBan", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "BannedBy")
.WithMany()
.HasForeignKey("BannedByUID")
.HasConstraintName("fk_group_bans_users_banned_by_temp_id5");
b.HasOne("MareSynchronosShared.Models.User", "BannedUser")
.WithMany()
.HasForeignKey("BannedUserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_bans_users_banned_user_temp_id6");
b.HasOne("MareSynchronosShared.Models.Group", "Group")
.WithMany()
.HasForeignKey("GroupGID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_bans_groups_group_temp_id");
b.Navigation("BannedBy");
b.Navigation("BannedUser");
b.Navigation("Group");
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupPair", b =>
{
b.HasOne("MareSynchronosShared.Models.Group", "Group")
.WithMany()
.HasForeignKey("GroupGID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_pairs_groups_group_temp_id2");
b.HasOne("MareSynchronosShared.Models.User", "GroupUser")
.WithMany()
.HasForeignKey("GroupUserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_pairs_users_group_user_temp_id8");
b.Navigation("Group");
b.Navigation("GroupUser");
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupPairPreferredPermission", b =>
{
b.HasOne("MareSynchronosShared.Models.Group", "Group")
.WithMany()
.HasForeignKey("GroupGID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_pair_preferred_permissions_groups_group_temp_id1");
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_pair_preferred_permissions_users_user_temp_id7");
b.Navigation("Group");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b =>
{
b.HasOne("MareSynchronosShared.Models.Group", "Group")
.WithMany()
.HasForeignKey("GroupGID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_temp_invites_groups_group_gid");
b.Navigation("Group");
});
modelBuilder.Entity("MareSynchronosShared.Models.LodeStoneAuth", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.HasConstraintName("fk_lodestone_auth_users_user_uid");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.UserDefaultPreferredPermission", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_user_default_preferred_permissions_users_user_uid");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.UserPermissionSet", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "OtherUser")
.WithMany()
.HasForeignKey("OtherUserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_user_permission_sets_users_other_user_uid");
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_user_permission_sets_users_user_uid");
b.Navigation("OtherUser");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_user_profile_data_users_user_uid");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.UserProfileDataReport", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "ReportedUser")
.WithMany()
.HasForeignKey("ReportedUserUID")
.HasConstraintName("fk_user_profile_data_reports_users_reported_user_uid");
b.HasOne("MareSynchronosShared.Models.User", "ReportingUser")
.WithMany()
.HasForeignKey("ReportingUserUID")
.HasConstraintName("fk_user_profile_data_reports_users_reporting_user_uid");
b.Navigation("ReportedUser");
b.Navigation("ReportingUser");
});
#pragma warning restore 612, 618
}
}
}

View File

@@ -0,0 +1,87 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace MareSynchronosServer.Migrations
{
/// <inheritdoc />
public partial class AlterPermissions : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "fk_user_default_preferred_permissions_users_user_temp_id13",
table: "user_default_preferred_permissions");
migrationBuilder.DropIndex(
name: "ix_user_default_preferred_permissions_user_uid1",
table: "user_default_preferred_permissions");
migrationBuilder.DropColumn(
name: "user_uid1",
table: "user_default_preferred_permissions");
migrationBuilder.AlterColumn<string>(
name: "user_uid",
table: "user_default_preferred_permissions",
type: "character varying(10)",
maxLength: 10,
nullable: false,
oldClrType: typeof(string),
oldType: "text");
migrationBuilder.CreateIndex(
name: "ix_user_default_preferred_permissions_user_uid",
table: "user_default_preferred_permissions",
column: "user_uid");
migrationBuilder.AddForeignKey(
name: "fk_user_default_preferred_permissions_users_user_uid",
table: "user_default_preferred_permissions",
column: "user_uid",
principalTable: "users",
principalColumn: "uid",
onDelete: ReferentialAction.Cascade);
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "fk_user_default_preferred_permissions_users_user_uid",
table: "user_default_preferred_permissions");
migrationBuilder.DropIndex(
name: "ix_user_default_preferred_permissions_user_uid",
table: "user_default_preferred_permissions");
migrationBuilder.AlterColumn<string>(
name: "user_uid",
table: "user_default_preferred_permissions",
type: "text",
nullable: false,
oldClrType: typeof(string),
oldType: "character varying(10)",
oldMaxLength: 10);
migrationBuilder.AddColumn<string>(
name: "user_uid1",
table: "user_default_preferred_permissions",
type: "character varying(10)",
nullable: true);
migrationBuilder.CreateIndex(
name: "ix_user_default_preferred_permissions_user_uid1",
table: "user_default_preferred_permissions",
column: "user_uid1");
migrationBuilder.AddForeignKey(
name: "fk_user_default_preferred_permissions_users_user_temp_id13",
table: "user_default_preferred_permissions",
column: "user_uid1",
principalTable: "users",
principalColumn: "uid");
}
}
}

View File

@@ -17,7 +17,7 @@ namespace MareSynchronosServer.Migrations
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "7.0.4")
.HasAnnotation("ProductVersion", "7.0.5")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
@@ -101,26 +101,6 @@ namespace MareSynchronosServer.Migrations
.HasColumnType("character varying(10)")
.HasColumnName("other_user_uid");
b.Property<bool>("AllowReceivingMessages")
.HasColumnType("boolean")
.HasColumnName("allow_receiving_messages");
b.Property<bool>("DisableAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_animations");
b.Property<bool>("DisableSounds")
.HasColumnType("boolean")
.HasColumnName("disable_sounds");
b.Property<bool>("DisableVFX")
.HasColumnType("boolean")
.HasColumnName("disable_vfx");
b.Property<bool>("IsPaused")
.HasColumnType("boolean")
.HasColumnName("is_paused");
b.Property<byte[]>("Timestamp")
.IsConcurrencyToken()
.ValueGeneratedOnAddOrUpdate()
@@ -214,18 +194,6 @@ namespace MareSynchronosServer.Migrations
.HasColumnType("character varying(50)")
.HasColumnName("alias");
b.Property<bool>("DisableAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_animations");
b.Property<bool>("DisableSounds")
.HasColumnType("boolean")
.HasColumnName("disable_sounds");
b.Property<bool>("DisableVFX")
.HasColumnType("boolean")
.HasColumnName("disable_vfx");
b.Property<string>("HashedPassword")
.HasColumnType("text")
.HasColumnName("hashed_password");
@@ -238,6 +206,18 @@ namespace MareSynchronosServer.Migrations
.HasColumnType("character varying(10)")
.HasColumnName("owner_uid");
b.Property<bool>("PreferDisableAnimations")
.HasColumnType("boolean")
.HasColumnName("prefer_disable_animations");
b.Property<bool>("PreferDisableSounds")
.HasColumnType("boolean")
.HasColumnName("prefer_disable_sounds");
b.Property<bool>("PreferDisableVFX")
.HasColumnType("boolean")
.HasColumnName("prefer_disable_vfx");
b.HasKey("GID")
.HasName("pk_groups");
@@ -294,26 +274,10 @@ namespace MareSynchronosServer.Migrations
.HasColumnType("character varying(10)")
.HasColumnName("group_user_uid");
b.Property<bool>("DisableAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_animations");
b.Property<bool>("DisableSounds")
.HasColumnType("boolean")
.HasColumnName("disable_sounds");
b.Property<bool>("DisableVFX")
.HasColumnType("boolean")
.HasColumnName("disable_vfx");
b.Property<bool>("IsModerator")
.HasColumnType("boolean")
.HasColumnName("is_moderator");
b.Property<bool>("IsPaused")
.HasColumnType("boolean")
.HasColumnName("is_paused");
b.Property<bool>("IsPinned")
.HasColumnType("boolean")
.HasColumnName("is_pinned");
@@ -330,6 +294,44 @@ namespace MareSynchronosServer.Migrations
b.ToTable("group_pairs", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupPairPreferredPermission", b =>
{
b.Property<string>("UserUID")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.Property<string>("GroupGID")
.HasColumnType("character varying(20)")
.HasColumnName("group_gid");
b.Property<bool>("DisableAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_animations");
b.Property<bool>("DisableSounds")
.HasColumnType("boolean")
.HasColumnName("disable_sounds");
b.Property<bool>("DisableVFX")
.HasColumnType("boolean")
.HasColumnName("disable_vfx");
b.Property<bool>("IsPaused")
.HasColumnType("boolean")
.HasColumnName("is_paused");
b.HasKey("UserUID", "GroupGID")
.HasName("pk_group_pair_preferred_permissions");
b.HasIndex("GroupGID")
.HasDatabaseName("ix_group_pair_preferred_permissions_group_gid");
b.HasIndex("UserUID")
.HasDatabaseName("ix_group_pair_preferred_permissions_user_uid");
b.ToTable("group_pair_preferred_permissions", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b =>
{
b.Property<string>("GroupGID")
@@ -427,6 +429,156 @@ namespace MareSynchronosServer.Migrations
b.ToTable("users", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.UserDefaultPreferredPermission", b =>
{
b.Property<string>("UserUID")
.HasMaxLength(10)
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.Property<bool>("DisableGroupAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_group_animations");
b.Property<bool>("DisableGroupSounds")
.HasColumnType("boolean")
.HasColumnName("disable_group_sounds");
b.Property<bool>("DisableGroupVFX")
.HasColumnType("boolean")
.HasColumnName("disable_group_vfx");
b.Property<bool>("DisableIndividualAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_individual_animations");
b.Property<bool>("DisableIndividualSounds")
.HasColumnType("boolean")
.HasColumnName("disable_individual_sounds");
b.Property<bool>("DisableIndividualVFX")
.HasColumnType("boolean")
.HasColumnName("disable_individual_vfx");
b.Property<bool>("IndividualIsSticky")
.HasColumnType("boolean")
.HasColumnName("individual_is_sticky");
b.HasKey("UserUID")
.HasName("pk_user_default_preferred_permissions");
b.HasIndex("UserUID")
.HasDatabaseName("ix_user_default_preferred_permissions_user_uid");
b.ToTable("user_default_preferred_permissions", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.UserPermissionQuery", b =>
{
b.Property<string>("Alias")
.HasColumnType("text")
.HasColumnName("alias");
b.Property<string>("GID")
.HasColumnType("text")
.HasColumnName("gid");
b.Property<string>("OtherUserUID")
.HasColumnType("text")
.HasColumnName("other_user_uid");
b.Property<bool>("OtherpermDisableAnimations")
.HasColumnType("boolean")
.HasColumnName("otherperm_disable_animations");
b.Property<bool>("OtherpermDisableSounds")
.HasColumnType("boolean")
.HasColumnName("otherperm_disable_sounds");
b.Property<bool>("OtherpermDisableVFX")
.HasColumnType("boolean")
.HasColumnName("otherperm_disable_vfx");
b.Property<bool>("OtherpermIsPaused")
.HasColumnType("boolean")
.HasColumnName("otherperm_is_paused");
b.Property<bool>("OwnPermSticky")
.HasColumnType("boolean")
.HasColumnName("own_perm_sticky");
b.Property<bool>("OwnpermDisableAnimations")
.HasColumnType("boolean")
.HasColumnName("ownperm_disable_animations");
b.Property<bool>("OwnpermDisableSounds")
.HasColumnType("boolean")
.HasColumnName("ownperm_disable_sounds");
b.Property<bool>("OwnpermDisableVFX")
.HasColumnType("boolean")
.HasColumnName("ownperm_disable_vfx");
b.Property<bool>("OwnpermIsPaused")
.HasColumnType("boolean")
.HasColumnName("ownperm_is_paused");
b.Property<bool>("Synced")
.HasColumnType("boolean")
.HasColumnName("synced");
b.Property<string>("UserUID")
.HasColumnType("text")
.HasColumnName("user_uid");
b.ToTable("user_permission_query", null, t =>
{
t.ExcludeFromMigrations();
});
});
modelBuilder.Entity("MareSynchronosShared.Models.UserPermissionSet", b =>
{
b.Property<string>("UserUID")
.HasColumnType("character varying(10)")
.HasColumnName("user_uid");
b.Property<string>("OtherUserUID")
.HasColumnType("character varying(10)")
.HasColumnName("other_user_uid");
b.Property<bool>("DisableAnimations")
.HasColumnType("boolean")
.HasColumnName("disable_animations");
b.Property<bool>("DisableSounds")
.HasColumnType("boolean")
.HasColumnName("disable_sounds");
b.Property<bool>("DisableVFX")
.HasColumnType("boolean")
.HasColumnName("disable_vfx");
b.Property<bool>("IsPaused")
.HasColumnType("boolean")
.HasColumnName("is_paused");
b.Property<bool>("Sticky")
.HasColumnType("boolean")
.HasColumnName("sticky");
b.HasKey("UserUID", "OtherUserUID")
.HasName("pk_user_permission_sets");
b.HasIndex("OtherUserUID")
.HasDatabaseName("ix_user_permission_sets_other_user_uid");
b.HasIndex("UserUID")
.HasDatabaseName("ix_user_permission_sets_user_uid");
b.ToTable("user_permission_sets", (string)null);
});
modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b =>
{
b.Property<string>("UserUID")
@@ -549,7 +701,7 @@ namespace MareSynchronosServer.Migrations
b.HasOne("MareSynchronosShared.Models.User", "Owner")
.WithMany()
.HasForeignKey("OwnerUID")
.HasConstraintName("fk_groups_users_owner_temp_id8");
.HasConstraintName("fk_groups_users_owner_temp_id9");
b.Navigation("Owner");
});
@@ -589,20 +741,41 @@ namespace MareSynchronosServer.Migrations
.HasForeignKey("GroupGID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_pairs_groups_group_temp_id1");
.HasConstraintName("fk_group_pairs_groups_group_temp_id2");
b.HasOne("MareSynchronosShared.Models.User", "GroupUser")
.WithMany()
.HasForeignKey("GroupUserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_pairs_users_group_user_temp_id7");
.HasConstraintName("fk_group_pairs_users_group_user_temp_id8");
b.Navigation("Group");
b.Navigation("GroupUser");
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupPairPreferredPermission", b =>
{
b.HasOne("MareSynchronosShared.Models.Group", "Group")
.WithMany()
.HasForeignKey("GroupGID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_pair_preferred_permissions_groups_group_temp_id1");
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_group_pair_preferred_permissions_users_user_temp_id7");
b.Navigation("Group");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.GroupTempInvite", b =>
{
b.HasOne("MareSynchronosShared.Models.Group", "Group")
@@ -625,6 +798,39 @@ namespace MareSynchronosServer.Migrations
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.UserDefaultPreferredPermission", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_user_default_preferred_permissions_users_user_uid");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.UserPermissionSet", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "OtherUser")
.WithMany()
.HasForeignKey("OtherUserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_user_permission_sets_users_other_user_uid");
b.HasOne("MareSynchronosShared.Models.User", "User")
.WithMany()
.HasForeignKey("UserUID")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired()
.HasConstraintName("fk_user_permission_sets_users_user_uid");
b.Navigation("OtherUser");
b.Navigation("User");
});
modelBuilder.Entity("MareSynchronosShared.Models.UserProfileData", b =>
{
b.HasOne("MareSynchronosShared.Models.User", "User")

View File

@@ -10,11 +10,6 @@ public class ClientPair
[MaxLength(10)]
public string OtherUserUID { get; set; }
public User OtherUser { get; set; }
public bool IsPaused { get; set; }
public bool AllowReceivingMessages { get; set; } = false;
[Timestamp]
public byte[] Timestamp { get; set; }
public bool DisableSounds { get; set; } = false;
public bool DisableAnimations { get; set; } = false;
public bool DisableVFX { get; set; } = false;
}

View File

@@ -13,7 +13,7 @@ public class Group
public string Alias { get; set; }
public bool InvitesEnabled { get; set; }
public string HashedPassword { get; set; }
public bool DisableSounds { get; set; }
public bool DisableAnimations { get; set; }
public bool DisableVFX { get; set; }
public bool PreferDisableSounds { get; set; }
public bool PreferDisableAnimations { get; set; }
public bool PreferDisableVFX { get; set; }
}

View File

@@ -6,10 +6,6 @@ public class GroupPair
public Group Group { get; set; }
public string GroupUserUID { get; set; }
public User GroupUser { get; set; }
public bool IsPaused { get; set; }
public bool IsPinned { get; set; }
public bool IsModerator { get; set; }
public bool DisableSounds { get; set; }
public bool DisableAnimations { get; set; }
public bool DisableVFX { get; set; }
}

View File

@@ -0,0 +1,13 @@
namespace MareSynchronosShared.Models;
public class GroupPairPreferredPermission
{
public string GroupGID { get; set; }
public Group Group { get; set; }
public string UserUID { get; set; }
public User User { get; set; }
public bool IsPaused { get; set; }
public bool DisableAnimations { get; set; }
public bool DisableSounds { get; set; }
public bool DisableVFX { get; set; }
}

View File

@@ -0,0 +1,22 @@
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace MareSynchronosShared.Models;
public class UserDefaultPreferredPermission
{
[Key]
[MaxLength(10)]
[ForeignKey("User")]
public string UserUID { get; set; }
public User User { get; set; }
public bool DisableIndividualAnimations { get; set; } = false;
public bool DisableIndividualSounds { get; set; } = false;
public bool DisableIndividualVFX { get; set; } = false;
public bool DisableGroupAnimations { get; set; } = false;
public bool DisableGroupSounds { get; set; } = false;
public bool DisableGroupVFX { get; set; } = false;
public bool IndividualIsSticky { get; set; } = false;
}

View File

@@ -0,0 +1,40 @@
namespace MareSynchronosShared.Models;
public class UserPermissionQuery
{
public string UserUID { get; set; }
public string OtherUserUID { get; set; }
public string Alias { get; set; }
public string GID { get; set; }
public bool Synced { get; set; }
public bool OwnpermIsPaused { get; set; }
public bool OwnpermSticky { get; set; }
public bool OwnpermDisableAnimations { get; set; }
public bool OwnpermDisableSounds { get; set; }
public bool OwnpermDisableVFX { get; set; }
public bool? OtherpermIsPaused { get; set; }
public bool? OtherpermDisableAnimations { get; set; }
public bool? OtherpermDisableSounds { get; set; }
public bool? OtherpermDisableVFX { get; set; }
public UserPermissionSet OwnPermissions => new UserPermissionSet
{
UserUID = UserUID,
OtherUserUID = OtherUserUID,
IsPaused = OwnpermIsPaused,
DisableAnimations = OwnpermDisableAnimations,
DisableSounds = OwnpermDisableSounds,
DisableVFX = OwnpermDisableVFX,
Sticky = OwnpermSticky
};
public UserPermissionSet? OtherPermissions => !Synced ? null : new UserPermissionSet
{
UserUID = OtherUserUID,
OtherUserUID = UserUID,
IsPaused = OtherpermIsPaused ?? false,
DisableAnimations = OtherpermDisableAnimations ?? false,
DisableSounds = OtherpermDisableSounds ?? false,
DisableVFX = OtherpermDisableVFX ?? false,
};
}

View File

@@ -0,0 +1,18 @@
using System.Diagnostics.CodeAnalysis;
namespace MareSynchronosShared.Models;
public class UserPermissionSet
{
[NotNull]
public string UserUID { get; set; }
public User User { get; set; }
[NotNull]
public string OtherUserUID { get; set; }
public User OtherUser { get; set; }
public bool Sticky { get; set; } = false;
public bool IsPaused { get; set; } = false;
public bool DisableAnimations { get; set; } = false;
public bool DisableVFX { get; set; } = false;
public bool DisableSounds { get; set; } = false;
}

View File

@@ -0,0 +1,50 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR;
using MareSynchronosShared.Utils;
using System.Globalization;
namespace MareSynchronosShared.RequirementHandlers;
public class ValidTokenRequirementHandler : AuthorizationHandler<ValidTokenRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ValidTokenRequirement requirement)
{
var expirationClaimValue = context.User.Claims.Single(r => string.Equals(r.Type, MareClaimTypes.Expires, StringComparison.Ordinal))?.Value;
if (expirationClaimValue == null)
{
context.Fail();
}
DateTime expirationDate = new(long.Parse(expirationClaimValue, CultureInfo.InvariantCulture), DateTimeKind.Utc);
if (expirationDate < DateTime.UtcNow)
{
context.Fail();
}
context.Succeed(requirement);
return Task.CompletedTask;
}
}
public class ValidTokenHubRequirementHandler : AuthorizationHandler<ValidTokenRequirement, HubInvocationContext>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, ValidTokenRequirement requirement, HubInvocationContext resource)
{
var expirationClaimValue = context.User.Claims.Single(r => string.Equals(r.Type, MareClaimTypes.Expires, StringComparison.Ordinal))?.Value;
if (expirationClaimValue == null)
{
context.Fail();
}
DateTime expirationDate = new(long.Parse(expirationClaimValue, CultureInfo.InvariantCulture), DateTimeKind.Utc);
if (expirationDate < DateTime.UtcNow)
{
context.Fail();
}
context.Succeed(requirement);
return Task.CompletedTask;
}
}

View File

@@ -0,0 +1,5 @@
using Microsoft.AspNetCore.Authorization;
namespace MareSynchronosShared.RequirementHandlers;
public class ValidTokenRequirement : IAuthorizationRequirement { }

View File

@@ -5,4 +5,5 @@ public static class MareClaimTypes
public const string Uid = "uid";
public const string CharaIdent = "character_identification";
public const string Internal = "internal";
public const string Expires = "expiration_date";
}

View File

@@ -100,6 +100,16 @@ public static class SharedDbFunctions
await dbContext.SaveChangesAsync().ConfigureAwait(false);
}
var defaultPermissions = await dbContext.UserDefaultPreferredPermissions.Where(u => u.UserUID == user.UID).ToListAsync().ConfigureAwait(false);
var groupPermissions = await dbContext.GroupPairPreferredPermissions.Where(u => u.UserUID == user.UID).ToListAsync().ConfigureAwait(false);
var individualPermissions = await dbContext.Permissions.Where(u => u.UserUID == user.UID || u.OtherUserUID == user.UID).ToListAsync().ConfigureAwait(false);
var bannedinGroups = await dbContext.GroupBans.Where(u => u.BannedUserUID == user.UID).ToListAsync().ConfigureAwait(false);
dbContext.GroupPairPreferredPermissions.RemoveRange(groupPermissions);
dbContext.UserDefaultPreferredPermissions.RemoveRange(defaultPermissions);
dbContext.Permissions.RemoveRange(individualPermissions);
dbContext.GroupBans.RemoveRange(bannedinGroups);
_logger.LogInformation("User purged: {uid}", user.UID);
dbContext.Auth.Remove(auth);