forked from jmug/stoatchat
Better error handling for all routes.
This commit is contained in:
@@ -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 {
|
|||||||
.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!",
|
||||||
})
|
}))
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
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> {
|
|||||||
|
|
||||||
/// 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> {
|
|||||||
)
|
)
|
||||||
.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> {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
Some(json!(messages))
|
Some(Response::Success(json!(messages)))
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
@@ -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>) ->
|
|||||||
|
|
||||||
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>) ->
|
|||||||
.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
|
|||||||
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(
|
|||||||
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(
|
|||||||
.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
|
|||||||
.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."
|
|
||||||
}),
|
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
use super::Response;
|
||||||
use crate::database::{
|
use crate::database::{
|
||||||
self,
|
self,
|
||||||
channel::Channel,
|
channel::Channel,
|
||||||
@@ -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 {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
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> {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
|||||||
|
|
||||||
/// 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 {
|
|||||||
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 {
|
|||||||
},
|
},
|
||||||
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 {
|
|||||||
)
|
)
|
||||||
.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."
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
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;
|
|||||||
#[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 {
|
|||||||
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 {
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
|
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"
|
||||||
})
|
}))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
|
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 {
|
|||||||
|
|
||||||
/// 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 {
|
|||||||
/// 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 {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
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,12 +96,12 @@ 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(
|
||||||
@@ -108,10 +109,7 @@ pub fn dm(user: User, target: User) -> JsonValue {
|
|||||||
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 {
|
|||||||
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 {
|
|||||||
|
|
||||||
/// 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,37 +174,31 @@ 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
|
||||||
|
.update_one(
|
||||||
doc! {
|
doc! {
|
||||||
"_id": user.id.clone(),
|
"_id": user.id.clone(),
|
||||||
"relations.id": target.id.clone()
|
"relations.id": target.id.clone()
|
||||||
@@ -221,9 +210,10 @@ pub fn add_friend(user: User, target: User) -> JsonValue {
|
|||||||
},
|
},
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
.expect("Failed update query.");
|
.is_ok()
|
||||||
|
{
|
||||||
col.update_one(
|
if col
|
||||||
|
.update_one(
|
||||||
doc! {
|
doc! {
|
||||||
"_id": target.id,
|
"_id": target.id,
|
||||||
"relations.id": user.id
|
"relations.id": user.id
|
||||||
@@ -235,23 +225,29 @@ pub fn add_friend(user: User, target: User) -> JsonValue {
|
|||||||
},
|
},
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
.expect("Failed update query.");
|
.is_ok()
|
||||||
|
{
|
||||||
json!({
|
Response::Success(json!({ "status": Relationship::FRIEND as u8 }))
|
||||||
"success": true,
|
} else {
|
||||||
"status": Relationship::FRIEND as u8,
|
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
|
||||||
|
.update_one(
|
||||||
doc! {
|
doc! {
|
||||||
"_id": user.id.clone()
|
"_id": user.id.clone()
|
||||||
},
|
},
|
||||||
@@ -265,9 +261,10 @@ pub fn add_friend(user: User, target: User) -> JsonValue {
|
|||||||
},
|
},
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
.expect("Failed update query.");
|
.is_ok()
|
||||||
|
{
|
||||||
col.update_one(
|
if col
|
||||||
|
.update_one(
|
||||||
doc! {
|
doc! {
|
||||||
"_id": target.id
|
"_id": target.id
|
||||||
},
|
},
|
||||||
@@ -281,29 +278,36 @@ pub fn add_friend(user: User, target: User) -> JsonValue {
|
|||||||
},
|
},
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
.expect("Failed update query.");
|
.is_ok()
|
||||||
|
{
|
||||||
json!({
|
Response::Success(json!({ "status": Relationship::OUTGOING as u8 }))
|
||||||
"success": true,
|
} else {
|
||||||
"status": Relationship::OUTGOING as u8,
|
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
|
||||||
|
.update_one(
|
||||||
doc! {
|
doc! {
|
||||||
"_id": user.id.clone()
|
"_id": user.id.clone()
|
||||||
},
|
},
|
||||||
@@ -316,9 +320,10 @@ pub fn remove_friend(user: User, target: User) -> JsonValue {
|
|||||||
},
|
},
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
.expect("Failed update query.");
|
.is_ok()
|
||||||
|
{
|
||||||
col.update_one(
|
if col
|
||||||
|
.update_one(
|
||||||
doc! {
|
doc! {
|
||||||
"_id": target.id
|
"_id": target.id
|
||||||
},
|
},
|
||||||
@@ -331,18 +336,23 @@ pub fn remove_friend(user: User, target: User) -> JsonValue {
|
|||||||
},
|
},
|
||||||
None,
|
None,
|
||||||
)
|
)
|
||||||
.expect("Failed update query.");
|
.is_ok()
|
||||||
|
{
|
||||||
json!({
|
Response::Result(super::Status::Ok)
|
||||||
"success": true
|
} 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."
|
|
||||||
}),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user