This commit is contained in:
2026-06-25 14:43:13 -05:00
parent 6f77fac58e
commit aaa6a9ee26
25 changed files with 1542 additions and 67 deletions

View File

@@ -2,11 +2,20 @@ import { db, id, now, visibleClause } from '../db.js';
import { normalizeRunPlanPayload } from '../forms/schemas.js';
import { camelRunPlan } from './mappers.js';
import { filterVisibleHostIds } from './hostModel.js';
import { filterVisibleHostGroupIds } from './hostGroupModel.js';
export function listRunPlans(userId) {
return db.prepare(`
SELECT r.*, s.name AS script_name, g.name AS group_name,
(SELECT COUNT(*) FROM runplan_hosts rh WHERE rh.runplan_id = r.id) AS host_count
(SELECT COUNT(DISTINCT host_id) FROM (
SELECT rh.host_id AS host_id FROM runplan_hosts rh WHERE rh.runplan_id = r.id
UNION
SELECT hgm.host_id AS host_id
FROM runplan_host_groups rhg
JOIN host_group_members hgm ON hgm.host_group_id = rhg.host_group_id
WHERE rhg.runplan_id = r.id
)) AS host_count,
(SELECT COUNT(*) FROM runplan_host_groups rhg WHERE rhg.runplan_id = r.id) AS host_group_count
FROM runplans r
JOIN scripts s ON s.id = r.script_id
LEFT JOIN groups g ON g.id = r.group_id
@@ -23,13 +32,22 @@ export function createRunPlan(body, userId) {
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`).run(runplanId, payload.name, payload.description, payload.scriptId, payload.visibility, userId, payload.groupId, payload.parallel ? 1 : 0, now(), now());
replaceRunPlanHosts(runplanId, filterVisibleHostIds(payload.hostIds, userId));
replaceRunPlanHostGroups(runplanId, filterVisibleHostGroupIds(payload.hostGroupIds, userId));
return loadRunPlan(runplanId);
}
export function loadRunPlan(runplanId) {
const runplan = db.prepare(`
SELECT r.*, s.name AS script_name, g.name AS group_name,
(SELECT COUNT(*) FROM runplan_hosts rh WHERE rh.runplan_id = r.id) AS host_count
(SELECT COUNT(DISTINCT host_id) FROM (
SELECT rh.host_id AS host_id FROM runplan_hosts rh WHERE rh.runplan_id = r.id
UNION
SELECT hgm.host_id AS host_id
FROM runplan_host_groups rhg
JOIN host_group_members hgm ON hgm.host_group_id = rhg.host_group_id
WHERE rhg.runplan_id = r.id
)) AS host_count,
(SELECT COUNT(*) FROM runplan_host_groups rhg WHERE rhg.runplan_id = r.id) AS host_group_count
FROM runplans r
JOIN scripts s ON s.id = r.script_id
LEFT JOIN groups g ON g.id = r.group_id
@@ -37,7 +55,8 @@ export function loadRunPlan(runplanId) {
`).get(runplanId);
if (!runplan) return null;
const hostIds = db.prepare('SELECT host_id FROM runplan_hosts WHERE runplan_id = ? ORDER BY host_id').all(runplanId).map((row) => row.host_id);
return { ...camelRunPlan(runplan), hostIds };
const hostGroupIds = db.prepare('SELECT host_group_id FROM runplan_host_groups WHERE runplan_id = ? ORDER BY host_group_id').all(runplanId).map((row) => row.host_group_id);
return { ...camelRunPlan(runplan), hostIds, hostGroupIds };
}
export function loadVisibleRunPlan(runplanId, userId) {
@@ -48,12 +67,13 @@ export function loadVisibleRunPlan(runplanId, userId) {
export function updateRunPlan(runplanId, body, userId) {
const existing = db.prepare(`SELECT * FROM runplans WHERE id = ? AND ${visibleClause()}`).get(runplanId, userId, userId);
if (!existing) return null;
const payload = normalizeRunPlanPayload({ ...existing, ...body, hostIds: body.hostIds || undefined });
const payload = normalizeRunPlanPayload({ ...existing, ...body, hostIds: body.hostIds || undefined, hostGroupIds: body.hostGroupIds || undefined });
db.prepare(`
UPDATE runplans SET name = ?, description = ?, script_id = ?, visibility = ?, group_id = ?, parallel = ?, updated_at = ?
WHERE id = ?
`).run(payload.name, payload.description, payload.scriptId, payload.visibility, payload.groupId, payload.parallel ? 1 : 0, now(), runplanId);
if (body.hostIds) replaceRunPlanHosts(runplanId, filterVisibleHostIds(payload.hostIds, userId));
if (body.hostGroupIds) replaceRunPlanHostGroups(runplanId, filterVisibleHostGroupIds(payload.hostGroupIds, userId));
return loadRunPlan(runplanId);
}
@@ -66,3 +86,9 @@ function replaceRunPlanHosts(runplanId, hostIds) {
const stmt = db.prepare('INSERT OR IGNORE INTO runplan_hosts (runplan_id, host_id) VALUES (?, ?)');
for (const hostId of hostIds) stmt.run(runplanId, hostId);
}
function replaceRunPlanHostGroups(runplanId, hostGroupIds) {
db.prepare('DELETE FROM runplan_host_groups WHERE runplan_id = ?').run(runplanId);
const stmt = db.prepare('INSERT OR IGNORE INTO runplan_host_groups (runplan_id, host_group_id) VALUES (?, ?)');
for (const groupId of hostGroupIds) stmt.run(runplanId, groupId);
}