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,
|