synops/maskinrommet/src/cli_dispatch.rs
vegard b5aa5bb243 Fjern SpacetimeDB komplett (oppgave 22.4)
SpacetimeDB er nå helt fjernet fra Synops. Sanntid håndteres av
PG LISTEN/NOTIFY + WebSocket i portvokteren (maskinrommet).

Kode fjernet:
- spacetimedb/ Rust-modul og spacetime.json
- maskinrommet/src/stdb.rs (HTTP-klient for STDB-reducers)
- frontend module_bindings/ (23 auto-genererte filer)
- spacetimedb npm-avhengighet fra package.json
- scripts/test-sanntid.sh (testet STDB-flyt)

Infrastruktur:
- Docker-container stoppet og fjernet fra docker-compose.yml
- Caddy: fjernet /spacetime/* reverse proxy
- maskinrommet-env.sh: fjernet STDB_IP og SPACETIMEDB_*-variabler
- .env.example: fjernet SpacetimeDB-seksjoner

Dokumentasjon oppdatert:
- CLAUDE.md: stack, lagmodell, kjerneprinsipper, driftsmodell
- docs/arkitektur.md: skrivestien, lesestien, datalag, teknologivalg
- docs/retninger/datalaget.md: migrasjonshistorikk, status "fjernet"
- 37 andre docs oppdatert (features, concepts, infra, ops, retninger)
- Alle kode-kommentarer med STDB-referanser oppdatert

Verifisert: maskinrommet bygger og starter OK, frontend bygger OK,
helsesjekk returnerer 200. Caddy reloadet.
2026-03-18 13:39:09 +00:00

62 lines
2 KiB
Rust

// Felles hjelpefunksjoner for å spawne CLI-verktøy fra jobbkø-handlere.
//
// Mønsteret: maskinrommet orkestrerer (payload-parsing, sikkerhetskontroller),
// CLI-verktøyet gjør jobben (API-kall, DB-skriving, prosessering).
// Stdout → jobbresultat (JSON), stderr → feillogg, exitkode → status.
//
// Ref: docs/retninger/unix_filosofi.md
use std::process::Stdio;
/// Kjør et CLI-verktøy og returner stdout som JSON.
///
/// - `bin_name`: Verktøynavn for logging (f.eks. "synops-tts")
/// - `cmd`: Ferdig konfigurert Command med args og env
///
/// Stderr logges. Non-zero exit code gir Err med stderr-innhold.
pub async fn run_cli_tool(
bin_name: &str,
cmd: &mut tokio::process::Command,
) -> Result<serde_json::Value, String> {
cmd.stdout(Stdio::piped()).stderr(Stdio::piped());
let child = cmd
.spawn()
.map_err(|e| format!("Kunne ikke starte {bin_name}: {e}"))?;
let output = child
.wait_with_output()
.await
.map_err(|e| format!("Feil ved kjøring av {bin_name}: {e}"))?;
let stderr = String::from_utf8_lossy(&output.stderr);
if !stderr.is_empty() {
tracing::info!(stderr = %stderr, "{bin_name} stderr");
}
if !output.status.success() {
let code = output.status.code().unwrap_or(-1);
return Err(format!(
"{bin_name} feilet (exit {code}): {stderr}"
));
}
let stdout = String::from_utf8_lossy(&output.stdout);
serde_json::from_str(&stdout)
.map_err(|e| format!("Kunne ikke parse {bin_name} output: {e}"))
}
/// Videresend en miljøvariabel til en Command hvis den er satt.
pub fn forward_env(cmd: &mut tokio::process::Command, key: &str) {
if let Ok(v) = std::env::var(key) {
cmd.env(key, v);
}
}
/// Sett DATABASE_URL på en Command. Feiler hvis variabelen mangler.
pub fn set_database_url(cmd: &mut tokio::process::Command) -> Result<(), String> {
let db_url = std::env::var("DATABASE_URL")
.map_err(|_| "DATABASE_URL ikke satt".to_string())?;
cmd.env("DATABASE_URL", &db_url);
Ok(())
}