Skip to content
Snippets Groups Projects
Verified Commit da95f624 authored by insert's avatar insert
Browse files

Better error handling for all routes.

parent ca0b8411
Branches
Tags
No related merge requests found
...@@ -205,7 +205,7 @@ pub fn resend_email(info: Json<Resend>) -> Response { ...@@ -205,7 +205,7 @@ pub fn resend_email(info: Json<Resend>) -> Response {
).expect("Failed to update user!"); ).expect("Failed to update user!");
match email::send_verification_email(info.email.to_string(), code) { match email::send_verification_email(info.email.to_string(), code) {
true => Response::Ok(None), true => Response::Result(super::Status::Ok),
false => Response::InternalServerError( false => Response::InternalServerError(
json!({ "success": false, "error": "Failed to send email! Likely an issue with the backend API." }), json!({ "success": false, "error": "Failed to send email! Likely an issue with the backend API." }),
), ),
...@@ -279,16 +279,12 @@ pub fn token(info: Json<Token>) -> Response { ...@@ -279,16 +279,12 @@ pub fn token(info: Json<Token>) -> Response {
.find_one(doc! { "access_token": info.token.clone() }, None) .find_one(doc! { "access_token": info.token.clone() }, None)
.expect("Failed user lookup") .expect("Failed user lookup")
{ {
Response::Success( Response::Success(json!({
json!({ "id": u.get_str("_id").unwrap(),
"id": u.get_str("_id").unwrap(), }))
})
)
} else { } else {
Response::Unauthorized( Response::Unauthorized(json!({
json!({ "error": "Invalid token!",
"error": "Invalid token!", }))
})
)
} }
} }
use super::Response;
use crate::database::{self, channel::Channel, message::Message, user::User}; use crate::database::{self, channel::Channel, message::Message, user::User};
use crate::websocket; use crate::websocket;
...@@ -43,24 +44,23 @@ fn get_recipients(target: &Channel) -> Vec<String> { ...@@ -43,24 +44,23 @@ fn get_recipients(target: &Channel) -> Vec<String> {
/// fetch channel information /// fetch channel information
#[get("/<target>")] #[get("/<target>")]
pub fn channel(user: User, target: Channel) -> Option<JsonValue> { pub fn channel(user: User, target: Channel) -> Option<Response> {
if !has_permission(&user, &target) { if !has_permission(&user, &target) {
return None; return None;
} }
Some(json!({ Some(Response::Success(json!({
"id": target.id, "id": target.id,
"type": target.channel_type, "type": target.channel_type,
"recipients": get_recipients(&target), "recipients": get_recipients(&target),
} })))
))
} }
/// delete channel /// delete channel
/// or leave group DM /// or leave group DM
/// or close DM conversation /// or close DM conversation
#[delete("/<target>")] #[delete("/<target>")]
pub fn delete(user: User, target: Channel) -> Option<JsonValue> { pub fn delete(user: User, target: Channel) -> Option<Response> {
if !has_permission(&user, &target) { if !has_permission(&user, &target) {
return None; return None;
} }
...@@ -75,33 +75,25 @@ pub fn delete(user: User, target: Channel) -> Option<JsonValue> { ...@@ -75,33 +75,25 @@ pub fn delete(user: User, target: Channel) -> Option<JsonValue> {
) )
.expect("Failed to update channel."); .expect("Failed to update channel.");
json!({ Response::Result(super::Status::Ok)
"success": true
})
} }
1 => { 1 => {
// ? TODO: group dm // ? TODO: group dm
json!({ Response::Result(super::Status::Ok)
"success": true
})
} }
2 => { 2 => {
// ? TODO: guild // ? TODO: guild
json!({ Response::Result(super::Status::Ok)
"success": true
})
} }
_ => json!({ _ => Response::InternalServerError(json!({ "error": "Unknown error has occurred." })),
"success": false
}),
}) })
} }
/// fetch channel messages /// fetch channel messages
#[get("/<target>/messages")] #[get("/<target>/messages")]
pub fn messages(user: User, target: Channel) -> Option<JsonValue> { pub fn messages(user: User, target: Channel) -> Option<Response> {
if !has_permission(&user, &target) { if !has_permission(&user, &target) {
return None; return None;
} }
...@@ -121,7 +113,7 @@ pub fn messages(user: User, target: Channel) -> Option<JsonValue> { ...@@ -121,7 +113,7 @@ pub fn messages(user: User, target: Channel) -> Option<JsonValue> {
})); }));
} }
Some(json!(messages)) Some(Response::Success(json!(messages)))
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
...@@ -132,7 +124,7 @@ pub struct SendMessage { ...@@ -132,7 +124,7 @@ pub struct SendMessage {
/// send a message to a channel /// send a message to a channel
#[post("/<target>/messages", data = "<message>")] #[post("/<target>/messages", data = "<message>")]
pub fn send_message(user: User, target: Channel, message: Json<SendMessage>) -> Option<JsonValue> { pub fn send_message(user: User, target: Channel, message: Json<SendMessage>) -> Option<Response> {
if !has_permission(&user, &target) { if !has_permission(&user, &target) {
return None; return None;
} }
...@@ -142,10 +134,9 @@ pub fn send_message(user: User, target: Channel, message: Json<SendMessage>) -> ...@@ -142,10 +134,9 @@ pub fn send_message(user: User, target: Channel, message: Json<SendMessage>) ->
let col = database::get_collection("messages"); let col = database::get_collection("messages");
if let Some(_) = col.find_one(doc! { "nonce": nonce.clone() }, None).unwrap() { if let Some(_) = col.find_one(doc! { "nonce": nonce.clone() }, None).unwrap() {
return Some(json!({ return Some(Response::BadRequest(
"success": false, json!({ "error": "Message already sent!" }),
"error": "Message already sent!" ));
}));
} }
let id = Ulid::new().to_string(); let id = Ulid::new().to_string();
...@@ -188,22 +179,18 @@ pub fn send_message(user: User, target: Channel, message: Json<SendMessage>) -> ...@@ -188,22 +179,18 @@ pub fn send_message(user: User, target: Channel, message: Json<SendMessage>) ->
.to_string(), .to_string(),
); );
json!({ Response::Success(json!({ "id": id }))
"success": true,
"id": id
})
} else { } else {
json!({ Response::InternalServerError(json!({
"success": false,
"error": "Failed database query." "error": "Failed database query."
}) }))
}, },
) )
} }
/// get a message /// get a message
#[get("/<target>/messages/<message>")] #[get("/<target>/messages/<message>")]
pub fn get_message(user: User, target: Channel, message: Message) -> Option<JsonValue> { pub fn get_message(user: User, target: Channel, message: Message) -> Option<Response> {
if !has_permission(&user, &target) { if !has_permission(&user, &target) {
return None; return None;
} }
...@@ -224,13 +211,13 @@ pub fn get_message(user: User, target: Channel, message: Message) -> Option<Json ...@@ -224,13 +211,13 @@ pub fn get_message(user: User, target: Channel, message: Message) -> Option<Json
None None
}; };
Some(json!({ Some(Response::Success(json!({
"id": message.id, "id": message.id,
"author": message.author, "author": message.author,
"content": message.content, "content": message.content,
"edited": if let Some(t) = message.edited { Some(t.timestamp()) } else { None }, "edited": if let Some(t) = message.edited { Some(t.timestamp()) } else { None },
"previous_content": prev, "previous_content": prev,
})) })))
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
...@@ -245,16 +232,13 @@ pub fn edit_message( ...@@ -245,16 +232,13 @@ pub fn edit_message(
target: Channel, target: Channel,
message: Message, message: Message,
edit: Json<EditMessage>, edit: Json<EditMessage>,
) -> Option<JsonValue> { ) -> Option<Response> {
if !has_permission(&user, &target) { if !has_permission(&user, &target) {
return None; return None;
} }
Some(if message.author != user.id { Some(if message.author != user.id {
json!({ Response::Unauthorized(json!({ "error": "You did not send this message." }))
"success": false,
"error": "You did not send this message."
})
} else { } else {
let col = database::get_collection("messages"); let col = database::get_collection("messages");
...@@ -296,30 +280,24 @@ pub fn edit_message( ...@@ -296,30 +280,24 @@ pub fn edit_message(
.to_string(), .to_string(),
); );
json!({ Response::Result(super::Status::Ok)
"success": true }
}) Err(_) => {
Response::InternalServerError(json!({ "error": "Failed to update message." }))
} }
Err(_) => json!({
"success": false,
"error": "Failed to update message."
}),
} }
}) })
} }
/// delete a message /// delete a message
#[delete("/<target>/messages/<message>")] #[delete("/<target>/messages/<message>")]
pub fn delete_message(user: User, target: Channel, message: Message) -> Option<JsonValue> { pub fn delete_message(user: User, target: Channel, message: Message) -> Option<Response> {
if !has_permission(&user, &target) { if !has_permission(&user, &target) {
return None; return None;
} }
Some(if message.author != user.id { Some(if message.author != user.id {
json!({ Response::Unauthorized(json!({ "error": "You did not send this message." }))
"success": false,
"error": "You did not send this message."
})
} else { } else {
let col = database::get_collection("messages"); let col = database::get_collection("messages");
...@@ -337,14 +315,11 @@ pub fn delete_message(user: User, target: Channel, message: Message) -> Option<J ...@@ -337,14 +315,11 @@ pub fn delete_message(user: User, target: Channel, message: Message) -> Option<J
.to_string(), .to_string(),
); );
json!({ Response::Result(super::Status::Ok)
"success": true }
}) Err(_) => {
Response::InternalServerError(json!({ "error": "Failed to delete message." }))
} }
Err(_) => json!({
"success": false,
"error": "Failed to delete message."
}),
} }
}) })
} }
use super::Response;
use crate::database::{ use crate::database::{
self, self,
channel::Channel, channel::Channel,
...@@ -14,7 +15,7 @@ use super::channel::ChannelType; ...@@ -14,7 +15,7 @@ use super::channel::ChannelType;
/// fetch your guilds /// fetch your guilds
#[get("/@me")] #[get("/@me")]
pub fn my_guilds(user: User) -> JsonValue { pub fn my_guilds(user: User) -> Response {
let col = database::get_collection("guilds"); let col = database::get_collection("guilds");
let guilds = col let guilds = col
.find( .find(
...@@ -40,12 +41,12 @@ pub fn my_guilds(user: User) -> JsonValue { ...@@ -40,12 +41,12 @@ pub fn my_guilds(user: User) -> JsonValue {
})); }));
} }
json!(parsed) Response::Success(json!(parsed))
} }
/// fetch a guild /// fetch a guild
#[get("/<target>")] #[get("/<target>")]
pub fn guild(user: User, target: Guild) -> Option<JsonValue> { pub fn guild(user: User, target: Guild) -> Option<Response> {
if find_member_permissions(user.id.clone(), target.id.clone(), None) == 0 { if find_member_permissions(user.id.clone(), target.id.clone(), None) == 0 {
return None; return None;
} }
...@@ -78,18 +79,17 @@ pub fn guild(user: User, target: Guild) -> Option<JsonValue> { ...@@ -78,18 +79,17 @@ pub fn guild(user: User, target: Guild) -> Option<JsonValue> {
})); }));
} }
Some(json!({ Some(Response::Success(json!({
"id": target.id, "id": target.id,
"name": target.name, "name": target.name,
"description": target.description, "description": target.description,
"owner": target.owner, "owner": target.owner,
"channels": channels, "channels": channels,
})) })))
} }
Err(_) => Some(json!({ Err(_) => Some(Response::InternalServerError(
"success": false, json!({ "error": "Failed to fetch channels." }),
"error": "Failed to fetch channels." )),
})),
} }
} }
...@@ -102,12 +102,9 @@ pub struct CreateGuild { ...@@ -102,12 +102,9 @@ pub struct CreateGuild {
/// create a new guild /// create a new guild
#[post("/create", data = "<info>")] #[post("/create", data = "<info>")]
pub fn create_guild(user: User, info: Json<CreateGuild>) -> JsonValue { pub fn create_guild(user: User, info: Json<CreateGuild>) -> Response {
if !user.email_verification.verified { if !user.email_verification.verified {
return json!({ return Response::Unauthorized(json!({ "error": "Email not verified!" }));
"success": false,
"error": "Email not verified!",
});
} }
let name: String = info.name.chars().take(32).collect(); let name: String = info.name.chars().take(32).collect();
...@@ -123,10 +120,7 @@ pub fn create_guild(user: User, info: Json<CreateGuild>) -> JsonValue { ...@@ -123,10 +120,7 @@ pub fn create_guild(user: User, info: Json<CreateGuild>) -> JsonValue {
let channels = database::get_collection("channels"); let channels = database::get_collection("channels");
let col = database::get_collection("guilds"); let col = database::get_collection("guilds");
if let Some(_) = col.find_one(doc! { "nonce": nonce.clone() }, None).unwrap() { if let Some(_) = col.find_one(doc! { "nonce": nonce.clone() }, None).unwrap() {
return json!({ return Response::BadRequest(json!({ "error": "Guild already created!" }));
"success": false,
"error": "Guild already created!"
});
} }
let id = Ulid::new().to_string(); let id = Ulid::new().to_string();
...@@ -140,10 +134,9 @@ pub fn create_guild(user: User, info: Json<CreateGuild>) -> JsonValue { ...@@ -140,10 +134,9 @@ pub fn create_guild(user: User, info: Json<CreateGuild>) -> JsonValue {
}, },
None, None,
) { ) {
return json!({ return Response::InternalServerError(
"success": false, json!({ "error": "Failed to create guild channel." }),
"error": "Failed to create guild channel." );
});
} }
if col if col
...@@ -169,18 +162,12 @@ pub fn create_guild(user: User, info: Json<CreateGuild>) -> JsonValue { ...@@ -169,18 +162,12 @@ pub fn create_guild(user: User, info: Json<CreateGuild>) -> JsonValue {
) )
.is_ok() .is_ok()
{ {
json!({ Response::Success(json!({ "id": id }))
"success": true,
"id": id,
})
} else { } else {
channels channels
.delete_one(doc! { "_id": channel_id }, None) .delete_one(doc! { "_id": channel_id }, None)
.expect("Failed to delete the channel we just made."); .expect("Failed to delete the channel we just made.");
json!({ Response::InternalServerError(json!({ "error": "Failed to create guild." }))
"success": false,
"error": "Failed to create guild."
})
} }
} }
use rocket::http::Status; pub use rocket::http::Status;
pub use rocket::response::Redirect; pub use rocket::response::Redirect;
use rocket::Rocket; use rocket::Rocket;
use rocket_contrib::json::JsonValue; use rocket_contrib::json::JsonValue;
...@@ -12,7 +12,7 @@ pub mod user; ...@@ -12,7 +12,7 @@ pub mod user;
#[derive(Responder)] #[derive(Responder)]
pub enum Response { pub enum Response {
#[response()] #[response()]
Ok(Option<JsonValue>), Result(Status),
#[response()] #[response()]
Success(JsonValue), Success(JsonValue),
#[response()] #[response()]
...@@ -35,8 +35,6 @@ pub enum Response { ...@@ -35,8 +35,6 @@ pub enum Response {
TooManyRequests(JsonValue), TooManyRequests(JsonValue),
#[response(status = 500)] #[response(status = 500)]
InternalServerError(JsonValue), InternalServerError(JsonValue),
#[response()]
Error(Status),
} }
pub fn mount(rocket: Rocket) -> Rocket { pub fn mount(rocket: Rocket) -> Rocket {
......
use super::Response;
use bson::doc; use bson::doc;
use rocket_contrib::json::JsonValue;
/// root /// root
#[get("/")] #[get("/")]
pub fn root() -> JsonValue { pub fn root() -> Response {
json!({ Response::Success(json!({
"revolt": "0.0.1" "revolt": "0.0.1"
}) }))
} }
use super::Response;
use crate::database::{self, channel::Channel, user::User}; use crate::database::{self, channel::Channel, user::User};
use crate::routes::channel; use crate::routes::channel;
...@@ -20,12 +21,12 @@ pub fn me(user: User) -> JsonValue { ...@@ -20,12 +21,12 @@ pub fn me(user: User) -> JsonValue {
/// retrieve another user's information /// retrieve another user's information
#[get("/<target>")] #[get("/<target>")]
pub fn user(user: User, target: User) -> JsonValue { pub fn user(user: User, target: User) -> Response {
json!({ Response::Success(json!({
"id": target.id, "id": target.id,
"username": target.username, "username": target.username,
"relationship": get_relationship(&user, &target) as u8 "relationship": get_relationship(&user, &target) as u8
}) }))
} }
#[derive(Serialize, Deserialize)] #[derive(Serialize, Deserialize)]
...@@ -36,7 +37,7 @@ pub struct Query { ...@@ -36,7 +37,7 @@ pub struct Query {
/// lookup a user on Revolt /// lookup a user on Revolt
/// currently only supports exact username searches /// currently only supports exact username searches
#[post("/lookup", data = "<query>")] #[post("/lookup", data = "<query>")]
pub fn lookup(user: User, query: Json<Query>) -> JsonValue { pub fn lookup(user: User, query: Json<Query>) -> Response {
let col = database::get_collection("users"); let col = database::get_collection("users");
let users = col let users = col
...@@ -57,12 +58,12 @@ pub fn lookup(user: User, query: Json<Query>) -> JsonValue { ...@@ -57,12 +58,12 @@ pub fn lookup(user: User, query: Json<Query>) -> JsonValue {
})); }));
} }
json!(results) Response::Success(json!(results))
} }
/// retrieve all of your DMs /// retrieve all of your DMs
#[get("/@me/dms")] #[get("/@me/dms")]
pub fn dms(user: User) -> JsonValue { pub fn dms(user: User) -> Response {
let col = database::get_collection("channels"); let col = database::get_collection("channels");
let results = col let results = col
...@@ -95,23 +96,20 @@ pub fn dms(user: User) -> JsonValue { ...@@ -95,23 +96,20 @@ pub fn dms(user: User) -> JsonValue {
})); }));
} }
json!(channels) Response::Success(json!(channels))
} }
/// open a DM with a user /// open a DM with a user
#[get("/<target>/dm")] #[get("/<target>/dm")]
pub fn dm(user: User, target: User) -> JsonValue { pub fn dm(user: User, target: User) -> Response {
let col = database::get_collection("channels"); let col = database::get_collection("channels");
match col.find_one( match col.find_one(
doc! { "type": channel::ChannelType::DM as i32, "recipients": { "$all": [ user.id.clone(), target.id.clone() ] } }, doc! { "type": channel::ChannelType::DM as i32, "recipients": { "$all": [ user.id.clone(), target.id.clone() ] } },
None None
).expect("Failed channel lookup") { ).expect("Failed channel lookup") {
Some(channel) => Some(channel) =>
json!({ Response::Success( json!({ "id": channel.get_str("_id").unwrap() })),
"success": true,
"id": channel.get_str("_id").unwrap()
}),
None => { None => {
let id = Ulid::new(); let id = Ulid::new();
...@@ -125,10 +123,7 @@ pub fn dm(user: User, target: User) -> JsonValue { ...@@ -125,10 +123,7 @@ pub fn dm(user: User, target: User) -> JsonValue {
None None
).expect("Failed insert query."); ).expect("Failed insert query.");
json!({ Response::Success(json!({ "id": id.to_string() }))
"success": true,
"id": id.to_string()
})
} }
} }
} }
...@@ -168,7 +163,7 @@ fn get_relationship(a: &User, b: &User) -> Relationship { ...@@ -168,7 +163,7 @@ fn get_relationship(a: &User, b: &User) -> Relationship {
/// retrieve all of your friends /// retrieve all of your friends
#[get("/@me/friend")] #[get("/@me/friend")]
pub fn get_friends(user: User) -> JsonValue { pub fn get_friends(user: User) -> Response {
let mut results = Vec::new(); let mut results = Vec::new();
if let Some(arr) = user.relations { if let Some(arr) = user.relations {
for item in arr { for item in arr {
...@@ -179,170 +174,185 @@ pub fn get_friends(user: User) -> JsonValue { ...@@ -179,170 +174,185 @@ pub fn get_friends(user: User) -> JsonValue {
} }
} }
json!(results) Response::Success(json!(results))
} }
/// retrieve friend status with user /// retrieve friend status with user
#[get("/<target>/friend")] #[get("/<target>/friend")]
pub fn get_friend(user: User, target: User) -> JsonValue { pub fn get_friend(user: User, target: User) -> Response {
let relationship = get_relationship(&user, &target); let relationship = get_relationship(&user, &target);
json!({ Response::Success(json!({ "status": relationship as u8 }))
"id": target.id,
"status": relationship as u8
})
} }
/// create or accept a friend request /// create or accept a friend request
#[put("/<target>/friend")] #[put("/<target>/friend")]
pub fn add_friend(user: User, target: User) -> JsonValue { pub fn add_friend(user: User, target: User) -> Response {
let col = database::get_collection("users"); let col = database::get_collection("users");
let relationship = get_relationship(&user, &target); let relationship = get_relationship(&user, &target);
match relationship { match relationship {
Relationship::FRIEND => json!({ Relationship::FRIEND => Response::BadRequest(json!({ "error": "Already friends." })),
"success": false, Relationship::OUTGOING => {
"error": "Already friends." Response::BadRequest(json!({ "error": "Already sent a friend request." }))
}), }
Relationship::OUTGOING => json!({
"success": false,
"error": "Already sent a friend request."
}),
Relationship::INCOMING => { Relationship::INCOMING => {
col.update_one( if col
doc! { .update_one(
"_id": user.id.clone(), doc! {
"relations.id": target.id.clone() "_id": user.id.clone(),
}, "relations.id": target.id.clone()
doc! { },
"$set": { doc! {
"relations.$.status": Relationship::FRIEND as i32 "$set": {
} "relations.$.status": Relationship::FRIEND as i32
}, }
None, },
) None,
.expect("Failed update query."); )
.is_ok()
col.update_one( {
doc! { if col
"_id": target.id, .update_one(
"relations.id": user.id doc! {
}, "_id": target.id,
doc! { "relations.id": user.id
"$set": { },
"relations.$.status": Relationship::FRIEND as i32 doc! {
} "$set": {
}, "relations.$.status": Relationship::FRIEND as i32
None, }
) },
.expect("Failed update query."); None,
)
json!({ .is_ok()
"success": true, {
"status": Relationship::FRIEND as u8, Response::Success(json!({ "status": Relationship::FRIEND as u8 }))
}) } else {
Response::InternalServerError(
json!({ "error": "Failed to commit! Try re-adding them as a friend." }),
)
}
} else {
Response::InternalServerError(
json!({ "error": "Failed to commit to database, try again." }),
)
}
}
Relationship::BLOCKED => {
Response::BadRequest(json!({ "error": "You have blocked this person." }))
}
Relationship::BLOCKEDOTHER => {
Response::Conflict(json!({ "error": "You have been blocked by this person." }))
} }
Relationship::BLOCKED => json!({
"success": false,
"error": "You have blocked this person."
}),
Relationship::BLOCKEDOTHER => json!({
"success": false,
"error": "You have been blocked by this person."
}),
Relationship::NONE => { Relationship::NONE => {
col.update_one( if col
doc! { .update_one(
"_id": user.id.clone() doc! {
}, "_id": user.id.clone()
doc! { },
"$push": { doc! {
"relations": { "$push": {
"id": target.id.clone(), "relations": {
"status": Relationship::OUTGOING as i32 "id": target.id.clone(),
} "status": Relationship::OUTGOING as i32
} }
},
None,
)
.expect("Failed update query.");
col.update_one(
doc! {
"_id": target.id
},
doc! {
"$push": {
"relations": {
"id": user.id,
"status": Relationship::INCOMING as i32
} }
} },
}, None,
None, )
) .is_ok()
.expect("Failed update query."); {
if col
json!({ .update_one(
"success": true, doc! {
"status": Relationship::OUTGOING as u8, "_id": target.id
}) },
doc! {
"$push": {
"relations": {
"id": user.id,
"status": Relationship::INCOMING as i32
}
}
},
None,
)
.is_ok()
{
Response::Success(json!({ "status": Relationship::OUTGOING as u8 }))
} else {
Response::InternalServerError(
json!({ "error": "Failed to commit! Try re-adding them as a friend." }),
)
}
} else {
Response::InternalServerError(
json!({ "error": "Failed to commit to database, try again." }),
)
}
}
Relationship::SELF => {
Response::BadRequest(json!({ "error": "You're already friends with yourself, no? c:" }))
} }
Relationship::SELF => json!({
"success": false,
"error": "Cannot add yourself as a friend."
}),
} }
} }
/// remove a friend or deny a request /// remove a friend or deny a request
#[delete("/<target>/friend")] #[delete("/<target>/friend")]
pub fn remove_friend(user: User, target: User) -> JsonValue { pub fn remove_friend(user: User, target: User) -> Response {
let col = database::get_collection("users"); let col = database::get_collection("users");
let relationship = get_relationship(&user, &target); let relationship = get_relationship(&user, &target);
match relationship { match relationship {
Relationship::FRIEND | Relationship::OUTGOING | Relationship::INCOMING => { Relationship::FRIEND | Relationship::OUTGOING | Relationship::INCOMING => {
col.update_one( if col
doc! { .update_one(
"_id": user.id.clone() doc! {
}, "_id": user.id.clone()
doc! { },
"$pull": { doc! {
"relations": { "$pull": {
"id": target.id.clone() "relations": {
} "id": target.id.clone()
} }
},
None,
)
.expect("Failed update query.");
col.update_one(
doc! {
"_id": target.id
},
doc! {
"$pull": {
"relations": {
"id": user.id
} }
} },
}, None,
None, )
) .is_ok()
.expect("Failed update query."); {
if col
json!({ .update_one(
"success": true doc! {
}) "_id": target.id
},
doc! {
"$pull": {
"relations": {
"id": user.id
}
}
},
None,
)
.is_ok()
{
Response::Result(super::Status::Ok)
} else {
Response::InternalServerError(
json!({ "error": "Failed to commit! Target remains in same state." }),
)
}
} else {
Response::InternalServerError(
json!({ "error": "Failed to commit to database, try again." }),
)
}
} }
Relationship::BLOCKED Relationship::BLOCKED
| Relationship::BLOCKEDOTHER | Relationship::BLOCKEDOTHER
| Relationship::NONE | Relationship::NONE
| Relationship::SELF => json!({ | Relationship::SELF => Response::BadRequest(json!({ "error": "This has no effect." })),
"success": false,
"error": "This has no effect."
}),
} }
} }
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment