feat: move ownership to member column instead of table column

This commit is contained in:
Radical 2025-06-06 17:20:02 +02:00
parent 419f37b108
commit 0588541876
5 changed files with 34 additions and 7 deletions

View file

@ -0,0 +1,14 @@
-- This file should undo anything in `up.sql`
ALTER TABLE guilds
ADD COLUMN owner_uuid UUID REFERENCES users(uuid);
UPDATE guilds g
SET owner_uuid = gm.user_uuid
FROM guild_members gm
WHERE gm.guild_uuid = g.uuid AND gm.is_owner = TRUE;
ALTER TABLE guilds
ALTER COLUMN owner_uuid SET NOT NULL;
ALTER TABLE guild_members
DROP COLUMN is_owner;

View file

@ -0,0 +1,14 @@
-- Your SQL goes here
ALTER TABLE guild_members
ADD COLUMN is_owner BOOLEAN NOT NULL DEFAULT false;
UPDATE guild_members gm
SET is_owner = true
FROM guilds g
WHERE gm.guild_uuid = g.uuid AND gm.user_uuid = g.owner_uuid;
CREATE UNIQUE INDEX one_owner_per_guild ON guild_members (guild_uuid)
WHERE is_owner;
ALTER TABLE guilds
DROP COLUMN owner_uuid;

View file

@ -26,7 +26,6 @@ pub struct GuildBuilder {
name: String, name: String,
description: Option<String>, description: Option<String>,
icon: Option<String>, icon: Option<String>,
owner_uuid: Uuid,
} }
impl GuildBuilder { impl GuildBuilder {
@ -40,7 +39,6 @@ impl GuildBuilder {
name: self.name, name: self.name,
description: self.description, description: self.description,
icon: self.icon.and_then(|i| i.parse().ok()), icon: self.icon.and_then(|i| i.parse().ok()),
owner_uuid: self.owner_uuid,
roles, roles,
member_count, member_count,
}) })
@ -53,7 +51,6 @@ pub struct Guild {
name: String, name: String,
description: Option<String>, description: Option<String>,
icon: Option<Url>, icon: Option<Url>,
owner_uuid: Uuid,
pub roles: Vec<Role>, pub roles: Vec<Role>,
member_count: i64, member_count: i64,
} }
@ -110,7 +107,6 @@ impl Guild {
name: name.clone(), name: name.clone(),
description: None, description: None,
icon: None, icon: None,
owner_uuid,
}; };
insert_into(guilds::table) insert_into(guilds::table)
@ -125,6 +121,7 @@ impl Guild {
nickname: None, nickname: None,
user_uuid: owner_uuid, user_uuid: owner_uuid,
guild_uuid, guild_uuid,
is_owner: true,
}; };
insert_into(guild_members::table) insert_into(guild_members::table)
@ -137,7 +134,6 @@ impl Guild {
name, name,
description: None, description: None,
icon: None, icon: None,
owner_uuid,
roles: vec![], roles: vec![],
member_count: 1, member_count: 1,
}) })

View file

@ -17,6 +17,7 @@ pub struct MemberBuilder {
pub nickname: Option<String>, pub nickname: Option<String>,
pub user_uuid: Uuid, pub user_uuid: Uuid,
pub guild_uuid: Uuid, pub guild_uuid: Uuid,
pub is_owner: bool,
} }
impl MemberBuilder { impl MemberBuilder {
@ -28,6 +29,7 @@ impl MemberBuilder {
nickname: self.nickname.clone(), nickname: self.nickname.clone(),
user_uuid: self.user_uuid, user_uuid: self.user_uuid,
guild_uuid: self.guild_uuid, guild_uuid: self.guild_uuid,
is_owner: self.is_owner,
user, user,
}) })
} }
@ -39,6 +41,7 @@ pub struct Member {
pub nickname: Option<String>, pub nickname: Option<String>,
pub user_uuid: Uuid, pub user_uuid: Uuid,
pub guild_uuid: Uuid, pub guild_uuid: Uuid,
pub is_owner: bool,
user: User, user: User,
} }
@ -113,6 +116,7 @@ impl Member {
guild_uuid, guild_uuid,
user_uuid, user_uuid,
nickname: None, nickname: None,
is_owner: false,
}; };
insert_into(guild_members::table) insert_into(guild_members::table)

View file

@ -38,13 +38,13 @@ diesel::table! {
user_uuid -> Uuid, user_uuid -> Uuid,
#[max_length = 100] #[max_length = 100]
nickname -> Nullable<Varchar>, nickname -> Nullable<Varchar>,
is_owner -> Bool,
} }
} }
diesel::table! { diesel::table! {
guilds (uuid) { guilds (uuid) {
uuid -> Uuid, uuid -> Uuid,
owner_uuid -> Uuid,
#[max_length = 100] #[max_length = 100]
name -> Varchar, name -> Varchar,
#[max_length = 300] #[max_length = 300]
@ -139,7 +139,6 @@ diesel::joinable!(channel_permissions -> channels (channel_uuid));
diesel::joinable!(channels -> guilds (guild_uuid)); diesel::joinable!(channels -> guilds (guild_uuid));
diesel::joinable!(guild_members -> guilds (guild_uuid)); diesel::joinable!(guild_members -> guilds (guild_uuid));
diesel::joinable!(guild_members -> users (user_uuid)); diesel::joinable!(guild_members -> users (user_uuid));
diesel::joinable!(guilds -> users (owner_uuid));
diesel::joinable!(instance_permissions -> users (uuid)); diesel::joinable!(instance_permissions -> users (uuid));
diesel::joinable!(invites -> guilds (guild_uuid)); diesel::joinable!(invites -> guilds (guild_uuid));
diesel::joinable!(invites -> users (user_uuid)); diesel::joinable!(invites -> users (user_uuid));