use crate::api; use crate::api::JoinResponse; use crate::server_core::model::Machine; use axum::Json; use axum::http::StatusCode; use axum_client_ip::ClientIp; use based::auth::Sessions; use based::auth::User; use owl::save; use serde::Deserialize; use serde_json::json; #[derive(Deserialize)] pub struct LoginParam { username: String, password: String, } pub async fn login_user(Json(payload): Json) -> (StatusCode, Json) { log::info!("Login attempt for {}", payload.username); let u = User::find(&payload.username).await.unwrap(); if u.read().verify_pw(&payload.password) { let ses = u.read().session().await; (StatusCode::OK, Json(json!({"token": ses.read().token}))) } else { (StatusCode::FORBIDDEN, Json(json!({"error": "invalid"}))) } } pub async fn join_device( ClientIp(ip): ClientIp, Json(payload): Json, ) -> (StatusCode, Json) { // TODO : check if exists already // TODO : validate join token log::info!( "New device joined: {} [{}]", payload.hostname.trim(), payload.machine_id ); let machine = Machine::from_join_param(payload); let new_token = machine.token.clone(); save!(machine); let i = crate::IDENTITY.get().unwrap(); ( StatusCode::OK, Json(json!(JoinResponse { token: new_token, identity: i.public(), mqtt: crate::CONFIG.get().unwrap().mqtt.clone() })), ) }