90 lines
3.3 KiB
JavaScript
90 lines
3.3 KiB
JavaScript
import { db, id, now, visibleClause } from '../db.js';
|
|
|
|
function camelChangeRequest(row) {
|
|
if (!row) return null;
|
|
return {
|
|
id: row.id,
|
|
deploymentId: row.deployment_id,
|
|
deploymentName: row.deployment_name || null,
|
|
connectionId: row.connection_id,
|
|
action: row.action,
|
|
status: row.status,
|
|
requestedBy: row.requested_by,
|
|
requesterEmail: row.requester_email || '',
|
|
approverUserId: row.approver_user_id,
|
|
approverEmail: row.approver_email || '',
|
|
reason: row.reason || '',
|
|
decidedAt: row.decided_at || '',
|
|
executedAt: row.executed_at || '',
|
|
createdAt: row.created_at,
|
|
updatedAt: row.updated_at
|
|
};
|
|
}
|
|
|
|
export function createChangeRequest({ deploymentId, connectionId, action, requestedBy, requesterEmail }) {
|
|
const requestId = id('chg');
|
|
db.prepare(`
|
|
INSERT INTO change_requests (id, deployment_id, connection_id, action, status, requested_by, requester_email, created_at, updated_at)
|
|
VALUES (?, ?, ?, ?, 'pending', ?, ?, ?, ?)
|
|
`).run(requestId, deploymentId, connectionId || null, action, requestedBy || null, requesterEmail || '', now(), now());
|
|
return camelChangeRequest(db.prepare('SELECT * FROM change_requests WHERE id = ?').get(requestId));
|
|
}
|
|
|
|
export function findApprovedRequest(deploymentId, action) {
|
|
const row = db.prepare(`
|
|
SELECT * FROM change_requests
|
|
WHERE deployment_id = ? AND action = ? AND status = 'approved'
|
|
ORDER BY decided_at DESC LIMIT 1
|
|
`).get(deploymentId, action);
|
|
return camelChangeRequest(row);
|
|
}
|
|
|
|
export function findPendingRequest(deploymentId, action) {
|
|
const row = db.prepare(`
|
|
SELECT * FROM change_requests
|
|
WHERE deployment_id = ? AND action = ? AND status = 'pending'
|
|
ORDER BY created_at DESC LIMIT 1
|
|
`).get(deploymentId, action);
|
|
return camelChangeRequest(row);
|
|
}
|
|
|
|
export function getChangeRequest(requestId) {
|
|
return camelChangeRequest(db.prepare('SELECT * FROM change_requests WHERE id = ?').get(requestId));
|
|
}
|
|
|
|
// Requests are scoped to deployments the user can see; admins see all.
|
|
export function listChangeRequests(userId, { status, isAdmin = false } = {}) {
|
|
const where = [];
|
|
const params = [];
|
|
if (!isAdmin) {
|
|
where.push(`d.id IS NOT NULL AND ${visibleClause('d')}`);
|
|
params.push(userId, userId);
|
|
}
|
|
if (status) { where.push('c.status = ?'); params.push(status); }
|
|
const clause = where.length ? `WHERE ${where.join(' AND ')}` : '';
|
|
return db.prepare(`
|
|
SELECT c.*, d.name AS deployment_name
|
|
FROM change_requests c
|
|
LEFT JOIN intune_deployments d ON d.id = c.deployment_id
|
|
${clause}
|
|
ORDER BY c.created_at DESC
|
|
LIMIT 200
|
|
`).all(...params).map(camelChangeRequest);
|
|
}
|
|
|
|
export function decideChangeRequest(requestId, { status, approverUserId, approverEmail, reason }) {
|
|
const existing = db.prepare('SELECT * FROM change_requests WHERE id = ?').get(requestId);
|
|
if (!existing || existing.status !== 'pending') return null;
|
|
db.prepare(`
|
|
UPDATE change_requests
|
|
SET status = ?, approver_user_id = ?, approver_email = ?, reason = ?, decided_at = ?, updated_at = ?
|
|
WHERE id = ?
|
|
`).run(status, approverUserId || null, approverEmail || '', reason || '', now(), now(), requestId);
|
|
return getChangeRequest(requestId);
|
|
}
|
|
|
|
export function markRequestExecuted(requestId) {
|
|
db.prepare(`UPDATE change_requests SET status = 'executed', executed_at = ?, updated_at = ? WHERE id = ?`)
|
|
.run(now(), now(), requestId);
|
|
}
|