Skip to content

Commit 52e31bc

Browse files
committed
feat: Transfer ownership
Signed-off-by: LazyCat2 <[email protected]>
1 parent bcf6561 commit 52e31bc

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

crates/core/models/src/v0/servers.rs

+4
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,10 @@ auto_derived!(
246246
/// Must be enabled in order to show up on [Revolt Discover](https://rvlt.gg).
247247
pub analytics: Option<bool>,
248248

249+
/// User id of the new owner
250+
// #[cfg_attr(feature = "validator", serde(skip_serializing_if = "Option::is_none"))]
251+
pub owner: Option<String>,
252+
249253
/// Fields to remove from server object
250254
#[cfg_attr(feature = "validator", validate(length(min = 1)))]
251255
pub remove: Option<Vec<FieldsServer>>,

crates/delta/src/routes/servers/server_edit.rs

+23
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ pub async fn edit(
4343
&& data.flags.is_none()
4444
&& data.analytics.is_none()
4545
&& data.discoverable.is_none()
46+
&& data.owner.is_none()
4647
&& data.remove.is_none()
4748
{
4849
return Ok(Json(server.into()));
@@ -57,6 +58,11 @@ pub async fn edit(
5758
permissions.throw_if_lacking_channel_permission(ChannelPermission::ManageServer)?;
5859
}
5960

61+
// Check we are the server owner if changing sensitive fields
62+
if data.owner.is_some() && user.id != server.owner {
63+
return Err(create_error!(NotOwner));
64+
}
65+
6066
// Check we are privileged if changing sensitive fields
6167
if (data.flags.is_some() /*|| data.nsfw.is_some()*/ || data.discoverable.is_some())
6268
&& !user.privileged
@@ -80,6 +86,7 @@ pub async fn edit(
8086
// nsfw,
8187
discoverable,
8288
analytics,
89+
owner,
8390
remove,
8491
} = data;
8592

@@ -92,6 +99,7 @@ pub async fn edit(
9299
// nsfw,
93100
discoverable,
94101
analytics,
102+
owner: owner.clone(),
95103
..Default::default()
96104
};
97105

@@ -148,6 +156,21 @@ pub async fn edit(
148156
server.banner = partial.banner.clone();
149157
}
150158

159+
// 5. Transfer ownership
160+
if let Some(owner) = owner {
161+
let owner_reference = Reference { id: owner.clone() };
162+
// Check if member exists
163+
owner_reference.as_member(db, &server.id).await?;
164+
let owner_user = owner_reference.as_user(db).await?;
165+
166+
if owner_user.bot.is_some() {
167+
return Err(create_error!(InvalidOperation));
168+
}
169+
170+
server.owner = owner;
171+
partial.owner = Some(server.owner.clone());
172+
}
173+
151174
server
152175
.update(
153176
db,

0 commit comments

Comments
 (0)