using MareSynchronosShared.Models; using Microsoft.EntityFrameworkCore.Migrations; using static System.Runtime.InteropServices.JavaScript.JSType; #nullable disable namespace MareSynchronosServer.Migrations { /// public partial class permissions : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) { migrationBuilder.CreateTable( name: "group_pair_preferred_permissions", columns: table => new { group_gid = table.Column(type: "character varying(20)", nullable: false), user_uid = table.Column(type: "character varying(10)", nullable: false), is_paused = table.Column(type: "boolean", nullable: false), disable_animations = table.Column(type: "boolean", nullable: false), disable_sounds = table.Column(type: "boolean", nullable: false), disable_vfx = table.Column(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(type: "text", nullable: false), user_uid1 = table.Column(type: "character varying(10)", nullable: true), disable_individual_animations = table.Column(type: "boolean", nullable: false), disable_individual_sounds = table.Column(type: "boolean", nullable: false), disable_individual_vfx = table.Column(type: "boolean", nullable: false), disable_group_animations = table.Column(type: "boolean", nullable: false), disable_group_sounds = table.Column(type: "boolean", nullable: false), disable_group_vfx = table.Column(type: "boolean", nullable: false), individual_is_sticky = table.Column(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(type: "character varying(10)", nullable: false), other_user_uid = table.Column(type: "character varying(10)", nullable: false), sticky = table.Column(type: "boolean", nullable: false), is_paused = table.Column(type: "boolean", nullable: false), disable_animations = table.Column(type: "boolean", nullable: false), disable_vfx = table.Column(type: "boolean", nullable: false), disable_sounds = table.Column(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_vfx as disable_vfx, user1.disable_sounds as disable_sounds 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_vfx or gp.disable_vfx), bool_and(g.disable_sounds or gp.disable_sounds) 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;"); } /// 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( name: "disable_animations", table: "group_pairs", type: "boolean", nullable: false, defaultValue: false); migrationBuilder.AddColumn( name: "disable_sounds", table: "group_pairs", type: "boolean", nullable: false, defaultValue: false); migrationBuilder.AddColumn( name: "disable_vfx", table: "group_pairs", type: "boolean", nullable: false, defaultValue: false); migrationBuilder.AddColumn( name: "is_paused", table: "group_pairs", type: "boolean", nullable: false, defaultValue: false); migrationBuilder.AddColumn( name: "allow_receiving_messages", table: "client_pairs", type: "boolean", nullable: false, defaultValue: false); migrationBuilder.AddColumn( name: "disable_animations", table: "client_pairs", type: "boolean", nullable: false, defaultValue: false); migrationBuilder.AddColumn( name: "disable_sounds", table: "client_pairs", type: "boolean", nullable: false, defaultValue: false); migrationBuilder.AddColumn( name: "disable_vfx", table: "client_pairs", type: "boolean", nullable: false, defaultValue: false); migrationBuilder.AddColumn( 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"); } } }