feat(#2591): add GET /api/build-log/<node_id> {,/raw} query endpoints

The raw-graph wire drops the inline build_log_id; the client fetches a
node's captured output on demand. Two handlers resolve node id -> log-row
id (JobQueue::build_log_id_of, now keyed by the wire u64) then delegate to
the existing get_full / raw handlers: /api/build-log/<node_id> serves the
BuildLogFull JSON ({stdout, stderr} + header), /raw serves text/plain.
404 when the node has no linked log.
This commit is contained in:
atlas 2026-07-23 15:24:04 +02:00 committed by mara
commit 52dd9ede23
4 changed files with 55 additions and 7 deletions

View file

@ -511,15 +511,19 @@ impl JobQueue {
true
}
/// The `build_logs` row id linked to `node_id`, if any — the lookup behind
/// the `GET /api/build-log/<node_id>` query endpoint (the client fetches a
/// node's captured build output on demand rather than receiving it inline).
/// The `build_logs` row id linked to the wire node id `node_id`, if any —
/// the lookup behind the `GET /api/build-log/<node_id>` query endpoint (the
/// client fetches a node's captured build output on demand rather than
/// receiving it inline). Takes the raw wire `u64` (the endpoint's path
/// param); `node_rt` is keyed by the opaque `NodeId`, so this scans for the
/// matching id — the map is small (live + recently-terminal nodes).
#[must_use]
pub fn build_log_id_of(&self, node_id: NodeId) -> Option<i64> {
pub fn build_log_id_of(&self, node_id: u64) -> Option<i64> {
self.lock()
.node_rt
.get(&node_id)
.and_then(|r| r.build_log_id)
.iter()
.find(|(nid, _)| nid.get() == node_id)
.and_then(|(_, rt)| rt.build_log_id)
}
/// A DAG's terminal roll-up summary, computed on demand from its container.

View file

@ -896,7 +896,7 @@ fn set_build_log_id_links_running_node() {
// The log id is fetched by node id (the `GET /api/build-log/<id>` lookup),
// not carried on the wire — it survives completion in the node runtime.
assert_eq!(
q.build_log_id_of(c.node_id),
q.build_log_id_of(c.node_id.get()),
Some(43),
"log id survives completion"
);