From 28714eed473559ab54530946c72d93169b4daa50 Mon Sep 17 00:00:00 2001 From: Jordan Ramos Date: Tue, 16 Jun 2026 16:10:54 -0600 Subject: [PATCH] Cache plan IDs from Atlas create responses Single-host PUT and bulk POST now extract and store the action_plan_id from the Atlas API response in the local cache. Previously only a stub with plan_type/commit_date was now the actual plan ID iscached included so it can be referenced for updates/display without re-fetching from Atlas. --- backend/routes/atlas.js | 61 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/backend/routes/atlas.js b/backend/routes/atlas.js index 0417e6a..91a176f 100644 --- a/backend/routes/atlas.js +++ b/backend/routes/atlas.js @@ -472,6 +472,45 @@ function createAtlasRouter() { if (result.status >= 200 && result.status < 300) { let body; try { body = JSON.parse(result.body); } catch (e) { body = result.body; } + + // Update local cache with the created plan + try { + const { rows: existingRows } = await pool.query( + `SELECT plan_count, plans_json FROM atlas_action_plans_cache WHERE host_id = $1`, + [hostId] + ); + const existing = existingRows[0]; + let existingPlans = []; + if (existing && existing.plans_json) { + try { existingPlans = JSON.parse(existing.plans_json); } catch (_) {} + } + + // Include the plan ID from Atlas response if available + const newPlan = { + plan_type, + commit_date, + source: 'create', + created_at: new Date().toISOString(), + ...(body?.action_plan_id ? { action_plan_id: body.action_plan_id } : {}), + ...(body?.id ? { action_plan_id: body.id } : {}), + }; + const updatedPlans = [...existingPlans, newPlan]; + + await pool.query( + `INSERT INTO atlas_action_plans_cache (host_id, has_action_plan, plan_count, plans_json, atlas_known, synced_at) + VALUES ($1, true, $2, $3, true, NOW()) + ON CONFLICT(host_id) DO UPDATE SET + has_action_plan = true, + plan_count = EXCLUDED.plan_count, + plans_json = EXCLUDED.plans_json, + atlas_known = true, + synced_at = EXCLUDED.synced_at`, + [hostId, updatedPlans.length, JSON.stringify(updatedPlans)] + ); + } catch (cacheErr) { + console.error('[Atlas] Cache update failed after plan create for host', hostId, ':', cacheErr.message); + } + res.status(result.status).json(body); } else { let errorBody; @@ -603,7 +642,27 @@ function createAtlasRouter() { try { existingPlans = JSON.parse(existing.plans_json); } catch (_) {} } - const stubPlan = { plan_type, commit_date, source: 'bulk-create', created_at: new Date().toISOString() }; + // Extract plan ID from bulk response if available (keyed by host_id) + let planId = null; + if (body && typeof body === 'object') { + // Response may be { results: [{host_id, action_plan_id}] } or { [hostId]: {id} } + if (Array.isArray(body.results)) { + const match = body.results.find(r => r.host_id === hid || r.host_id === String(hid)); + if (match) planId = match.action_plan_id || match.id; + } else if (body[hid]) { + planId = body[hid].action_plan_id || body[hid].id; + } else if (body[String(hid)]) { + planId = body[String(hid)].action_plan_id || body[String(hid)].id; + } + } + + const stubPlan = { + plan_type, + commit_date, + source: 'bulk-create', + created_at: new Date().toISOString(), + ...(planId ? { action_plan_id: planId } : {}), + }; const updatedPlans = [...existingPlans, stubPlan]; const newCount = updatedPlans.length;