Skip to main content

game_manager_lib/database/backup/
core.rs

1use crate::database::backup::export_queries::fetch_backup_data;
2use crate::database::backup::import_queries::restore_backup_data;
3use crate::database::backup::models::BackupData;
4use crate::database::{self, current_schema_version, AppState};
5use crate::errors::AppError;
6use chrono::Utc;
7use std::fs;
8use tauri::{AppHandle, State};
9
10#[tauri::command]
11pub async fn export_database(
12    app: AppHandle,
13    state: State<'_, AppState>,
14    file_path: String,
15) -> Result<(), AppError> {
16    let (
17        games,
18        game_details,
19        wishlist_game,
20        game_extras,
21        system_requirements,
22        game_data_paths,
23        schema_version,
24    ) = fetch_backup_data(&state)?;
25
26    let backup = BackupData {
27        version: schema_version,
28        app_version: app.package_info().version.to_string(),
29        date: chrono::Local::now().to_rfc3339(),
30        games,
31        game_details,
32        wishlist_game,
33        game_extras,
34        system_requirements,
35        game_data_paths,
36    };
37
38    let json = serde_json::to_string_pretty(&backup)?;
39    fs::write(file_path, json)?;
40
41    let cache_conn = state.cache_db.lock().map_err(|_| AppError::MutexError)?;
42    let now = Utc::now().to_rfc3339();
43    database::configs::set_config(&cache_conn, "last_backup_at", &now)?;
44
45    Ok(())
46}
47
48#[tauri::command]
49pub async fn import_database(
50    _app: AppHandle,
51    state: State<'_, AppState>,
52    file_path: String,
53) -> Result<String, AppError> {
54    let content = fs::read_to_string(file_path)?;
55    let backup: BackupData = serde_json::from_str(&content)
56        .map_err(|_| AppError::ValidationError("Arquivo de backup inválido".to_string()))?;
57
58    let current_version = {
59        let conn = state.games_db.lock()?;
60        current_schema_version(&conn)?
61    };
62
63    if backup.version != current_version {
64        return Err(AppError::ValidationError(format!(
65            "Backup incompatĂ­vel. Backup v{}, app espera v{}",
66            backup.version, current_version
67        )));
68    }
69
70    let conn = state.games_db.lock()?;
71    restore_backup_data(&conn, &backup)
72}