added decline action for friend requests and room invites

This commit is contained in:
2026-01-05 20:57:25 +01:00
parent 7732fbec32
commit 52a6231d0b
2 changed files with 78 additions and 0 deletions

View File

@@ -31,12 +31,18 @@ pub struct AcceptFriendRequestPayload {
pub sender_uuid: Uuid, pub sender_uuid: Uuid,
} }
#[derive(serde::Deserialize)]
pub struct DeclineFriendRequestPayload {
pub sender_uuid: Uuid,
}
pub fn routes() -> Router { pub fn routes() -> Router {
Router::new() Router::new()
.route("/friends", get(list_friends)) .route("/friends", get(list_friends))
.route("/friends/requests", get(list_requests)) .route("/friends/requests", get(list_requests))
.route("/friends/request", post(send_request)) .route("/friends/request", post(send_request))
.route("/friends/accept", post(accept_request)) .route("/friends/accept", post(accept_request))
.route("/friends/decline", post(decline_request))
} }
async fn list_friends( async fn list_friends(
@@ -217,3 +223,39 @@ async fn accept_request(
}), }),
)) ))
} }
async fn decline_request(
headers: HeaderMap,
Extension(db): Extension<PgPool>,
Json(payload): Json<DeclineFriendRequestPayload>,
) -> Result<StatusCode, (StatusCode, String)> {
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)
}

View File

@@ -53,6 +53,7 @@ pub fn routes() -> Router {
.route("/rooms/invites", get(list_invites)) .route("/rooms/invites", get(list_invites))
.route("/rooms/invite", post(send_invite)) .route("/rooms/invite", post(send_invite))
.route("/rooms/join", post(accept_request)) .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<Postgres>) -> bool { pub async fn is_member(user_id: i32, room_id: i32, db: &Pool<Postgres>) -> bool {
@@ -398,3 +399,38 @@ async fn accept_request(
}), }),
)) ))
} }
async fn decline_request(
headers: HeaderMap,
Extension(db): Extension<PgPool>,
Json(payload): Json<AcceptRoomInvitePayload>,
) -> Result<StatusCode, (StatusCode, String)> {
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)
}