game_manager_lib/
initialization.rs

1//! # App Initialization & Update Handler
2//!
3//! Gerencia o ciclo de vida da aplicação:
4//! - Primeira instalação
5//! - Atualizações de versão
6//! - Backups automáticos
7//! - Migrações de schema
8
9use crate::database;
10use crate::errors::AppError;
11use chrono::Utc;
12use tauri::{AppHandle, Emitter, Manager};
13
14/// Inicializa a aplicação após uma atualização
15///
16/// Verifica se houve mudança de versão e executa:
17/// 1. Backup automático se versão major mudou
18/// 2. Migração de schema se necessário
19/// 3. Atualiza versão armazenada
20///
21/// Deve ser chamada durante o setup do Tauri
22pub fn initialize_app(app: &AppHandle) -> Result<(), AppError> {
23    let current_version = app.package_info().version.to_string();
24    let previous_version = database::configs::get_stored_app_version(app)?;
25
26    // Obtém acesso ao metadata_db para configurações
27    let state: tauri::State<database::AppState> = app.state();
28    let metadata_conn = state.metadata_db.lock().map_err(|_| AppError::MutexError)?;
29
30    // Verifica se é primeira instalação
31    if database::configs::get_config(&metadata_conn, "install_date")?.is_none() {
32        let now = Utc::now().to_rfc3339();
33        database::configs::set_config(&metadata_conn, "install_date", &now)?;
34        tracing::info!("Primeira execução detectada. Data salva: {}", now);
35    }
36
37    drop(metadata_conn);
38
39    tracing::info!(
40        "Inicializando app - Versão anterior: {}, Atual: {}",
41        previous_version,
42        current_version
43    );
44
45    // Se é primeira execução ou versão mudou
46    if previous_version != current_version {
47        handle_version_update(app, &previous_version, &current_version)?;
48    } else {
49        tracing::info!("Nenhuma atualização detectada");
50    }
51
52    Ok(())
53}
54
55/// Processa atualização de versão
56fn handle_version_update(
57    app: &AppHandle,
58    previous_version: &str,
59    current_version: &str,
60) -> Result<(), AppError> {
61    // 1. Backup automático se major version mudou
62    if let Some(backup_path) =
63        database::backup::backup_if_major_update(app, previous_version, current_version)?
64    {
65        tracing::info!("Backup automático criado em: {:?}", backup_path);
66
67        // Emite evento para o frontend
68        let backup_path_str = backup_path.to_string_lossy().to_string();
69        let _ = app.emit("backup-created", backup_path_str);
70    }
71
72    // 2. Migração de schema
73    let state: tauri::State<database::AppState> = app.state();
74    let lib_conn = state.library_db.lock().map_err(|_| AppError::MutexError)?;
75    database::migrations::run_migrations(app, &lib_conn)?;
76    drop(lib_conn);
77
78    // 3. Atualiza versão armazenada
79    database::configs::store_app_version(app, current_version)?;
80
81    // 4. Armazena versão do schema
82    let schema_version = app.package_info().version.major as u32;
83    database::configs::store_schema_version(app, schema_version)?;
84
85    // 5. Atualiza timestamp
86    update_last_updated_timestamp(app)?;
87
88    tracing::info!("App inicializado com sucesso na versão {}", current_version);
89
90    Ok(())
91}
92
93/// Atualiza timestamp de última atualização
94fn update_last_updated_timestamp(app: &AppHandle) -> Result<(), AppError> {
95    let state: tauri::State<database::AppState> = app.state();
96    let metadata_conn = state.metadata_db.lock().map_err(|_| AppError::MutexError)?;
97    let now = Utc::now().to_rfc3339();
98    database::configs::set_config(&metadata_conn, "last_updated_at", &now)?;
99    Ok(())
100}