pub use hotaru::prelude::*;
use hotaru::http::*;
use crate::op::APP;
use super::analyze::get_auth_token;
use crate::admin::check_is_admin;
use super::LOCAL_AUTH;
endpoint! {
APP.url("/users"),
pub create_user <HTTP> {
if req.method() != POST {
return akari_json!({ success: false, error: "Method not allowed" }).status(401);
}
if !check_is_admin(req).await {
return akari_json!({ success: false, error: "Unauthorized" }).status(403);
}
let mut json = req.json_or_default().await;
let username = json.get("username").string();
let email = json.get("email").string();
let password = json.get("password").string();
let result = LOCAL_AUTH.register_user(&username, &email, &password).await;
match result {
Ok(_) => akari_json!({ success: true, username: username }),
Err(err) => akari_json!({ success: false, error: err.to_string() }),
}
}
}
endpoint! {
APP.url("/users/me"),
pub user_me <HTTP> {
let token = get_auth_token(req);
println!("[/users/me] Authorization header token: {:?}", token);
if token.is_none() {
println!("[/users/me] No token found, returning 401");
return akari_json!({ success: false, error: "Token invalid" }).status(401);
}
let token = token.unwrap();
println!("[/users/me] Looking up user for token: {}", token);
match LOCAL_AUTH.get_user_info(token.clone()).await {
Ok(mut user) => {
println!("[/users/me] SUCCESS - found user: {:?}", user);
user += object!({ is_active: true, is_verified: true });
akari_json!({ success: true, user: user })
},
Err(err) => {
println!("[/users/me] ERROR - get_user_info failed: {}", err.to_string());
akari_json!({ success: false, error: err.to_string() }).status(401)
}
}
}
}
endpoint! {
APP.url("/users/me/password"),
pub change_password <HTTP> {
let token = get_auth_token(req);
if token.is_none() {
return akari_json!({ success: false, error: "Token invalid" }).status(403);
}
let json = req.json_or_default().await;
let old_password = json.get("old_password").string();
let new_password = json.get("new_password").string();
if old_password.is_empty() || new_password.is_empty() {
return akari_json!({ success: false, error: "Invalid old or new password" }).status(400);
}
let token = token.unwrap();
let uid = match LOCAL_AUTH.authenticate_user(&token).await {
Ok(uid) => uid,
Err(err) => return akari_json!({ success: false, error: err.to_string() }).status(400),
};
match LOCAL_AUTH.change_password(&token, &old_password, &new_password).await {
Ok(_) => akari_json!({ success: true }),
Err(err) => akari_json!({ success: false, error: err.to_string() }).status(400),
}
}
}
endpoint! {
APP.url("/auth/refresh"),
pub refresh_token <HTTP> {
let token = get_auth_token(req);
if token.is_none() {
return akari_json!({ success: false, error: "Token invalid" }).status(403);
}
let token = token.unwrap();
match LOCAL_AUTH.refresh_token(&token).await {
Ok(new_token) => akari_json!({ success: true, access_token: new_token, token_type: "Bearer" }),
Err(err) => akari_json!({ success: false, error: err.to_string() }),
}
}
}
endpoint! {
APP.url("/auth/login"),
pub login <HTTP> {
if req.method() != POST {
return akari_json!({ success: false, message: "Method not allowed" }).status(405);
}
let json = req.json_or_default().await;
let id = match json.try_get("id") {
Ok(value) => value.string(),
Err(_) => json.get("username").string(),
};
let password = json.get("password").string();
let uid = LOCAL_AUTH.uid_from_username_or_email_or_uid(id).await;
if let Err(err) = uid {
return akari_json!({ success: false, message: err.to_string() }).status(400);
}
let uid = uid.unwrap();
println!("[/auth/login] Attempting login for uid: {}", uid);
match LOCAL_AUTH.login_user(uid, &password).await {
Ok(token) => {
println!("[/auth/login] SUCCESS - generated token: {}", token);
akari_json!({ success: true, access_token: token, token_type: "Bearer" })
},
Err(err) => {
println!("[/auth/login] ERROR - login failed: {}", err.to_string());
akari_json!({ success: false, message: err.to_string() })
},
}
}
}
endpoint! {
APP.url("/auth/logout"),
pub logout <HTTP> {
let token = get_auth_token(req);
if token.is_none() {
return akari_json!({ success: false, error: "Invalid authorization header" }).status(401);
}
let token = token.unwrap();
match LOCAL_AUTH.logout_user(&token).await {
Ok(_) => akari_json!({ success: true, message: "Logged out" }),
Err(err) => akari_json!({ success: false, error: err.to_string() }),
}
}
}
endpoint! {
APP.url("/health"),
pub health_check <HTTP> {
akari_json!({ status: "ok" })
}
}