game_manager_lib/database/backup/
core.rs1use 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}