Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions src-tauri/src/cloud/queue.rs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ pub fn open_queue() -> Result<Connection, String> {
conn.execute_batch(
"CREATE TABLE IF NOT EXISTS cloud_sync_queue (
id INTEGER PRIMARY KEY,
kind TEXT NOT NULL CHECK (kind IN ('snapshot', 'alert', 'miners')),
kind TEXT NOT NULL CHECK (kind IN ('snapshot', 'alert', 'miners', 'alert-read', 'alerts-read-all')),
payload_json TEXT NOT NULL,
created_at INTEGER NOT NULL,
attempts INTEGER NOT NULL DEFAULT 0,
Expand All @@ -34,23 +34,24 @@ pub fn open_queue() -> Result<Connection, String> {
ON cloud_sync_queue(created_at);"
).map_err(|e| format!("Failed to create queue table: {}", e))?;

// Migration: older installs created the table with a CHECK that allowed
// only ('snapshot', 'alert'). SQLite can't ALTER a CHECK constraint, so
// rebuild the table when the existing definition doesn't include 'miners'.
// Migration: older installs created the table with a CHECK that didn't
// allow every kind the sync loop can now enqueue. SQLite can't ALTER a
// CHECK constraint, so rebuild the table when the existing definition is
// missing any of the current kinds.
let existing_sql: String = conn
.query_row(
"SELECT sql FROM sqlite_master WHERE type='table' AND name='cloud_sync_queue'",
[],
|row| row.get(0),
)
.unwrap_or_default();
if !existing_sql.is_empty() && !existing_sql.contains("'miners'") {
log::info!("Cloud queue: migrating CHECK constraint to allow 'miners' kind");
if !existing_sql.is_empty() && !existing_sql.contains("'alert-read'") {
log::info!("Cloud queue: migrating CHECK constraint to allow 'alert-read'/'alerts-read-all' kinds");
conn.execute_batch(
"BEGIN;
CREATE TABLE cloud_sync_queue_new (
id INTEGER PRIMARY KEY,
kind TEXT NOT NULL CHECK (kind IN ('snapshot', 'alert', 'miners')),
kind TEXT NOT NULL CHECK (kind IN ('snapshot', 'alert', 'miners', 'alert-read', 'alerts-read-all')),
payload_json TEXT NOT NULL,
created_at INTEGER NOT NULL,
attempts INTEGER NOT NULL DEFAULT 0,
Expand Down
15 changes: 11 additions & 4 deletions src-tauri/src/commands/alerts.rs
Original file line number Diff line number Diff line change
Expand Up @@ -343,17 +343,24 @@ pub async fn acknowledge_alert(
let api_key = state.api_key.lock().unwrap().clone();
let pushed = match api_key {
Some(key) => match crate::cloud::client::push_alert_read(&key, &payload).await {
Ok(()) => true,
Ok(()) => {
log::info!("Cloud: alert-read pushed successfully ({})", rule_name);
true
}
Err(e) => {
log::warn!("Cloud: alert-read push failed, queueing — {}", e);
false
}
},
None => false,
None => {
log::warn!("Cloud: no api_key set, queueing alert-read instead of pushing");
false
}
};
if !pushed {
if let Err(qe) = crate::cloud::queue::enqueue("alert-read", &payload) {
log::warn!("Cloud: failed to enqueue alert-read: {}", qe);
match crate::cloud::queue::enqueue("alert-read", &payload) {
Ok(()) => log::info!("Cloud: enqueued alert-read for sync"),
Err(qe) => log::warn!("Cloud: failed to enqueue alert-read: {}", qe),
}
}
}
Expand Down
Loading