forked from jmug/stoatchat
feat: add id field to role (#470)
This commit is contained in:
@@ -47,6 +47,7 @@
|
|||||||
],
|
],
|
||||||
"roles": {
|
"roles": {
|
||||||
"__ID:5__": {
|
"__ID:5__": {
|
||||||
|
"_id": "__ID:5__",
|
||||||
"name": "Moderator",
|
"name": "Moderator",
|
||||||
"permissions": {
|
"permissions": {
|
||||||
"a": 545270208,
|
"a": 545270208,
|
||||||
@@ -55,6 +56,7 @@
|
|||||||
"rank": 1
|
"rank": 1
|
||||||
},
|
},
|
||||||
"__ID:6__": {
|
"__ID:6__": {
|
||||||
|
"_id": "__ID:6__",
|
||||||
"name": "Owner",
|
"name": "Owner",
|
||||||
"permissions": {
|
"permissions": {
|
||||||
"a": 0,
|
"a": 0,
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ struct MigrationInfo {
|
|||||||
revision: i32,
|
revision: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub const LATEST_REVISION: i32 = 49; // MUST BE +1 to last migration
|
pub const LATEST_REVISION: i32 = 50; // MUST BE +1 to last migration
|
||||||
|
|
||||||
pub async fn migrate_database(db: &MongoDb) {
|
pub async fn migrate_database(db: &MongoDb) {
|
||||||
let migrations = db.col::<Document>("migrations");
|
let migrations = db.col::<Document>("migrations");
|
||||||
@@ -1264,6 +1264,48 @@ pub async fn run_migrations(db: &MongoDb, revision: i32) -> i32 {
|
|||||||
.expect("Failed to update default_permissions");
|
.expect("Failed to update default_permissions");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if revision <= 49 {
|
||||||
|
info!("Running migration [revision 49 / 12-12-2025]: Add _id key to roles");
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Clone)]
|
||||||
|
struct Server {
|
||||||
|
#[serde(rename = "_id")]
|
||||||
|
pub id: String,
|
||||||
|
#[serde(default = "HashMap::<String, Document>::new")]
|
||||||
|
pub roles: HashMap<String, Document>,
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut servers = db
|
||||||
|
.db()
|
||||||
|
.collection::<Server>("servers")
|
||||||
|
.find(doc! {
|
||||||
|
"roles": {
|
||||||
|
"$exists": true,
|
||||||
|
"$ne": {}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.await
|
||||||
|
.unwrap()
|
||||||
|
.map(|res| res.expect("Failed to decode Server { id, roles }"));
|
||||||
|
|
||||||
|
while let Some(server) = servers.next().await {
|
||||||
|
let mut doc = doc! {};
|
||||||
|
|
||||||
|
for id in server.roles.keys() {
|
||||||
|
doc.insert(
|
||||||
|
format!("roles.{id}._id"),
|
||||||
|
id,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
db.db()
|
||||||
|
.collection::<Server>("servers")
|
||||||
|
.update_one(doc! { "_id": &server.id }, doc! { "$set": doc })
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Reminder to update LATEST_REVISION when adding new migrations.
|
// Reminder to update LATEST_REVISION when adding new migrations.
|
||||||
LATEST_REVISION.max(revision)
|
LATEST_REVISION.max(revision)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,6 +68,9 @@ auto_derived_partial!(
|
|||||||
auto_derived_partial!(
|
auto_derived_partial!(
|
||||||
/// Role
|
/// Role
|
||||||
pub struct Role {
|
pub struct Role {
|
||||||
|
/// Unique Id
|
||||||
|
#[serde(rename = "_id")]
|
||||||
|
pub id: String,
|
||||||
/// Role name
|
/// Role name
|
||||||
pub name: String,
|
pub name: String,
|
||||||
/// Permissions available to this role
|
/// Permissions available to this role
|
||||||
@@ -246,7 +249,6 @@ impl Server {
|
|||||||
role.update(
|
role.update(
|
||||||
db,
|
db,
|
||||||
&self.id,
|
&self.id,
|
||||||
role_id,
|
|
||||||
PartialRole {
|
PartialRole {
|
||||||
permissions: Some(permissions),
|
permissions: Some(permissions),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
@@ -297,6 +299,7 @@ impl Role {
|
|||||||
/// Into optional struct
|
/// Into optional struct
|
||||||
pub fn into_optional(self) -> PartialRole {
|
pub fn into_optional(self) -> PartialRole {
|
||||||
PartialRole {
|
PartialRole {
|
||||||
|
id: Some(self.id),
|
||||||
name: Some(self.name),
|
name: Some(self.name),
|
||||||
permissions: Some(self.permissions),
|
permissions: Some(self.permissions),
|
||||||
colour: self.colour,
|
colour: self.colour,
|
||||||
@@ -306,20 +309,29 @@ impl Role {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Create a role
|
/// Create a role
|
||||||
pub async fn create(&self, db: &Database, server_id: &str) -> Result<String> {
|
pub async fn create(db: &Database, server: &Server, name: String) -> Result<Self> {
|
||||||
let role_id = Ulid::new().to_string();
|
let role = Role {
|
||||||
db.insert_role(server_id, &role_id, self).await?;
|
id: Ulid::new().to_string(),
|
||||||
|
name,
|
||||||
|
// Rank of the new role should be below the lowest role
|
||||||
|
rank: server.roles.len() as i64,
|
||||||
|
colour: None,
|
||||||
|
hoist: false,
|
||||||
|
permissions: Default::default(),
|
||||||
|
};
|
||||||
|
|
||||||
|
db.insert_role(&server.id, &role).await?;
|
||||||
|
|
||||||
EventV1::ServerRoleUpdate {
|
EventV1::ServerRoleUpdate {
|
||||||
id: server_id.to_string(),
|
id: server.id.clone(),
|
||||||
role_id: role_id.to_string(),
|
role_id: role.id.clone(),
|
||||||
data: self.clone().into_optional().into(),
|
data: role.clone().into_optional().into(),
|
||||||
clear: vec![],
|
clear: vec![],
|
||||||
}
|
}
|
||||||
.p(server_id.to_string())
|
.p(server.id.clone())
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
Ok(role_id)
|
Ok(role)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Update server data
|
/// Update server data
|
||||||
@@ -327,7 +339,6 @@ impl Role {
|
|||||||
&mut self,
|
&mut self,
|
||||||
db: &Database,
|
db: &Database,
|
||||||
server_id: &str,
|
server_id: &str,
|
||||||
role_id: &str,
|
|
||||||
partial: PartialRole,
|
partial: PartialRole,
|
||||||
remove: Vec<FieldsRole>,
|
remove: Vec<FieldsRole>,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
@@ -337,14 +348,14 @@ impl Role {
|
|||||||
|
|
||||||
self.apply_options(partial.clone());
|
self.apply_options(partial.clone());
|
||||||
|
|
||||||
db.update_role(server_id, role_id, &partial, remove.clone())
|
db.update_role(server_id, &self.id, &partial, remove.clone())
|
||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
EventV1::ServerRoleUpdate {
|
EventV1::ServerRoleUpdate {
|
||||||
id: server_id.to_string(),
|
id: server_id.to_string(),
|
||||||
role_id: role_id.to_string(),
|
role_id: self.id.clone(),
|
||||||
data: partial.into(),
|
data: partial.into(),
|
||||||
clear: vec![],
|
clear: remove.into_iter().map(Into::into).collect(),
|
||||||
}
|
}
|
||||||
.p(server_id.to_string())
|
.p(server_id.to_string())
|
||||||
.await;
|
.await;
|
||||||
@@ -360,15 +371,15 @@ impl Role {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Delete a role
|
/// Delete a role
|
||||||
pub async fn delete(self, db: &Database, server_id: &str, role_id: &str) -> Result<()> {
|
pub async fn delete(self, db: &Database, server_id: &str) -> Result<()> {
|
||||||
EventV1::ServerRoleDelete {
|
EventV1::ServerRoleDelete {
|
||||||
id: server_id.to_string(),
|
id: server_id.to_string(),
|
||||||
role_id: role_id.to_string(),
|
role_id: self.id.clone(),
|
||||||
}
|
}
|
||||||
.p(server_id.to_string())
|
.p(server_id.to_string())
|
||||||
.await;
|
.await;
|
||||||
|
|
||||||
db.delete_role(server_id, role_id).await
|
db.delete_role(server_id, &self.id).await
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ pub trait AbstractServers: Sync + Send {
|
|||||||
async fn delete_server(&self, id: &str) -> Result<()>;
|
async fn delete_server(&self, id: &str) -> Result<()>;
|
||||||
|
|
||||||
/// Insert a new role into server object
|
/// Insert a new role into server object
|
||||||
async fn insert_role(&self, server_id: &str, role_id: &str, role: &Role) -> Result<()>;
|
async fn insert_role(&self, server_id: &str, role: &Role) -> Result<()>;
|
||||||
|
|
||||||
/// Update an existing role on a server
|
/// Update an existing role on a server
|
||||||
async fn update_role(
|
async fn update_role(
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ impl AbstractServers for MongoDb {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Insert a new role into server object
|
/// Insert a new role into server object
|
||||||
async fn insert_role(&self, server_id: &str, role_id: &str, role: &Role) -> Result<()> {
|
async fn insert_role(&self, server_id: &str, role: &Role) -> Result<()> {
|
||||||
self.col::<Document>(COL)
|
self.col::<Document>(COL)
|
||||||
.update_one(
|
.update_one(
|
||||||
doc! {
|
doc! {
|
||||||
@@ -77,7 +77,7 @@ impl AbstractServers for MongoDb {
|
|||||||
},
|
},
|
||||||
doc! {
|
doc! {
|
||||||
"$set": {
|
"$set": {
|
||||||
"roles.".to_owned() + role_id: to_document(role)
|
"roles.".to_owned() + &role.id: to_document(role)
|
||||||
.map_err(|_| create_database_error!("to_document", "role"))?
|
.map_err(|_| create_database_error!("to_document", "role"))?
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -72,10 +72,10 @@ impl AbstractServers for ReferenceDb {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Insert a new role into server object
|
/// Insert a new role into server object
|
||||||
async fn insert_role(&self, server_id: &str, role_id: &str, role: &Role) -> Result<()> {
|
async fn insert_role(&self, server_id: &str, role: &Role) -> Result<()> {
|
||||||
let mut servers = self.servers.lock().await;
|
let mut servers = self.servers.lock().await;
|
||||||
if let Some(server) = servers.get_mut(server_id) {
|
if let Some(server) = servers.get_mut(server_id) {
|
||||||
server.roles.insert(role_id.to_string(), role.clone());
|
server.roles.insert(role.id.clone(), role.clone());
|
||||||
Ok(())
|
Ok(())
|
||||||
} else {
|
} else {
|
||||||
Err(create_error!(NotFound))
|
Err(create_error!(NotFound))
|
||||||
|
|||||||
@@ -896,6 +896,7 @@ impl From<SystemMessageChannels> for crate::SystemMessageChannels {
|
|||||||
impl From<crate::Role> for Role {
|
impl From<crate::Role> for Role {
|
||||||
fn from(value: crate::Role) -> Self {
|
fn from(value: crate::Role) -> Self {
|
||||||
Role {
|
Role {
|
||||||
|
id: value.id,
|
||||||
name: value.name,
|
name: value.name,
|
||||||
permissions: value.permissions,
|
permissions: value.permissions,
|
||||||
colour: value.colour,
|
colour: value.colour,
|
||||||
@@ -908,6 +909,7 @@ impl From<crate::Role> for Role {
|
|||||||
impl From<Role> for crate::Role {
|
impl From<Role> for crate::Role {
|
||||||
fn from(value: Role) -> crate::Role {
|
fn from(value: Role) -> crate::Role {
|
||||||
crate::Role {
|
crate::Role {
|
||||||
|
id: value.id,
|
||||||
name: value.name,
|
name: value.name,
|
||||||
permissions: value.permissions,
|
permissions: value.permissions,
|
||||||
colour: value.colour,
|
colour: value.colour,
|
||||||
@@ -920,6 +922,7 @@ impl From<Role> for crate::Role {
|
|||||||
impl From<crate::PartialRole> for PartialRole {
|
impl From<crate::PartialRole> for PartialRole {
|
||||||
fn from(value: crate::PartialRole) -> Self {
|
fn from(value: crate::PartialRole) -> Self {
|
||||||
PartialRole {
|
PartialRole {
|
||||||
|
id: value.id,
|
||||||
name: value.name,
|
name: value.name,
|
||||||
permissions: value.permissions,
|
permissions: value.permissions,
|
||||||
colour: value.colour,
|
colour: value.colour,
|
||||||
@@ -932,6 +935,7 @@ impl From<crate::PartialRole> for PartialRole {
|
|||||||
impl From<PartialRole> for crate::PartialRole {
|
impl From<PartialRole> for crate::PartialRole {
|
||||||
fn from(value: PartialRole) -> crate::PartialRole {
|
fn from(value: PartialRole) -> crate::PartialRole {
|
||||||
crate::PartialRole {
|
crate::PartialRole {
|
||||||
|
id: value.id,
|
||||||
name: value.name,
|
name: value.name,
|
||||||
permissions: value.permissions,
|
permissions: value.permissions,
|
||||||
colour: value.colour,
|
colour: value.colour,
|
||||||
|
|||||||
@@ -85,6 +85,9 @@ auto_derived_partial!(
|
|||||||
auto_derived_partial!(
|
auto_derived_partial!(
|
||||||
/// Role
|
/// Role
|
||||||
pub struct Role {
|
pub struct Role {
|
||||||
|
/// Unique Id
|
||||||
|
#[cfg_attr(feature = "serde", serde(rename = "_id"))]
|
||||||
|
pub id: String,
|
||||||
/// Role name
|
/// Role name
|
||||||
pub name: String,
|
pub name: String,
|
||||||
/// Permissions available to this role
|
/// Permissions available to this role
|
||||||
@@ -181,6 +184,7 @@ auto_derived!(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Response after creating new role
|
/// Response after creating new role
|
||||||
|
// TODO: remove this in favor of just Role
|
||||||
pub struct NewRoleResponse {
|
pub struct NewRoleResponse {
|
||||||
/// Id of the role
|
/// Id of the role
|
||||||
pub id: String,
|
pub id: String,
|
||||||
|
|||||||
@@ -47,6 +47,7 @@
|
|||||||
],
|
],
|
||||||
"roles": {
|
"roles": {
|
||||||
"__ID:5__": {
|
"__ID:5__": {
|
||||||
|
"_id": "__ID:5__",
|
||||||
"name": "Moderator",
|
"name": "Moderator",
|
||||||
"permissions": {
|
"permissions": {
|
||||||
"a": 545270216,
|
"a": 545270216,
|
||||||
@@ -55,6 +56,7 @@
|
|||||||
"rank": 1
|
"rank": 1
|
||||||
},
|
},
|
||||||
"__ID:6__": {
|
"__ID:6__": {
|
||||||
|
"_id": "__ID:6__",
|
||||||
"name": "Owner",
|
"name": "Owner",
|
||||||
"permissions": {
|
"permissions": {
|
||||||
"a": 0,
|
"a": 0,
|
||||||
@@ -63,6 +65,7 @@
|
|||||||
"rank": 0
|
"rank": 0
|
||||||
},
|
},
|
||||||
"__ID:7__": {
|
"__ID:7__": {
|
||||||
|
"_id": "__ID:7__",
|
||||||
"name": "Lower Rank 1",
|
"name": "Lower Rank 1",
|
||||||
"permissions": {
|
"permissions": {
|
||||||
"a": 0,
|
"a": 0,
|
||||||
@@ -71,6 +74,7 @@
|
|||||||
"rank": 2
|
"rank": 2
|
||||||
},
|
},
|
||||||
"__ID:8__": {
|
"__ID:8__": {
|
||||||
|
"_id": "__ID:8__",
|
||||||
"name": "Lower Rank 2",
|
"name": "Lower Rank 2",
|
||||||
"permissions": {
|
"permissions": {
|
||||||
"a": 0,
|
"a": 0,
|
||||||
|
|||||||
@@ -151,29 +151,20 @@ mod test {
|
|||||||
name: "Hidden Channel".to_string(),
|
name: "Hidden Channel".to_string(),
|
||||||
description: None,
|
description: None,
|
||||||
nsfw: Some(false),
|
nsfw: Some(false),
|
||||||
voice: None
|
voice: None,
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.expect("Failed to make new channel");
|
.expect("Failed to make new channel");
|
||||||
|
|
||||||
let role = Role {
|
let role = Role::create(&harness.db, &server, "Show Hidden Channel".to_string())
|
||||||
name: "Show Hidden Channel".to_string(),
|
|
||||||
permissions: OverrideField { a: 0, d: 0 },
|
|
||||||
colour: None,
|
|
||||||
hoist: false,
|
|
||||||
rank: 5,
|
|
||||||
};
|
|
||||||
|
|
||||||
let role_id = role
|
|
||||||
.create(&harness.db, &server.id)
|
|
||||||
.await
|
.await
|
||||||
.expect("Failed to create the role");
|
.expect("Failed to create the role");
|
||||||
|
|
||||||
let mut overrides = HashMap::new();
|
let mut overrides = HashMap::new();
|
||||||
overrides.insert(
|
overrides.insert(
|
||||||
role_id.clone(),
|
role.id.clone(),
|
||||||
OverrideField {
|
OverrideField {
|
||||||
a: (ChannelPermission::ViewChannel) as i64,
|
a: (ChannelPermission::ViewChannel) as i64,
|
||||||
d: 0,
|
d: 0,
|
||||||
@@ -281,7 +272,7 @@ mod test {
|
|||||||
"Mention failed to be scrubbed when the user cannot see the channel"
|
"Mention failed to be scrubbed when the user cannot see the channel"
|
||||||
);
|
);
|
||||||
|
|
||||||
let second_member_roles = vec![role_id.clone()];
|
let second_member_roles = vec![role.id.clone()];
|
||||||
let partial = PartialMember {
|
let partial = PartialMember {
|
||||||
id: None,
|
id: None,
|
||||||
joined_at: None,
|
joined_at: None,
|
||||||
@@ -290,7 +281,7 @@ mod test {
|
|||||||
timeout: None,
|
timeout: None,
|
||||||
roles: Some(second_member_roles),
|
roles: Some(second_member_roles),
|
||||||
can_publish: None,
|
can_publish: None,
|
||||||
can_receive: None
|
can_receive: None,
|
||||||
};
|
};
|
||||||
second_member
|
second_member
|
||||||
.update(&harness.db, partial, vec![])
|
.update(&harness.db, partial, vec![])
|
||||||
@@ -496,7 +487,7 @@ mod test {
|
|||||||
let (_, _, other_user) = harness.new_user().await;
|
let (_, _, other_user) = harness.new_user().await;
|
||||||
let (server, _) = harness.new_server(&user).await;
|
let (server, _) = harness.new_server(&user).await;
|
||||||
let channel = harness.new_channel(&server).await;
|
let channel = harness.new_channel(&server).await;
|
||||||
let (role_id, _role) = harness
|
let role = harness
|
||||||
.new_role(
|
.new_role(
|
||||||
&server,
|
&server,
|
||||||
1,
|
1,
|
||||||
@@ -518,7 +509,7 @@ mod test {
|
|||||||
Some(&harness.amqp),
|
Some(&harness.amqp),
|
||||||
channel.clone(),
|
channel.clone(),
|
||||||
v0::DataMessageSend {
|
v0::DataMessageSend {
|
||||||
content: Some(format!("Mentioning @everyone and role <%{}>", &role_id)),
|
content: Some(format!("Mentioning @everyone and role <%{}>", &role.id)),
|
||||||
nonce: None,
|
nonce: None,
|
||||||
attachments: None,
|
attachments: None,
|
||||||
replies: None,
|
replies: None,
|
||||||
@@ -563,7 +554,7 @@ mod test {
|
|||||||
Some(&harness.amqp),
|
Some(&harness.amqp),
|
||||||
channel.clone(),
|
channel.clone(),
|
||||||
v0::DataMessageSend {
|
v0::DataMessageSend {
|
||||||
content: Some(format!("Mentioning `@everyone` and role `<%{}>`", &role_id)),
|
content: Some(format!("Mentioning `@everyone` and role `<%{}>`", &role.id)),
|
||||||
nonce: None,
|
nonce: None,
|
||||||
attachments: None,
|
attachments: None,
|
||||||
replies: None,
|
replies: None,
|
||||||
@@ -605,7 +596,7 @@ mod test {
|
|||||||
"Role mentions detected when inside codeblock"
|
"Role mentions detected when inside codeblock"
|
||||||
);
|
);
|
||||||
|
|
||||||
other_member.roles.push(role_id.clone());
|
other_member.roles.push(role.id.clone());
|
||||||
harness
|
harness
|
||||||
.db
|
.db
|
||||||
.update_member(
|
.update_member(
|
||||||
@@ -615,10 +606,10 @@ mod test {
|
|||||||
id: None,
|
id: None,
|
||||||
joined_at: None,
|
joined_at: None,
|
||||||
nickname: None,
|
nickname: None,
|
||||||
roles: Some(vec![role_id.clone()]),
|
roles: Some(vec![role.id.clone()]),
|
||||||
timeout: None,
|
timeout: None,
|
||||||
can_publish: None,
|
can_publish: None,
|
||||||
can_receive: None
|
can_receive: None,
|
||||||
},
|
},
|
||||||
vec![],
|
vec![],
|
||||||
)
|
)
|
||||||
@@ -632,7 +623,7 @@ mod test {
|
|||||||
Some(&harness.amqp),
|
Some(&harness.amqp),
|
||||||
channel.clone(),
|
channel.clone(),
|
||||||
v0::DataMessageSend {
|
v0::DataMessageSend {
|
||||||
content: Some(format!("Mentioning @everyone and role <%{}>", &role_id)),
|
content: Some(format!("Mentioning @everyone and role <%{}>", &role.id)),
|
||||||
nonce: None,
|
nonce: None,
|
||||||
attachments: None,
|
attachments: None,
|
||||||
replies: None,
|
replies: None,
|
||||||
|
|||||||
@@ -40,17 +40,10 @@ pub async fn create(
|
|||||||
}));
|
}));
|
||||||
};
|
};
|
||||||
|
|
||||||
let role = Role {
|
let role = Role::create(db, &server, data.name).await?;
|
||||||
name: data.name,
|
|
||||||
// Rank of the new role should be below the lowest role
|
|
||||||
rank: server.roles.len() as i64,
|
|
||||||
colour: None,
|
|
||||||
hoist: false,
|
|
||||||
permissions: Default::default(),
|
|
||||||
};
|
|
||||||
|
|
||||||
Ok(Json(v0::NewRoleResponse {
|
Ok(Json(v0::NewRoleResponse {
|
||||||
id: role.create(db, &server.id).await?,
|
id: role.id.clone(),
|
||||||
role: role.into(),
|
role: role.into(),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ pub async fn delete(
|
|||||||
return Err(create_error!(NotElevated));
|
return Err(create_error!(NotElevated));
|
||||||
}
|
}
|
||||||
|
|
||||||
role.delete(db, &server.id, &role_id).await?;
|
role.delete(db, &server.id).await?;
|
||||||
|
|
||||||
for channel_id in &server.channels {
|
for channel_id in &server.channels {
|
||||||
let channel = Reference::from_unchecked(channel_id).as_channel(db).await?;
|
let channel = Reference::from_unchecked(channel_id).as_channel(db).await?;
|
||||||
|
|||||||
@@ -61,7 +61,6 @@ pub async fn edit(
|
|||||||
role.update(
|
role.update(
|
||||||
db,
|
db,
|
||||||
&server.id,
|
&server.id,
|
||||||
&role_id,
|
|
||||||
partial,
|
partial,
|
||||||
remove.into_iter().map(Into::into).collect(),
|
remove.into_iter().map(Into::into).collect(),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ use futures::StreamExt;
|
|||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use redis_kiss::redis::aio::PubSub;
|
use redis_kiss::redis::aio::PubSub;
|
||||||
use revolt_database::{
|
use revolt_database::{
|
||||||
events::client::EventV1, Channel, Database, Member, Message, Server, User, AMQP,
|
events::client::EventV1, Channel, Database, Member, Message, PartialRole, Server, User, AMQP,
|
||||||
};
|
};
|
||||||
use revolt_database::{util::idempotency::IdempotencyKey, Role};
|
use revolt_database::{util::idempotency::IdempotencyKey, Role};
|
||||||
use revolt_models::v0;
|
use revolt_models::v0;
|
||||||
@@ -139,21 +139,26 @@ impl TestHarness {
|
|||||||
server: &Server,
|
server: &Server,
|
||||||
rank: i64,
|
rank: i64,
|
||||||
overrides: Option<OverrideField>,
|
overrides: Option<OverrideField>,
|
||||||
) -> (String, Role) {
|
) -> Role {
|
||||||
let role = Role {
|
let mut role = Role::create(&self.db, &server, TestHarness::rand_string())
|
||||||
name: TestHarness::rand_string(),
|
|
||||||
permissions: overrides.unwrap_or(OverrideField { a: 0, d: 0 }),
|
|
||||||
rank,
|
|
||||||
colour: None,
|
|
||||||
hoist: false,
|
|
||||||
};
|
|
||||||
|
|
||||||
let id = role
|
|
||||||
.create(&self.db, &server.id)
|
|
||||||
.await
|
.await
|
||||||
.expect("Failed to create test role");
|
.expect("Failed to create test role");
|
||||||
|
|
||||||
(id, role)
|
if let Some(overrides) = overrides {
|
||||||
|
role.update(
|
||||||
|
&self.db,
|
||||||
|
&server.id,
|
||||||
|
PartialRole {
|
||||||
|
permissions: Some(overrides),
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
|
Vec::new(),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
.expect("Failed to set test role overrides");
|
||||||
|
};
|
||||||
|
|
||||||
|
role
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn new_channel(&self, server: &Server) -> Channel {
|
pub async fn new_channel(&self, server: &Server) -> Channel {
|
||||||
@@ -165,7 +170,7 @@ impl TestHarness {
|
|||||||
name: "Test Channel".to_string(),
|
name: "Test Channel".to_string(),
|
||||||
description: None,
|
description: None,
|
||||||
nsfw: Some(false),
|
nsfw: Some(false),
|
||||||
voice: None
|
voice: None,
|
||||||
},
|
},
|
||||||
true,
|
true,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user