feat: rewrite requests to include events

This commit is contained in:
Paul Makles
2022-02-19 19:49:10 +00:00
parent 061af1f2c3
commit 489c2bdd87
25 changed files with 159 additions and 240 deletions

View File

@@ -40,7 +40,7 @@ pub async fn req(db: &Db, user: User, target: Ref, info: Json<Data>) -> Result<J
info.validate()
.map_err(|error| Error::FailedValidation { error })?;
let server = target.as_server(db).await?;
let mut server = target.as_server(db).await?;
if !perms(&user)
.server(&server)
.calc_server(db)
@@ -53,7 +53,7 @@ pub async fn req(db: &Db, user: User, target: Ref, info: Json<Data>) -> Result<J
}
let id = Ulid::new().to_string();
let mut channels = server.channels;
let mut channels = server.channels.clone();
channels.push(id.clone());
let Data {
@@ -93,16 +93,17 @@ pub async fn req(db: &Db, user: User, target: Ref, info: Json<Data>) -> Result<J
},
};
db.insert_channel(&channel).await?;
db.update_server(
&server.id,
&PartialServer {
channels: Some(channels),
..Default::default()
},
vec![],
)
.await?;
channel.create(db).await?;
server
.update(
db,
PartialServer {
channels: Some(channels),
..Default::default()
},
vec![],
)
.await?;
Ok(Json(channel))
}

View File

@@ -63,28 +63,15 @@ pub async fn req(
db.mark_attachment_as_deleted(&avatar.id).await?;
}
}
for field in fields {
member.remove(field);
}
}
// 2. Apply new avatar
if let Some(avatar) = avatar {
partial.avatar = Some(File::use_avatar(db, &avatar, &user.id).await?);
member.avatar = partial.avatar.clone();
}
// 3. Copy over other fields
if let Some(nickname) = &partial.nickname {
member.nickname.replace(nickname.clone());
}
if let Some(roles) = &partial.roles {
member.roles.replace(roles.clone());
}
db.update_member(&member.id, &partial, remove.unwrap_or_else(Vec::new))
member
.update(db, partial, remove.unwrap_or_default())
.await?;
Ok(Json(member))

View File

@@ -17,5 +17,5 @@ pub async fn req(db: &Db, user: User, target: Ref, member: Ref) -> Result<EmptyR
let member = member.as_member(db, &server.id).await?;
// ! FIXME: calculate permission against member
db.delete_member(&member.id).await.map(|_| EmptyResponse)
member.delete(db).await.map(|_| EmptyResponse)
}

View File

