feat: add api for changing username
This commit is contained in:
parent
dbb1dd452e
commit
9f63255599
@ -1,5 +1,5 @@
|
|||||||
use axum::{routing::post, Json, Router};
|
use axum::{routing::post, Json, Router};
|
||||||
use jsonwebtoken::{encode, EncodingKey, Header};
|
use jsonwebtoken::{encode, DecodingKey, EncodingKey, Header};
|
||||||
use rusqlite::Connection;
|
use rusqlite::Connection;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
@ -13,11 +13,12 @@ pub fn get_routes() -> Router {
|
|||||||
"/api",
|
"/api",
|
||||||
Router::new()
|
Router::new()
|
||||||
.route("/register", post(register))
|
.route("/register", post(register))
|
||||||
.route("/login", post(login)),
|
.route("/login", post(login))
|
||||||
|
.route("/change_username", post(change_username)),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize, Deserialize)]
|
||||||
struct Claims {
|
struct Claims {
|
||||||
account_id: usize,
|
account_id: usize,
|
||||||
exp: usize,
|
exp: usize,
|
||||||
@ -121,3 +122,41 @@ pub async fn login(Json(payload): Json<LoginPayload>) -> Json<Value> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct ChangeUsernamePayload {
|
||||||
|
username: String,
|
||||||
|
token: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_account_id_from_jwt(token: &str) -> Result<usize, jsonwebtoken::errors::Error> {
|
||||||
|
let jwt_secret = std::env::var("JWT_SECRET").expect("JWT_SECRET must be set");
|
||||||
|
let token_data = jsonwebtoken::decode::<Claims>(
|
||||||
|
token,
|
||||||
|
&DecodingKey::from_secret(jwt_secret.as_ref()),
|
||||||
|
&jsonwebtoken::Validation::default(),
|
||||||
|
)?;
|
||||||
|
Ok(token_data.claims.account_id)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn change_username(Json(payload): Json<ChangeUsernamePayload>) -> Json<Value> {
|
||||||
|
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_username(&connection, account_id, &payload.username) {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(rusqlite::Error::SqliteFailure(_, _)) => {
|
||||||
|
connection.close().expect("Failed to close");
|
||||||
|
return Json(json!({ "error": "Username already taken" }));
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
connection.close().expect("Failed to close");
|
||||||
|
return Json(json!({ "error": "Failed to change username" }));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
connection.close().expect("Failed to close");
|
||||||
|
Json(json!({ "success": "Username changed with success" }))
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user