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

Add a way to block / unblock users.

parent a910bd65
Branches
Tags
No related merge requests found
...@@ -81,7 +81,9 @@ pub fn mount(rocket: Rocket) -> Rocket { ...@@ -81,7 +81,9 @@ pub fn mount(rocket: Rocket) -> Rocket {
user::get_friends, user::get_friends,
user::get_friend, user::get_friend,
user::add_friend, user::add_friend,
user::remove_friend user::remove_friend,
user::block_user,
user::unblock_user
], ],
) )
.mount( .mount(
......
...@@ -177,18 +177,15 @@ pub fn get_friends(user: UserRef) -> Response { ...@@ -177,18 +177,15 @@ pub fn get_friends(user: UserRef) -> Response {
/// retrieve friend status with user /// retrieve friend status with user
#[get("/<target>/friend")] #[get("/<target>/friend")]
pub fn get_friend(user: UserRef, target: UserRef) -> Response { pub fn get_friend(user: UserRef, target: UserRef) -> Response {
let relationship = get_relationship(&user, &target); Response::Success(json!({ "status": get_relationship(&user, &target) as u8 }))
Response::Success(json!({ "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: UserRef, target: UserRef) -> Response { pub fn add_friend(user: UserRef, target: UserRef) -> Response {
let relationship = get_relationship(&user, &target);
let col = database::get_collection("users"); let col = database::get_collection("users");
match relationship { match get_relationship(&user, &target) {
Relationship::Friend => Response::BadRequest(json!({ "error": "Already friends." })), Relationship::Friend => Response::BadRequest(json!({ "error": "Already friends." })),
Relationship::Outgoing => { Relationship::Outgoing => {
Response::BadRequest(json!({ "error": "Already sent a friend request." })) Response::BadRequest(json!({ "error": "Already sent a friend request." }))
...@@ -298,10 +295,9 @@ pub fn add_friend(user: UserRef, target: UserRef) -> Response { ...@@ -298,10 +295,9 @@ pub fn add_friend(user: UserRef, target: UserRef) -> Response {
/// 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: UserRef, target: UserRef) -> Response { pub fn remove_friend(user: UserRef, target: UserRef) -> Response {
let relationship = get_relationship(&user, &target);
let col = database::get_collection("users"); let col = database::get_collection("users");
match relationship { match get_relationship(&user, &target) {
Relationship::Friend | Relationship::Outgoing | Relationship::Incoming => { Relationship::Friend | Relationship::Outgoing | Relationship::Incoming => {
if col if col
.update_one( .update_one(
...@@ -335,7 +331,7 @@ pub fn remove_friend(user: UserRef, target: UserRef) -> Response { ...@@ -335,7 +331,7 @@ pub fn remove_friend(user: UserRef, target: UserRef) -> Response {
) )
.is_ok() .is_ok()
{ {
Response::Result(super::Status::Ok) Response::Success(json!({ "status": Relationship::NONE as u8 }))
} else { } else {
Response::InternalServerError( Response::InternalServerError(
json!({ "error": "Failed to commit! Target remains in same state." }), json!({ "error": "Failed to commit! Target remains in same state." }),
...@@ -353,3 +349,171 @@ pub fn remove_friend(user: UserRef, target: UserRef) -> Response { ...@@ -353,3 +349,171 @@ pub fn remove_friend(user: UserRef, target: UserRef) -> Response {
| Relationship::SELF => Response::BadRequest(json!({ "error": "This has no effect." })), | Relationship::SELF => Response::BadRequest(json!({ "error": "This has no effect." })),
} }
} }
/// block a user
#[put("/<target>/block")]
pub fn block_user(user: UserRef, target: UserRef) -> Response {
let col = database::get_collection("users");
match get_relationship(&user, &target) {
Relationship::Friend
| Relationship::Incoming
| Relationship::Outgoing => {
if col
.update_one(
doc! {
"_id": user.id.clone(),
"relations.id": target.id.clone()
},
doc! {
"$set": {
"relations.$.status": Relationship::Blocked as i32
}
},
None,
)
.is_ok()
{
if col
.update_one(
doc! {
"_id": target.id,
"relations.id": user.id
},
doc! {
"$set": {
"relations.$.status": Relationship::BlockedOther as i32
}
},
None,
)
.is_ok()
{
Response::Success(json!({ "status": Relationship::Blocked as u8 }))
} else {
Response::InternalServerError(
json!({ "error": "Failed to commit! Try blocking the user again, remove it first." }),
)
}
} else {
Response::InternalServerError(
json!({ "error": "Failed to commit to database, try again." }),
)
}
},
Relationship::Blocked => Response::BadRequest(json!({ "error": "Already blocked this person." })),
Relationship::BlockedOther => {
if col
.update_one(
doc! {
"_id": user.id.clone(),
"relations.id": target.id.clone()
},
doc! {
"$set": {
"relations.$.status": Relationship::Blocked as i32
}
},
None,
)
.is_ok()
{
Response::Success(json!({ "status": Relationship::Blocked as u8 }))
} else {
Response::InternalServerError(
json!({ "error": "Failed to commit to database, try again." }),
)
}
},
Relationship::SELF
| Relationship::NONE => Response::BadRequest(json!({ "error": "This has no effect." })),
}
}
/// unblock a user
#[delete("/<target>/block")]
pub fn unblock_user(user: UserRef, target: UserRef) -> Response {
let col = database::get_collection("users");
match get_relationship(&user, &target) {
Relationship::Blocked => {
match get_relationship(&target, &user) {
Relationship::Blocked => {
if col
.update_one(
doc! {
"_id": user.id.clone(),
"relations.id": target.id.clone()
},
doc! {
"$set": {
"relations.$.status": Relationship::BlockedOther as i32
}
},
None,
)
.is_ok()
{
Response::Success(json!({ "status": Relationship::BlockedOther as u8 }))
} else {
Response::InternalServerError(
json!({ "error": "Failed to commit to database, try again." }),
)
}
},
Relationship::BlockedOther => {
if col
.update_one(
doc! {
"_id": user.id.clone()
},
doc! {
"$pull": {
"relations": {
"id": target.id.clone()
}
}
},
None,
)
.is_ok()
{
if col
.update_one(
doc! {
"_id": target.id
},
doc! {
"$pull": {
"relations": {
"id": user.id
}
}
},
None,
)
.is_ok()
{
Response::Success(json!({ "status": Relationship::NONE as u8 }))
} 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." }),
)
}
},
_ => unreachable!()
}
},
Relationship::BlockedOther => Response::BadRequest(json!({ "error": "Cannot remove block by other user." })),
Relationship::Friend
| Relationship::Incoming
| Relationship::Outgoing
| Relationship::SELF
| Relationship::NONE => Response::BadRequest(json!({ "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