Refactor session handling and auth flow

This commit is contained in:
Rodrigo Rodriguez (Pragmatismo) 2025-10-14 14:51:49 -03:00
parent 51c9aea63b
commit 37d8fab617
5 changed files with 674 additions and 646 deletions

View file

@ -136,19 +136,17 @@ pub fn set_user_keyword(state: Arc<AppState>, user: UserSession, engine: &mut En
let state_for_spawn = Arc::clone(&state_clone); let state_for_spawn = Arc::clone(&state_clone);
let user_clone_spawn = user_clone.clone(); let user_clone_spawn = user_clone.clone();
tokio::spawn(async move { let mut session_manager =
let mut session_manager = state_for_spawn.session_manager.lock().await; futures::executor::block_on(state_for_spawn.session_manager.lock());
if let Err(e) = session_manager.update_user_id(user_clone_spawn.id, user_id) if let Err(e) = session_manager.update_user_id(user_clone_spawn.id, user_id) {
{ error!("Failed to update user ID in session: {}", e);
error!("Failed to update user ID in session: {}", e); } else {
} else { info!(
info!( "Updated session {} to user ID: {}",
"Updated session {} to user ID: {}", user_clone_spawn.id, user_id
user_clone_spawn.id, user_id );
); }
}
});
} }
Err(e) => { Err(e) => {
debug!("Invalid UUID format for SET USER: {}", e); debug!("Invalid UUID format for SET USER: {}", e);

View file

@ -305,7 +305,7 @@ impl BotOrchestrator {
e e
})?; })?;
let bot_id = if let Ok(bot_guid) = std::env::var("BOT_GUID") { let _bot_id = if let Ok(bot_guid) = std::env::var("BOT_GUID") {
Uuid::parse_str(&bot_guid).map_err(|e| { Uuid::parse_str(&bot_guid).map_err(|e| {
warn!("Invalid BOT_GUID from env: {}", e); warn!("Invalid BOT_GUID from env: {}", e);
e e
@ -714,16 +714,6 @@ async fn websocket_handler(
let session_id_clone = session_id.clone(); let session_id_clone = session_id.clone();
let user_id_clone = user_id.clone(); let user_id_clone = user_id.clone();
tokio::spawn(async move {
tokio::time::sleep(tokio::time::Duration::from_millis(500)).await;
if let Err(e) = orchestrator_clone
.trigger_auto_welcome(&session_id_clone, &user_id_clone, &bot_id, None)
.await
{
error!("Failed to trigger auto welcome: {}", e);
}
});
let web_adapter = data.web_adapter.clone(); let web_adapter = data.web_adapter.clone();
let session_id_clone1 = session_id.clone(); let session_id_clone1 = session_id.clone();
let session_id_clone2 = session_id.clone(); let session_id_clone2 = session_id.clone();
@ -855,7 +845,7 @@ async fn auth_handler(
} }
} }
}; };
let session_id_clone = session.id.clone();
let auth_script_path = "./templates/annoucements.gbai/annoucements.gbdialog/auth.bas"; let auth_script_path = "./templates/annoucements.gbai/annoucements.gbdialog/auth.bas";
let auth_script = match std::fs::read_to_string(auth_script_path) { let auth_script = match std::fs::read_to_string(auth_script_path) {
Ok(content) => content, Ok(content) => content,
@ -863,16 +853,42 @@ async fn auth_handler(
}; };
let script_service = crate::basic::ScriptService::new(Arc::clone(&data), session.clone()); let script_service = crate::basic::ScriptService::new(Arc::clone(&data), session.clone());
if let Err(e) = script_service match script_service
.compile(&auth_script) .compile(&auth_script)
.and_then(|ast| script_service.run(&ast)) .and_then(|ast| script_service.run(&ast))
{ {
error!("Failed to run auth script: {}", e); Ok(result) => {
return Ok( if result.to_string() == "false" {
HttpResponse::InternalServerError().json(serde_json::json!({"error": "Auth failed"})) error!("Auth script returned false, authentication failed");
); return Ok(HttpResponse::Unauthorized()
.json(serde_json::json!({"error": "Authentication failed"})));
}
}
Err(e) => {
error!("Failed to run auth script: {}", e);
return Ok(HttpResponse::InternalServerError()
.json(serde_json::json!({"error": "Auth failed"})));
}
} }
let session = {
let mut sm = data.session_manager.lock().await;
match sm.get_session_by_id(session_id_clone) {
Ok(Some(s)) => s,
Ok(None) => {
error!("Failed to retrieve session");
return Ok(HttpResponse::InternalServerError()
.json(serde_json::json!({"error": "Failed to retrieve session"})));
}
Err(e) => {
error!("Failed to retrieve session: {}", e);
return Ok(HttpResponse::InternalServerError()
.json(serde_json::json!({"error": e.to_string()})));
}
}
};
Ok(HttpResponse::Ok().json(serde_json::json!({ Ok(HttpResponse::Ok().json(serde_json::json!({
"user_id": session.user_id, "user_id": session.user_id,
"session_id": session.id, "session_id": session.id,

View file

@ -6,3 +6,4 @@ REM user = FIND "users", "external_id=" + result.user_id
REM SET_USER user.id REM SET_USER user.id
SET_USER "92fcffaa-bf0a-41a9-8d99-5541709d695b" SET_USER "92fcffaa-bf0a-41a9-8d99-5541709d695b"
return true;

View file

@ -1,7 +1,6 @@
TALK "Welcome to General Bots!" TALK "Oi from BASIC"
REM text = GET "default.pdf" REM text = GET "default.pdf"
REM resume = LLM "Build a resume from " + text REM resume = LLM "Say Hello and present a a resume from " + text
REM TALK resume REM TALK resume
REM SET_CONTEXT text REM SET_CONTEXT text

File diff suppressed because it is too large Load diff