feat: move ownership to member column instead of table column
This commit is contained in:
parent
419f37b108
commit
0588541876
5 changed files with 34 additions and 7 deletions
|
@ -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;
|
14
migrations/2025-06-06-145916_guild_ownership_changes/up.sql
Normal file
14
migrations/2025-06-06-145916_guild_ownership_changes/up.sql
Normal 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;
|
|
@ -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,
|
||||||
})
|
})
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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));
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue