Workstream C: convert commands/download to a folder module, extract pinning and smart-cache commands
- Move commands/download.rs to commands/download/mod.rs. - Extract pin/unpin/is_pinned into download/pinning.rs. - Extract smart-cache stats/config + album recommendation commands into download/smart_cache.rs. - Re-exported via pub use so command names stay at commands::download::*; invoke_handler unchanged, all tests pass.
This commit is contained in:
@@ -0,0 +1,63 @@
|
||||
//! Pinning commands - protect an item's cached metadata from cache clearing.
|
||||
|
||||
use std::sync::Arc;
|
||||
use tauri::State;
|
||||
|
||||
use crate::commands::DatabaseWrapper;
|
||||
use crate::storage::db_service::{DatabaseService, Query, QueryParam};
|
||||
|
||||
/// Pin an item's metadata (protects from cache clear)
|
||||
#[tauri::command]
|
||||
pub async fn pin_item(db: State<'_, DatabaseWrapper>, item_id: String) -> Result<(), String> {
|
||||
let db_service = {
|
||||
let database = db.0.lock().map_err(|e| e.to_string())?;
|
||||
Arc::new(database.service())
|
||||
};
|
||||
|
||||
let query = Query::with_params(
|
||||
"UPDATE items SET is_pinned = 1 WHERE id = ?",
|
||||
vec![QueryParam::String(item_id)],
|
||||
);
|
||||
|
||||
db_service.execute(query).await.map_err(|e| e.to_string())?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Unpin an item's metadata
|
||||
#[tauri::command]
|
||||
pub async fn unpin_item(db: State<'_, DatabaseWrapper>, item_id: String) -> Result<(), String> {
|
||||
let db_service = {
|
||||
let database = db.0.lock().map_err(|e| e.to_string())?;
|
||||
Arc::new(database.service())
|
||||
};
|
||||
|
||||
let query = Query::with_params(
|
||||
"UPDATE items SET is_pinned = 0 WHERE id = ?",
|
||||
vec![QueryParam::String(item_id)],
|
||||
);
|
||||
|
||||
db_service.execute(query).await.map_err(|e| e.to_string())?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
/// Check if an item is pinned
|
||||
#[tauri::command]
|
||||
pub async fn is_item_pinned(db: State<'_, DatabaseWrapper>, item_id: String) -> Result<bool, String> {
|
||||
let db_service = {
|
||||
let database = db.0.lock().map_err(|e| e.to_string())?;
|
||||
Arc::new(database.service())
|
||||
};
|
||||
|
||||
let query = Query::with_params(
|
||||
"SELECT COALESCE(is_pinned, 0) FROM items WHERE id = ?",
|
||||
vec![QueryParam::String(item_id)],
|
||||
);
|
||||
|
||||
let is_pinned: i32 = db_service
|
||||
.query_optional(query, |row| row.get(0))
|
||||
.await
|
||||
.map_err(|e| e.to_string())?
|
||||
.unwrap_or(0);
|
||||
|
||||
Ok(is_pinned == 1)
|
||||
}
|
||||
Reference in New Issue
Block a user