From 17e93b7daa16de7bc787544d59a3eb1bb4affce4 Mon Sep 17 00:00:00 2001 From: Madeline <46743919+MaddyUnderStars@users.noreply.github.com> Date: Fri, 30 Dec 2022 18:07:56 +1100 Subject: Fix new roles having duplicate positions --- src/api/routes/guilds/#guild_id/roles/#role_id/index.ts | 9 ++++----- src/api/routes/guilds/#guild_id/roles/index.ts | 10 +++++++++- 2 files changed, 13 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/api/routes/guilds/#guild_id/roles/#role_id/index.ts b/src/api/routes/guilds/#guild_id/roles/#role_id/index.ts index e274e3d0..cd5959ff 100644 --- a/src/api/routes/guilds/#guild_id/roles/#role_id/index.ts +++ b/src/api/routes/guilds/#guild_id/roles/#role_id/index.ts @@ -63,13 +63,12 @@ router.patch( ); else body.icon = undefined; - const role = Role.create({ + const role = await Role.findOneOrFail({ where: { id: role_id, guild: { id: guild_id } } }); + role.assign({ ...body, - id: role_id, - guild_id, permissions: String( - req.permission!.bitfield & BigInt(body.permissions || "0"), - ), + req.permission!.bitfield & BigInt(body.permissions || "0") + ) }); await Promise.all([ diff --git a/src/api/routes/guilds/#guild_id/roles/index.ts b/src/api/routes/guilds/#guild_id/roles/index.ts index 60399d1b..534a5967 100644 --- a/src/api/routes/guilds/#guild_id/roles/index.ts +++ b/src/api/routes/guilds/#guild_id/roles/index.ts @@ -10,8 +10,10 @@ import { DiscordApiErrors, RoleModifySchema, RolePositionUpdateSchema, + Snowflake, } from "@fosscord/util"; import { route } from "@fosscord/api"; +import { Not } from "typeorm"; const router: Router = Router(); @@ -40,7 +42,7 @@ router.post( const role = Role.create({ // values before ...body are default and can be overriden - position: 0, + position: 1, hoist: false, color: 0, mentionable: false, @@ -53,10 +55,16 @@ router.post( tags: undefined, icon: undefined, unicode_emoji: undefined, + id: Snowflake.generate(), }); await Promise.all([ role.save(), + // Move all existing roles up one position, to accommodate the new role + Role.createQueryBuilder('roles') + .where({ guild: { id: guild_id }, name: Not("@everyone"), id: Not(role.id) }) + .update({ position: () => 'position + 1' }) + .execute(), emitEvent({ event: "GUILD_ROLE_CREATE", guild_id, -- cgit 1.4.1