From aa6a48a09b237d097ab550408ac3e474911b24a7 Mon Sep 17 00:00:00 2001 From: Mariano Riefolo Date: Sun, 11 Aug 2024 16:42:18 +0200 Subject: [PATCH] feat(api): add api for updating username, email, password, and deleting account --- src/api/mod.rs | 78 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 77 insertions(+), 1 deletion(-) diff --git a/src/api/mod.rs b/src/api/mod.rs index 7d6eb8c..1a1ea23 100644 --- a/src/api/mod.rs +++ b/src/api/mod.rs @@ -14,7 +14,10 @@ pub fn get_routes() -> Router { Router::new() .route("/register", post(register)) .route("/login", post(login)) - .route("/change_username", post(change_username)), + .route("/change_username", post(change_username)) + .route("/change_email", post(change_email)) + .route("/change_password", post(change_password)) + .route("/delete_account", post(delete_account)), ) } @@ -160,3 +163,76 @@ pub async fn change_username(Json(payload): Json) -> Json connection.close().expect("Failed to close"); Json(json!({ "success": "Username changed with success" })) } + +#[derive(Deserialize)] +pub struct ChangeEmailPayload { + email: String, + token: String, +} + +pub async fn change_email(Json(payload): Json) -> Json { + let account_id = match get_account_id_from_jwt(&payload.token) { + Ok(account_id) => account_id, + Err(_) => return Json(json!({ "error": "Invalid token" })), + }; + + let connection = Connection::open("database.db").expect("Failed to open database"); + match db::change_email(&connection, account_id, &payload.email) { + Ok(_) => {} + Err(rusqlite::Error::SqliteFailure(_, _)) => { + connection.close().expect("Failed to close"); + return Json(json!({ "error": "Email already taken" })); + } + Err(_) => { + connection.close().expect("Failed to close"); + return Json(json!({ "error": "Failed to change email" })); + } + } + connection.close().expect("Failed to close"); + Json(json!({ "success": "Email changed with success" })) +} + +#[derive(Deserialize)] +pub struct ChangePasswordPayload { + password: String, + token: String, +} + +pub async fn change_password(Json(payload): Json) -> Json { + let account_id = match get_account_id_from_jwt(&payload.token) { + Ok(account_id) => account_id, + Err(_) => return Json(json!({ "error": "Invalid token" })), + }; + let connection = Connection::open("database.db").expect("Failed to open database"); + match db::change_password(&connection, account_id, &payload.password) { + Ok(_) => {} + Err(_) => { + connection.close().expect("Failed to close"); + return Json(json!({ "error": "Failed to change password" })); + } + } + connection.close().expect("Failed to close"); + Json(json!({ "success": "Password changed with success" })) +} + +#[derive(Deserialize)] +pub struct DeleteAccountPayload { + token: String, +} + +pub async fn delete_account(Json(payload): Json) -> Json { + let account_id = match get_account_id_from_jwt(&payload.token) { + Ok(account_id) => account_id, + Err(_) => return Json(json!({ "error": "Invalid token" })), + }; + let connection = Connection::open("database.db").expect("Failed to open database"); + match db::delete_account(&connection, account_id) { + Ok(_) => {} + Err(_) => { + connection.close().expect("Failed to close"); + return Json(json!({ "error": "Failed to delete account" })); + } + } + connection.close().expect("Failed to close"); + Json(json!({ "success": "Account deleted with success" })) +}