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 jsonwebtoken::{encode, EncodingKey, Header};
|
||||
use jsonwebtoken::{encode, DecodingKey, EncodingKey, Header};
|
||||
use rusqlite::Connection;
|
||||
use serde::Deserialize;
|
||||
use serde::Serialize;
|
||||
@ -13,11 +13,12 @@ pub fn get_routes() -> Router {
|
||||
"/api",
|
||||
Router::new()
|
||||
.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 {
|
||||
account_id: 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