@@ -1,7 +1,10 @@
use rocket::serde::json::Json;
use serde::{Deserialize, Serialize};
use revolt_quark::{models::User, perms, Db, EmptyResponse, Error, Ref, Result};
use revolt_quark::{
models::{Server, User},
perms, Db, Error, Ref, Result,
};
#[derive(Serialize, Deserialize)]
pub struct Values {
@@ -21,8 +24,8 @@ pub async fn req(
target: Ref,
role_id: String,
data: Json<Data>,
) -> Result<EmptyResponse> {
let server = target.as_server(db).await?;
) -> Result<Json<Server>> {
let mut server = target.as_server(db).await?;
if !perms(&user)
.server(&server)
.calc_server(db)
@@ -34,18 +37,16 @@ pub async fn req(
// ! FIXME: calculate permission against role
if !server.roles.contains_key(&role_id) {
return Err(Error::NotFound);
}
server
.set_role_permission(
db,
&role_id,
&(
data.permissions.server as i32,
data.permissions.channel as i32,
),
)
.await?;
db.update_role_permission(
&server.id,
&role_id,
&(
data.permissions.server as i32,
data.permissions.channel as i32,
),
)
.await
.map(|_| EmptyResponse)
Ok(Json(server))
}

View File

@@ -2,8 +2,8 @@ use rocket::serde::json::Json;
use serde::{Deserialize, Serialize};
use revolt_quark::{
models::{server::PartialServer, User},
perms, Db, EmptyResponse, Error, Ref, Result,
models::{server::PartialServer, Server, User},
perms, Db, Error, Ref, Result,
};
#[derive(Serialize, Deserialize)]
@@ -18,10 +18,10 @@ pub struct Data {
}
#[put("/<target>/permissions/default", data = "<data>", rank = 1)]
pub async fn req(db: &Db, user: User, target: Ref, data: Json<Data>) -> Result<EmptyResponse> {
pub async fn req(db: &Db, user: User, target: Ref, data: Json<Data>) -> Result<Json<Server>> {
let data = data.into_inner();
let server = target.as_server(db).await?;
let mut server = target.as_server(db).await?;
if !perms(&user)
.server(&server)
.calc_server(db)
@@ -31,17 +31,19 @@ pub async fn req(db: &Db, user: User, target: Ref, data: Json<Data>) -> Result<E
return Err(Error::NotFound);
}
db.update_server(
&server.id,
&PartialServer {
default_permissions: Some((
data.permissions.server as i32,
data.permissions.channel as i32,
)),
..Default::default()
},
vec![],
)
.await
.map(|_| EmptyResponse)
server
.update(
db,
PartialServer {
default_permissions: Some((
data.permissions.server as i32,
data.permissions.channel as i32,
)),
..Default::default()
},
vec![],
)
.await?;
Ok(Json(server))
}

View File

@@ -5,7 +5,6 @@ use revolt_quark::{
use rocket::serde::json::{Json, Value};
use serde::{Deserialize, Serialize};
use ulid::Ulid;
use validator::Validate;
#[derive(Validate, Serialize, Deserialize)]
@@ -30,20 +29,16 @@ pub async fn req(db: &Db, user: User, target: Ref, data: Json<Data>) -> Result<V
return Err(Error::NotFound);
}
let role_id = Ulid::new().to_string();
db.insert_role(
&server.id,
&role_id,
&Role {
name: data.name,
permissions: (
*DEFAULT_SERVER_PERMISSION as i32,
*DEFAULT_PERMISSION_CHANNEL_SERVER as i32,
),
..Default::default()
},
)
.await?;
let role = Role {
name: data.name,
permissions: (
*DEFAULT_SERVER_PERMISSION as i32,
*DEFAULT_PERMISSION_CHANNEL_SERVER as i32,
),
..Default::default()
};
Ok(json!({ "id": role_id }))
Ok(json!({
"id": role.create(db, &server.id).await?
}))
}

View File

@@ -2,7 +2,7 @@ use revolt_quark::{models::User, perms, Db, EmptyResponse, Error, Ref, Result};
#[delete("/<target>/roles/<role_id>")]
pub async fn req(db: &Db, user: User, target: Ref, role_id: String) -> Result<EmptyResponse> {
let server = target.as_server(db).await?;
let mut server = target.as_server(db).await?;
if !perms(&user)
.server(&server)
.calc_server(db)
@@ -14,7 +14,11 @@ pub async fn req(db: &Db, user: User, target: Ref, role_id: String) -> Result<Em
// ! FIXME: check perms against role
db.delete_role(&server.id, &role_id)
.await
.map(|_| EmptyResponse)
if let Some(role) = server.roles.remove(&role_id) {
role.delete(db, &server.id, &role_id)
.await
.map(|_| EmptyResponse)
} else {
Err(Error::NotFound)
}
}

View File

@@ -61,21 +61,15 @@ pub async fn req(
..Default::default()
};
if let Some(remove) = &remove {
for field in remove {
role.remove(field);
}
}
db.update_role(
role.update(
db,
&server.id,
&role_id,
&partial,
remove.unwrap_or_else(Vec::new),
partial,
remove.unwrap_or_default(),
)
.await?;
role.apply_options(partial.clone());
Ok(Json(role))
} else {
Err(Error::NotFound)

View File

@@ -82,7 +82,9 @@ pub async fn req(db: &Db, user: User, info: Json<Data>) -> Result<Json<Server>>
};
db.insert_channel(&channel).await?;
db.insert_server(&server).await?;
db.insert_member(&member).await?;
server.create(db).await?;
member.create(db).await?;
Ok(Json(server))
}

View File

@@ -6,10 +6,9 @@ pub async fn req(db: &Db, user: User, target: Ref) -> Result<EmptyResponse> {
let member = db.fetch_member(&target.id, &user.id).await?;
if server.owner == user.id {
db.delete_server(&server.id).await?;
server.delete(db).await
} else {
db.delete_member(&member.id).await?;
member.delete(db).await
}
Ok(EmptyResponse)
.map(|_| EmptyResponse)
}

View File

@@ -109,10 +109,6 @@ pub async fn req(db: &Db, user: User, target: Ref, data: Json<Data>) -> Result<J
db.mark_attachment_as_deleted(&icon.id).await?;
}
}
for field in fields {
server.remove(field);
}
}
// 2. Apply new icon
@@ -127,19 +123,7 @@ pub async fn req(db: &Db, user: User, target: Ref, data: Json<Data>) -> Result<J
server.banner = partial.banner.clone();
}
// 4. Pass-through and validate changes
if let Some(name) = &partial.name {
server.name = name.clone();
}
if let Some(description) = &partial.description {
server.description.replace(description.clone());
}
if let Some(categories) = &partial.categories {
server.categories.replace(categories.clone());
}
// 4. Validate changes
if let Some(system_messages) = &partial.system_messages {
let channels = system_messages.clone().into_channel_ids();
if !db
@@ -148,19 +132,11 @@ pub async fn req(db: &Db, user: User, target: Ref, data: Json<Data>) -> Result<J
{
return Err(Error::NotFound);
}
server.system_messages.replace(system_messages.clone());
}
if let Some(analytics) = &partial.analytics {
server.analytics = *analytics;
}
if let Some(nsfw) = &partial.nsfw {
server.nsfw = *nsfw;
}
db.update_server(&server.id, &partial, remove.unwrap_or_else(Vec::new))
server
.update(db, partial, remove.unwrap_or_default())
.await?;
Ok(Json(server))
}