- New panel below Archer tickets showing workflow count and list - Backend proxies platform4.risksense.com workflowBatch/search via x-api-key - SQLite cache table (ivanti_sync_state) stores latest sync result - Auto-syncs on server startup if >24h stale, then every 24h via setInterval - POST /api/ivanti/workflows/sync for on-demand sync with spinner feedback - GET /api/ivanti/workflows returns cached data instantly (no live API call) - Displays id.value, name, currentState, type, createdOn per workflow - Shows last-synced timestamp and error messages inline - IVANTI_SKIP_TLS flag for Charter SSL proxy environments Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
38 lines
1.1 KiB
JavaScript
38 lines
1.1 KiB
JavaScript
// Migration: Add ivanti_sync_state table
|
|
const sqlite3 = require('sqlite3').verbose();
|
|
const path = require('path');
|
|
|
|
const dbPath = path.join(__dirname, '..', 'cve_database.db');
|
|
const db = new sqlite3.Database(dbPath);
|
|
|
|
console.log('Starting Ivanti sync state migration...');
|
|
|
|
db.serialize(() => {
|
|
db.run(`
|
|
CREATE TABLE IF NOT EXISTS ivanti_sync_state (
|
|
id INTEGER PRIMARY KEY CHECK (id = 1),
|
|
total INTEGER DEFAULT 0,
|
|
workflows_json TEXT DEFAULT '[]',
|
|
synced_at DATETIME,
|
|
sync_status TEXT DEFAULT 'never',
|
|
error_message TEXT
|
|
)
|
|
`, (err) => {
|
|
if (err) console.error('Error creating table:', err);
|
|
else console.log('✓ ivanti_sync_state table created');
|
|
});
|
|
|
|
// Seed the single-row state record
|
|
db.run(`
|
|
INSERT OR IGNORE INTO ivanti_sync_state (id, total, workflows_json, sync_status)
|
|
VALUES (1, 0, '[]', 'never')
|
|
`, (err) => {
|
|
if (err) console.error('Error seeding state row:', err);
|
|
else console.log('✓ ivanti_sync_state row seeded');
|
|
});
|
|
});
|
|
|
|
db.close(() => {
|
|
console.log('Migration complete!');
|
|
});
|