release: v1.33.0 - Directory Key Badges, Discovered Inventory Merge/Ignore & Desktop Operations

This commit is contained in:
2026-08-08 18:12:37 -04:00
parent fc9952add3
commit 620f401091
5 changed files with 246 additions and 26 deletions
+57
View File
@@ -799,4 +799,61 @@ router.get('/resources/:id/driver-logs', async (req, res, next) => {
} catch (err) { next(err); }
});
// ── Discovered Inventory Operations (Merge & Ignore) ───────────────────────
router.post('/discovered/ignore', async (req, res, next) => {
try {
const { resourceId } = req.body;
if (!resourceId) return res.status(400).json({ status: 'error', message: 'resourceId is required' });
const r = await Resource.get(resourceId);
if (!r) return res.status(404).json({ status: 'error', message: 'resource not found' });
r.metadata = r.metadata || {};
r.metadata.ignored = true;
await r.save();
res.json({ status: 'ok', resourceId: r.id, ignored: true });
} catch (err) { next(err); }
});
router.post('/discovered/merge', async (req, res, next) => {
try {
const { discoveredId, targetId } = req.body;
if (!discoveredId || !targetId) {
return res.status(400).json({ status: 'error', message: 'discoveredId and targetId are required' });
}
const disc = await Resource.get(discoveredId);
const target = await Resource.get(targetId);
if (!disc || !target) {
return res.status(404).json({ status: 'error', message: 'Discovered or Target resource not found' });
}
// Merge metadata (interfaces, discovery sources, OS details)
target.metadata = target.metadata || {};
disc.metadata = disc.metadata || {};
const sources = new Set([...(target.metadata.discovery_sources || []), ...(disc.metadata.discovery_sources || [])]);
target.metadata.discovery_sources = Array.from(sources);
if (disc.metadata.interfaces) {
const existingInterfaces = target.metadata.interfaces || [];
const macs = new Set(existingInterfaces.map(i => i.mac).filter(Boolean));
for (const iface of disc.metadata.interfaces) {
if (!iface.mac || !macs.has(iface.mac)) {
existingInterfaces.push(iface);
}
}
target.metadata.interfaces = existingInterfaces;
}
if (disc.metadata.os) target.metadata.os = target.metadata.os || disc.metadata.os;
if (disc.metadata.kernel) target.metadata.kernel = target.metadata.kernel || disc.metadata.kernel;
await target.save();
// Remove or mark discovered record as merged
await disc.delete();
res.json({ status: 'ok', mergedTargetId: target.id, targetName: target.name });
} catch (err) { next(err); }
});
module.exports = router;