Files
poshmanager/server/models/libraryModel.js
2026-06-25 12:05:53 -05:00

159 lines
6.0 KiB
JavaScript

import { db, id, now, visibleClause } from '../db.js';
import { camelFolder, camelIntuneDeployment, camelRunPlan, camelScript } from './mappers.js';
import { normalizeScriptPayload } from '../forms/schemas.js';
export function listFolders(userId) {
return db.prepare(`SELECT * FROM folders WHERE ${visibleClause()} ORDER BY name`).all(userId, userId).map(camelFolder);
}
export function createFolder(payload, userId) {
const folderId = id('fld');
db.prepare(`
INSERT INTO folders (id, parent_id, name, visibility, owner_user_id, group_id, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)
`).run(
folderId,
payload.parentId || null,
payload.name,
payload.visibility,
userId,
payload.groupId || null,
now(),
now()
);
return camelFolder(db.prepare('SELECT * FROM folders WHERE id = ?').get(folderId));
}
export function updateFolder(folderId, payload, userId) {
const existing = db.prepare(`SELECT * FROM folders WHERE id = ? AND ${visibleClause()}`).get(folderId, userId, userId);
if (!existing) return null;
db.prepare(`
UPDATE folders SET parent_id = ?, name = ?, visibility = ?, group_id = ?, updated_at = ? WHERE id = ?
`).run(
payload.parentId ?? existing.parent_id,
payload.name || existing.name,
payload.visibility || existing.visibility,
payload.groupId ?? existing.group_id,
now(),
folderId
);
return camelFolder(db.prepare('SELECT * FROM folders WHERE id = ?').get(folderId));
}
export function deleteFolder(folderId, userId) {
db.prepare(`DELETE FROM folders WHERE id = ? AND ${visibleClause()}`).run(folderId, userId, userId);
}
export function listScripts(userId) {
return db.prepare(`
SELECT s.*, f.name AS folder_name, g.name AS group_name
FROM scripts s
LEFT JOIN folders f ON f.id = s.folder_id
LEFT JOIN groups g ON g.id = s.group_id
WHERE ${visibleClause('s')}
ORDER BY s.name
`).all(userId, userId).map(camelScript);
}
export function createScript(body, userId) {
const payload = normalizeScriptPayload(body);
const scriptId = id('scr');
db.prepare(`
INSERT INTO scripts (id, folder_id, name, description, content, visibility, owner_user_id, group_id, version, created_at, updated_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1, ?, ?)
`).run(scriptId, payload.folderId, payload.name, payload.description, payload.content, payload.visibility, userId, payload.groupId, now(), now());
db.prepare('INSERT INTO script_versions (id, script_id, version, content, created_by, created_at) VALUES (?, ?, 1, ?, ?, ?)').run(
id('ver'),
scriptId,
payload.content,
userId,
now()
);
return camelScript(db.prepare('SELECT * FROM scripts WHERE id = ?').get(scriptId));
}
export function cloneScript(scriptId, body, userId) {
const existing = getScript(scriptId, userId);
if (!existing) return null;
return createScript({
folderId: existing.folderId,
name: body.name || cloneName(existing.name),
description: body.description ?? existing.description ?? '',
content: existing.content,
visibility: existing.visibility,
groupId: existing.groupId
}, userId);
}
export function getScript(scriptId, userId) {
const row = db.prepare(`SELECT * FROM scripts WHERE id = ? AND ${visibleClause()}`).get(scriptId, userId, userId);
return row ? camelScript(row) : null;
}
export function updateScript(scriptId, body, userId) {
const existing = db.prepare(`SELECT * FROM scripts WHERE id = ? AND ${visibleClause()}`).get(scriptId, userId, userId);
if (!existing) return null;
const payload = normalizeScriptPayload({ ...existing, ...body });
const version = Number(existing.version) + 1;
db.prepare(`
UPDATE scripts
SET folder_id = ?, name = ?, description = ?, content = ?, visibility = ?, group_id = ?, version = ?, updated_at = ?
WHERE id = ?
`).run(payload.folderId, payload.name, payload.description, payload.content, payload.visibility, payload.groupId, version, now(), scriptId);
db.prepare('INSERT INTO script_versions (id, script_id, version, content, created_by, created_at) VALUES (?, ?, ?, ?, ?, ?)').run(
id('ver'),
scriptId,
version,
payload.content,
userId,
now()
);
return camelScript(db.prepare('SELECT * FROM scripts WHERE id = ?').get(scriptId));
}
export function deleteScript(scriptId, userId) {
db.prepare(`DELETE FROM scripts WHERE id = ? AND ${visibleClause()}`).run(scriptId, userId, userId);
}
export function scriptUsage(scriptId, userId) {
const script = getScript(scriptId, userId);
if (!script) return null;
const runplans = 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
FROM runplans r
JOIN scripts s ON s.id = r.script_id
LEFT JOIN groups g ON g.id = r.group_id
WHERE r.script_id = ? AND ${visibleClause('r')}
ORDER BY r.updated_at DESC
`).all(scriptId, userId, userId).map(camelRunPlan);
const intuneDeployments = db.prepare(`
SELECT d.*, p.name AS profile_name, s.name AS script_name, g.name AS group_name
FROM intune_deployments d
LEFT JOIN psadt_profiles p ON p.id = d.profile_id
LEFT JOIN scripts s ON s.id = d.script_id
LEFT JOIN groups g ON g.id = d.group_id
WHERE d.script_id = ? AND ${visibleClause('d')}
ORDER BY d.updated_at DESC
`).all(scriptId, userId, userId).map(camelIntuneDeployment);
return {
script,
runplans,
intuneDeployments,
total: runplans.length + intuneDeployments.length
};
}
export function listScriptVersions(scriptId, userId) {
const script = db.prepare(`SELECT id FROM scripts WHERE id = ? AND ${visibleClause()}`).get(scriptId, userId, userId);
if (!script) return null;
return db.prepare('SELECT * FROM script_versions WHERE script_id = ? ORDER BY version DESC').all(scriptId);
}
function cloneName(name = 'Untitled Script.ps1') {
const match = String(name).match(/^(.*?)(\.[^.]+)?$/);
const base = match?.[1] || name;
const extension = match?.[2] || '';
return `${base} copy${extension}`;
}