111 lines
3.8 KiB
JavaScript
111 lines
3.8 KiB
JavaScript
import { folderSchema, scriptCompatibilitySchema, scriptTestRunSchema } from '../forms/schemas.js';
|
|
import {
|
|
cloneScript,
|
|
createFolder,
|
|
createScript,
|
|
deleteFolder,
|
|
deleteScript,
|
|
getScript,
|
|
listFolders,
|
|
listScripts,
|
|
listScriptVersions,
|
|
scriptUsage,
|
|
updateFolder,
|
|
updateScript
|
|
} from '../models/libraryModel.js';
|
|
import { camelJob } from '../models/mappers.js';
|
|
import { executeScriptTest } from '../services/powershellRunner.js';
|
|
import { analyzeScriptTargetCompatibility } from '../services/powershellCompatibilityService.js';
|
|
|
|
export function folders(req, res) {
|
|
res.json(listFolders(req.user.id));
|
|
}
|
|
|
|
export function createFolderAction(req, res) {
|
|
const parsed = folderSchema.safeParse(req.body);
|
|
if (!parsed.success) return res.status(400).json({ error: 'Invalid folder payload' });
|
|
res.status(201).json(createFolder(parsed.data, req.user.id));
|
|
}
|
|
|
|
export function updateFolderAction(req, res) {
|
|
const folder = updateFolder(req.params.id, req.body, req.user.id);
|
|
if (!folder) return res.status(404).json({ error: 'Folder not found' });
|
|
res.json(folder);
|
|
}
|
|
|
|
export function deleteFolderAction(req, res) {
|
|
deleteFolder(req.params.id, req.user.id);
|
|
res.status(204).end();
|
|
}
|
|
|
|
export function scripts(req, res) {
|
|
res.json(listScripts(req.user.id));
|
|
}
|
|
|
|
export function createScriptAction(req, res) {
|
|
// Model normalization creates the script row and initial version in one backend transaction path.
|
|
res.status(201).json(createScript(req.body, req.user.id));
|
|
}
|
|
|
|
export function cloneScriptAction(req, res) {
|
|
const script = cloneScript(req.params.id, req.body || {}, req.user.id);
|
|
if (!script) return res.status(404).json({ error: 'Script not found' });
|
|
res.status(201).json(script);
|
|
}
|
|
|
|
export function getScriptAction(req, res) {
|
|
const script = getScript(req.params.id, req.user.id);
|
|
if (!script) return res.status(404).json({ error: 'Script not found' });
|
|
res.json(script);
|
|
}
|
|
|
|
export function updateScriptAction(req, res) {
|
|
// Updating script content also appends a version record for audit and recovery.
|
|
const script = updateScript(req.params.id, req.body, req.user.id);
|
|
if (!script) return res.status(404).json({ error: 'Script not found' });
|
|
res.json(script);
|
|
}
|
|
|
|
export function deleteScriptAction(req, res) {
|
|
const usage = scriptUsage(req.params.id, req.user.id);
|
|
if (!usage) return res.status(404).json({ error: 'Script not found' });
|
|
if (usage.total && req.query.force !== 'true') {
|
|
return res.status(409).json({
|
|
error: 'Script is assigned to RunPlans or Intune deployments. Confirm deletion with force=true.',
|
|
usage
|
|
});
|
|
}
|
|
deleteScript(req.params.id, req.user.id);
|
|
res.status(204).end();
|
|
}
|
|
|
|
export function scriptUsageAction(req, res) {
|
|
const usage = scriptUsage(req.params.id, req.user.id);
|
|
if (!usage) return res.status(404).json({ error: 'Script not found' });
|
|
res.json(usage);
|
|
}
|
|
|
|
export function scriptCompatibilityAction(req, res) {
|
|
const parsed = scriptCompatibilitySchema.safeParse(req.body);
|
|
if (!parsed.success) return res.status(400).json({ error: 'Invalid compatibility payload' });
|
|
const result = analyzeScriptTargetCompatibility(req.params.id, parsed.data, req.user.id);
|
|
if (!result) return res.status(404).json({ error: 'Script not found' });
|
|
res.json(result);
|
|
}
|
|
|
|
export function testRunScriptAction(req, res) {
|
|
const parsed = scriptTestRunSchema.safeParse(req.body);
|
|
if (!parsed.success) return res.status(400).json({ error: 'Invalid test run payload' });
|
|
try {
|
|
res.status(202).json(camelJob(executeScriptTest(req.params.id, parsed.data, req.user.id)));
|
|
} catch (error) {
|
|
res.status(400).json({ error: error.message });
|
|
}
|
|
}
|
|
|
|
export function scriptVersions(req, res) {
|
|
const versions = listScriptVersions(req.params.id, req.user.id);
|
|
if (!versions) return res.status(404).json({ error: 'Script not found' });
|
|
res.json(versions);
|
|
}
|