From ea3b3d5a384fd5d496c65d2c7e2e094cba9f2bfe Mon Sep 17 00:00:00 2001 From: vegard Date: Mon, 16 Mar 2026 03:22:18 +0100 Subject: [PATCH] Fix: worker oppdaterer SpacetimeDB etter AI-behandling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Frontend leser fra SpacetimeDB, men workeren skrev kun til PG. Nå kalles edit_message-reduceren i SpacetimeDB etter vellykket AI-behandling, slik at resultatet vises umiddelbart i chatten. Co-Authored-By: Claude Opus 4.6 --- worker/src/handlers/ai_text_process.rs | 54 +++++++++++++++++++++++++- worker/src/handlers/mod.rs | 10 ++++- worker/src/main.rs | 2 + 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/worker/src/handlers/ai_text_process.rs b/worker/src/handlers/ai_text_process.rs index ab75439..d10225a 100644 --- a/worker/src/handlers/ai_text_process.rs +++ b/worker/src/handlers/ai_text_process.rs @@ -35,14 +35,24 @@ pub struct AiTextProcessHandler { http: reqwest::Client, ai_gateway_url: String, ai_gateway_key: String, + spacetimedb_url: String, + spacetimedb_module: String, } impl AiTextProcessHandler { - pub fn new(http: reqwest::Client, ai_gateway_url: String, ai_gateway_key: String) -> Self { + pub fn new( + http: reqwest::Client, + ai_gateway_url: String, + ai_gateway_key: String, + spacetimedb_url: String, + spacetimedb_module: String, + ) -> Self { Self { http, ai_gateway_url, ai_gateway_key, + spacetimedb_url, + spacetimedb_module, } } } @@ -185,6 +195,11 @@ impl JobHandler for AiTextProcessHandler { .await .context("Feil ved oppdatering av melding")?; + // 8. Oppdater SpacetimeDB slik at frontend ser endringen + if let Err(e) = self.update_spacetimedb(&message_id, workspace_id, &ai_resp.content).await { + warn!(error = %e, "Kunne ikke oppdatere SpacetimeDB — PG er oppdatert, frontend oppdateres ved neste reload"); + } + info!( message_id = %message_id, action = action, @@ -209,6 +224,43 @@ impl JobHandler for AiTextProcessHandler { } impl AiTextProcessHandler { + /// Oppdater meldingen i SpacetimeDB via edit_message reducer, + /// slik at frontend (som leser fra SpacetimeDB) ser AI-resultatet. + async fn update_spacetimedb( + &self, + message_id: &Uuid, + workspace_id: &Uuid, + new_body: &str, + ) -> anyhow::Result<()> { + let url = format!( + "{}/v1/database/{}/call/edit_message", + self.spacetimedb_url, self.spacetimedb_module + ); + + let payload = json!({ + "id": message_id.to_string(), + "workspaceId": workspace_id.to_string(), + "newBody": new_body + }); + + let resp = self + .http + .post(&url) + .json(&payload) + .send() + .await + .context("HTTP-kall til SpacetimeDB edit_message feilet")?; + + if !resp.status().is_success() { + let status = resp.status(); + let body = resp.text().await.unwrap_or_default(); + anyhow::bail!("edit_message feilet ({}): {}", status, body); + } + + info!(message_id = %message_id, "SpacetimeDB oppdatert med AI-resultat"); + Ok(()) + } + async fn call_ai_gateway( &self, system_prompt: &str, diff --git a/worker/src/handlers/mod.rs b/worker/src/handlers/mod.rs index 825ee4f..f0a8338 100644 --- a/worker/src/handlers/mod.rs +++ b/worker/src/handlers/mod.rs @@ -22,7 +22,13 @@ pub trait JobHandler: Send + Sync { pub type HandlerRegistry = HashMap>; /// Bygg registeret med alle tilgjengelige handlers. -pub fn build_registry(http: reqwest::Client, ai_gateway_url: String, ai_gateway_key: String) -> HandlerRegistry { +pub fn build_registry( + http: reqwest::Client, + ai_gateway_url: String, + ai_gateway_key: String, + spacetimedb_url: String, + spacetimedb_module: String, +) -> HandlerRegistry { let mut registry: HandlerRegistry = HashMap::new(); // Echo-handler for testing @@ -35,6 +41,8 @@ pub fn build_registry(http: reqwest::Client, ai_gateway_url: String, ai_gateway_ http.clone(), ai_gateway_url.clone(), ai_gateway_key.clone(), + spacetimedb_url.clone(), + spacetimedb_module.clone(), )), ); diff --git a/worker/src/main.rs b/worker/src/main.rs index bca6995..f284fe6 100644 --- a/worker/src/main.rs +++ b/worker/src/main.rs @@ -85,6 +85,8 @@ async fn main() -> anyhow::Result<()> { reqwest::Client::new(), cli.ai_gateway_url, cli.ai_gateway_key, + cli.spacetimedb_url.clone(), + cli.spacetimedb_module.clone(), )); let registered: Vec<&str> = registry.keys().map(|k| k.as_str()).collect();