diff --git a/src/routes/friends.rs b/src/routes/friends.rs index 4db20af..e579f72 100644 --- a/src/routes/friends.rs +++ b/src/routes/friends.rs @@ -31,12 +31,18 @@ pub struct AcceptFriendRequestPayload { pub sender_uuid: Uuid, } +#[derive(serde::Deserialize)] +pub struct DeclineFriendRequestPayload { + pub sender_uuid: Uuid, +} + pub fn routes() -> Router { Router::new() .route("/friends", get(list_friends)) .route("/friends/requests", get(list_requests)) .route("/friends/request", post(send_request)) .route("/friends/accept", post(accept_request)) + .route("/friends/decline", post(decline_request)) } async fn list_friends( @@ -217,3 +223,39 @@ async fn accept_request( }), )) } + +async fn decline_request( + headers: HeaderMap, + Extension(db): Extension, + Json(payload): Json, +) -> Result { + let claims = verify_jwt(headers)?; + + let receiver_id = user_id_from_uuid(&db, claims.sub).await?; + let sender_id = user_id_from_uuid(&db, payload.sender_uuid).await?; + + let rows = sqlx::query( + r#" + DELETE FROM friend_request_ + WHERE sender = $1 AND receiver = $2 + OR sender = $2 AND receiver = $1 + "#, + ) + .bind(sender_id) + .bind(receiver_id) + .execute(&db) + .await + .map_err(|_| { + ( + StatusCode::INTERNAL_SERVER_ERROR, + "Could not decline friend request".into(), + ) + })? + .rows_affected(); + + if rows == 0 { + return Err((StatusCode::NOT_FOUND, "No such request".into())); + } + + Ok(StatusCode::CREATED) +} diff --git a/src/routes/rooms.rs b/src/routes/rooms.rs index 6ca22e1..40212f7 100644 --- a/src/routes/rooms.rs +++ b/src/routes/rooms.rs @@ -53,6 +53,7 @@ pub fn routes() -> Router { .route("/rooms/invites", get(list_invites)) .route("/rooms/invite", post(send_invite)) .route("/rooms/join", post(accept_request)) + .route("/rooms/decline", post(decline_request)) } pub async fn is_member(user_id: i32, room_id: i32, db: &Pool) -> bool { @@ -398,3 +399,38 @@ async fn accept_request( }), )) } + +async fn decline_request( + headers: HeaderMap, + Extension(db): Extension, + Json(payload): Json, +) -> Result { + let claims = verify_jwt(headers)?; + + let receiver_id = user_id_from_uuid(&db, claims.sub).await?; + let sender_id = user_id_from_uuid(&db, payload.sender_uuid).await?; + + let rows = sqlx::query( + r#" + DELETE FROM room_invite_ + WHERE sender = $1 AND receiver = $2 + "#, + ) + .bind(sender_id) + .bind(receiver_id) + .execute(&db) + .await + .map_err(|_| { + ( + StatusCode::INTERNAL_SERVER_ERROR, + "Could not decline the room invite".into(), + ) + })? + .rows_affected(); + + if rows == 0 { + return Err((StatusCode::NOT_FOUND, "No such invite".into())); + } + + Ok(StatusCode::CREATED) +}