Files
ERitors-Scribe-Desktop/src-tauri/src/domains/issue/service.rs
natreex ee4438834c Migrate from window.electron to tauri IPC functions across components
- Replaced `window.electron.invoke` calls with equivalent `tauri` function calls for all IPC interactions.
- Removed `electron.d.ts` TypeScript definitions as they are no longer needed.
- Updated related logic for offline/online state synchronization.
- Added `types.rs` and `shared/mod.rs` modules to support Tauri IPC integration with Rust enums and shared logic.
- Refactored IPC request queues to use updated handler names for consistency with Tauri.
2026-03-21 09:34:13 -04:00

83 lines
3.6 KiB
Rust

use rusqlite::Connection;
use serde::Serialize;
use crate::crypto::encryption::{decrypt_data_with_user_key, encrypt_data_with_user_key, hash_element};
use crate::crypto::key_manager::get_user_encryption_key;
use crate::domains::issue::repo;
use crate::domains::tombstone::repo as tombstone_repo;
use crate::error::AppResult;
use crate::helpers::{create_unique_id, timestamp_in_seconds};
use crate::shared::types::Lang;
/// Represents a synced issue with its metadata.
pub struct SyncedIssue {
pub id: String,
pub name: String,
pub last_update: i64,
}
#[derive(Serialize)]
pub struct IssueProps {
pub id: String,
pub name: String,
}
/// Retrieves all issues associated with a specific book.
/// Decrypts issue names using the user's encryption key.
/// * `conn` - Database connection
/// * `user_id` - The unique identifier of the user
/// * `book_id` - The unique identifier of the book
/// * `lang` - The language for error messages ("fr" or "en")
/// Returns a list of decrypted issues.
pub fn get_issues_from_book(conn: &Connection, user_id: &str, book_id: &str, lang: Lang) -> AppResult<Vec<IssueProps>> {
let issue_query_results: Vec<repo::IssueQuery> = repo::fetch_issues_from_book(conn, user_id, book_id, lang)?;
let user_encryption_key: String = get_user_encryption_key(user_id)?;
let mut decrypted_issues: Vec<IssueProps> = Vec::new();
if !issue_query_results.is_empty() {
for issue_record in issue_query_results {
decrypted_issues.push(IssueProps {
id: issue_record.issue_id,
name: decrypt_data_with_user_key(&issue_record.name, &user_encryption_key)?,
});
}
}
Ok(decrypted_issues)
}
/// Creates a new issue for a book.
/// Encrypts and hashes the issue name before storage.
/// * `conn` - Database connection
/// * `user_id` - The unique identifier of the user
/// * `book_id` - The unique identifier of the book
/// * `name` - The plain text name of the issue
/// * `lang` - The language for error messages ("fr" or "en")
/// * `existing_issue_id` - Optional existing issue ID for syncing purposes
/// Returns the unique identifier of the created issue.
pub fn add_new_issue(conn: &Connection, user_id: &str, book_id: &str, name: &str, lang: Lang, existing_issue_id: Option<&str>) -> AppResult<String> {
let user_encryption_key: String = get_user_encryption_key(user_id)?;
let encrypted_name: String = encrypt_data_with_user_key(name, &user_encryption_key)?;
let hashed_name: String = hash_element(name);
let issue_id: String = create_unique_id(existing_issue_id);
let last_update: i64 = timestamp_in_seconds();
repo::insert_new_issue(conn, &issue_id, user_id, book_id, &encrypted_name, &hashed_name, last_update, lang)
}
/// Removes an issue from the database.
/// * `conn` - Database connection
/// * `user_id` - The unique identifier of the user
/// * `book_id` - The unique identifier of the book
/// * `issue_id` - The unique identifier of the issue to remove
/// * `deleted_at` - The timestamp of deletion
/// * `lang` - The language for error messages ("fr" or "en")
/// Returns true if the issue was successfully removed, false otherwise.
pub fn remove_issue(conn: &Connection, user_id: &str, book_id: &str, issue_id: &str, deleted_at: i64, lang: Lang) -> AppResult<bool> {
let deleted: bool = repo::delete_issue(conn, user_id, issue_id, lang)?;
if deleted {
tombstone_repo::insert(conn, book_id, "book_issues", issue_id, Some(book_id), user_id, deleted_at, lang)?;
}
Ok(deleted)
}