diff --git a/src-tauri/src/commands/mod.rs b/src-tauri/src/commands/mod.rs deleted file mode 100644 index 1156c33eb..000000000 --- a/src-tauri/src/commands/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -//! Legacy commands module. -//! -//! NOTE: -//! The active frontend/runtime contract is V2 (`runtime_*` + `v2_*`) only. -//! This module keeps only the minimal internal legacy pieces still referenced -//! by non-frontend subsystems while hard-delete migration is in progress. - -pub mod user_session; -pub use user_session::*; diff --git a/src-tauri/src/commands/user_session.rs b/src-tauri/src/commands/user_session.rs deleted file mode 100644 index 23e6d9da3..000000000 --- a/src-tauri/src/commands/user_session.rs +++ /dev/null @@ -1,64 +0,0 @@ -//! Per-user session activation and teardown -//! -//! After login, the frontend calls `activate_user_session` with the Qobuz user_id. -//! This initializes all per-user database stores at the user-scoped directory. -//! On logout, `deactivate_user_session` tears everything down. -//! -//! These legacy commands now delegate to session_lifecycle module. - -use std::path::Path; -use std::sync::{Arc, Mutex}; - -use crate::user_data::UserDataPaths; - -/// Helper to init a type-alias state (Arc>>) at a path -pub fn init_type_alias_state( - state: &Arc>>, - base_dir: &Path, - constructor: F, -) -> Result<(), String> -where - F: FnOnce(&Path) -> Result, -{ - let store = constructor(base_dir)?; - let mut guard = state.lock().map_err(|e| format!("Lock error: {}", e))?; - *guard = Some(store); - Ok(()) -} - -/// Helper to teardown a type-alias state -pub fn teardown_type_alias_state(state: &Arc>>) { - if let Ok(mut guard) = state.lock() { - *guard = None; - } -} - -/// Get the last active user_id for session restore on startup. -/// Returns None if no previous session or after explicit logout. -#[tauri::command] -pub fn get_last_user_id() -> Option { - UserDataPaths::load_last_user_id() -} - -/// Activate the per-user session after login. -/// -/// This runs the one-time migration (if needed) and initializes all -/// per-user database stores at `~/.local/share/qbz/users/{user_id}/` -/// and cache stores at `~/.cache/qbz/users/{user_id}/`. -/// -/// This is a legacy command - now delegates to session_lifecycle::activate_session(). -#[tauri::command] -pub async fn activate_user_session(app: tauri::AppHandle, user_id: u64) -> Result<(), String> { - log::info!("[Legacy] activate_user_session called - delegating to session_lifecycle"); - crate::session_lifecycle::activate_session(&app, user_id).await -} - -/// Deactivate the per-user session on logout. -/// -/// Tears down all per-user stores, closing database connections. -/// This is a legacy command - now delegates to session_lifecycle::deactivate_session(). -#[tauri::command] -pub async fn deactivate_user_session(app: tauri::AppHandle) -> Result<(), String> { - log::info!("[Legacy] deactivate_user_session called - delegating to session_lifecycle"); - crate::session_lifecycle::deactivate_session(&app).await -} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 0c0d99bd5..ba303272d 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -35,7 +35,6 @@ pub mod audio; pub mod audio_device_watch; pub mod cache; pub mod cast; -pub mod commands; pub mod config; pub mod credentials; pub mod discogs; diff --git a/src-tauri/src/session_lifecycle.rs b/src-tauri/src/session_lifecycle.rs index ae3b02ea5..20453af22 100644 --- a/src-tauri/src/session_lifecycle.rs +++ b/src-tauri/src/session_lifecycle.rs @@ -7,11 +7,36 @@ //! from multiple places (runtime_bootstrap, commands, etc.) without //! duplicating the complex state initialization logic. +use std::path::Path; +use std::sync::{Arc, Mutex}; + use tauri::{Emitter, Manager}; use crate::runtime::{RuntimeEvent, RuntimeManagerState}; use crate::user_data::UserDataPaths; +/// Helper to init a type-alias state (Arc>>) at a path. +pub fn init_type_alias_state( + state: &Arc>>, + base_dir: &Path, + constructor: F, +) -> Result<(), String> +where + F: FnOnce(&Path) -> Result, +{ + let store = constructor(base_dir)?; + let mut guard = state.lock().map_err(|e| format!("Lock error: {}", e))?; + *guard = Some(store); + Ok(()) +} + +/// Helper to teardown a type-alias state. +pub fn teardown_type_alias_state(state: &Arc>>) { + if let Ok(mut guard) = state.lock() { + *guard = None; + } +} + /// Activate a user session from anywhere given an AppHandle. /// /// This performs the full session activation: @@ -21,8 +46,8 @@ use crate::user_data::UserDataPaths; /// 4. Updates runtime state /// 5. Emits UserSessionActivated event /// -/// Note: This is the core logic extracted from `activate_user_session` command. -/// It can be called from runtime_bootstrap, v2_login, or the command itself. +/// Note: This is the core logic invoked from runtime_bootstrap and v2_login +/// after the legacy `activate_user_session` Tauri command was retired. pub async fn activate_session(app: &tauri::AppHandle, user_id: u64) -> Result<(), String> { log::info!("[SessionLifecycle] Activating session"); @@ -171,12 +196,12 @@ pub async fn activate_session(app: &tauri::AppHandle, user_id: u64) -> Result<() use crate::config::{ download_settings::DownloadSettingsStore, subscription_state::SubscriptionStateStore, }; - crate::commands::user_session::init_type_alias_state( + init_type_alias_state( &*subscription_state, &data_dir, SubscriptionStateStore::new_at, )?; - crate::commands::user_session::init_type_alias_state( + init_type_alias_state( &*download_settings, &data_dir, DownloadSettingsStore::new_at, @@ -327,8 +352,8 @@ pub async fn deactivate_session(app: &tauri::AppHandle) -> Result<(), String> { // Type-alias states (per-user settings) // NOTE: LegalSettingsState is GLOBAL (not per-user) - NOT torn down here - crate::commands::user_session::teardown_type_alias_state(&*subscription_state); - crate::commands::user_session::teardown_type_alias_state(&*download_settings); + teardown_type_alias_state(&*subscription_state); + teardown_type_alias_state(&*download_settings); // Clear the active user but KEEP last_user_id on disk. // Offline mode needs it to load the user's library and settings @@ -420,7 +445,7 @@ pub async fn activate_offline_session(app: &tauri::AppHandle) -> Result<(), Stri // Download settings — needed for "Show in Local Library" toggle { use crate::config::download_settings::DownloadSettingsStore; - crate::commands::user_session::init_type_alias_state( + init_type_alias_state( &*download_settings, &data_dir, DownloadSettingsStore::new_at,