dashboard: consolidate NodeView.has_log into build_log_id

Per mara's review on #2896: has_log: bool was fully redundant once
build_log_id: Option<i64> existed alongside it (has_log was always
just build_log_id.is_some()). Dropped has_log, threading the single
Option<i64> field through job_queue::mod.rs, the hivectl NodeView
test-helper literal, and the one remaining frontend consumer
(findLiveBuild's live-log-panel gate, which now checks
build_log_id != null instead of the separate bool).

Also fixed a now-stale doc comment on GET /api/build-log/{node_id}
that claimed the dashboard used on-demand node-id fetches "instead
of an inline build_log_id on the wire" -- no longer true after this
PR put one there for the BUILD L0GS deep-link.

cargo build/clippy/test clean across the three touched crates; nix
fmt clean; frontend build verified (0 has_log references, 3
build_log_id references in the built builds.js bundle).
This commit is contained in:
iris 2026-08-01 11:30:36 +02:00 committed by mara
commit 4c37ce9150
5 changed files with 13 additions and 18 deletions

View file

@ -130,9 +130,11 @@ pub(super) async fn get_build_log_full(
/// `GET /api/build-log/{node_id}` — the build log for a **queue node**,
/// resolved node id → log-row id → full log. Same `BuildLogFull` JSON
/// (`stdout` / `stderr` + header) as `get_build_log_full`; HTTP 404 when the
/// node has no linked log (the client gates the request on `NodeView.has_log`,
/// but a vacuum race can still 404). This is the on-demand log fetch the
/// raw-graph dashboard uses instead of an inline `build_log_id` on the wire.
/// node has no linked log (the client gates the request on
/// `NodeView.build_log_id`, but a vacuum race can still 404). This is the
/// on-demand live-log-panel fetch, distinct from the `build_log_id` on the
/// wire — that id is for deep-linking to the BUILD L0GS tab's full history
/// view, not for fetching the log content itself.
#[utoipa::path(
get,
path = "/api/build-log/{node_id}",

View file

@ -560,7 +560,6 @@ impl QueueInner {
Vec::new()
};
let build_log_id = self.node_rt.get(&id).and_then(|r| r.build_log_id);
let has_log = build_log_id.is_some();
// `node.parent` is the structural jobq parent. Top-level nodes
// have `parent == Some(container)` (direct children of the Dag
// container); those become `parent: None` on the wire since the
@ -581,7 +580,6 @@ impl QueueInner {
error: node.error.clone(),
approval_id,
inputs,
has_log,
build_log_id,
parent,
});