Skip to main content

game_manager_lib/commands/metadata/
protondb.rs

1use crate::database::AppState;
2use crate::errors::AppError;
3use crate::services::cache;
4use crate::services::integration::protondb;
5use crate::services::integration::protondb::{is_running_on_linux, ProtonDbSummary};
6use tauri::State;
7
8#[tauri::command]
9pub async fn fetch_protondb_data(
10    state: State<'_, AppState>,
11    steam_app_id: String,
12) -> Result<Option<ProtonDbSummary>, AppError> {
13    if !is_running_on_linux() {
14        return Ok(None); // segurança extra: mesmo se o frontend chamar por engano, não gasta requisição
15    }
16
17    let cache_key = format!("protondb_{}", steam_app_id);
18
19    // 1. Tenta pegar do Cache
20    let cached_summary = {
21        let cache_conn = state.cache_db.lock().map_err(|_| AppError::MutexError)?;
22        cache::get_cached_api_data(&cache_conn, "protondb", &cache_key)
23    };
24
25    if let Some(cached) = cached_summary {
26        if let Ok(summary) = serde_json::from_str(&cached) {
27            return Ok(Some(summary));
28        }
29    }
30
31    // 2. Se não tem cache, busca na API
32    match protondb::get_compatibility_summary(&steam_app_id).await {
33        Ok(Some(summary)) => {
34            if let Ok(json) = serde_json::to_string(&summary) {
35                let cache_conn = state.cache_db.lock().map_err(|_| AppError::MutexError)?;
36                // Salva o JSON stringificado usando "protondb" como source
37                let _ = cache::save_cached_api_data(&cache_conn, "protondb", &cache_key, &json);
38            }
39            Ok(Some(summary))
40        }
41        Ok(None) => Ok(None),
42        Err(e) => {
43            tracing::warn!("ProtonDB falhou para app_id '{}': {}", steam_app_id, e);
44            Ok(None) // Falha silenciosa para o frontend
45        }
46    }
47}