Initial
This commit is contained in:
84
server/models/hostModel.js
Normal file
84
server/models/hostModel.js
Normal file
@@ -0,0 +1,84 @@
|
||||
import { db, id, json, now, parseJson, visibleClause } from '../db.js';
|
||||
import { camelHost } from './mappers.js';
|
||||
|
||||
export function listHosts(userId) {
|
||||
return db.prepare(`
|
||||
SELECT h.*, c.name AS credential_name, g.name AS group_name
|
||||
FROM hosts h
|
||||
LEFT JOIN credentials c ON c.id = h.credential_id
|
||||
LEFT JOIN groups g ON g.id = h.group_id
|
||||
WHERE ${visibleClause('h')}
|
||||
ORDER BY h.name
|
||||
`).all(userId, userId).map(camelHost);
|
||||
}
|
||||
|
||||
function scopedGroupId(payload) {
|
||||
return payload.visibility === 'group' ? payload.groupId || null : null;
|
||||
}
|
||||
|
||||
export function createHost(payload, userId) {
|
||||
const hostId = id('hst');
|
||||
db.prepare(`
|
||||
INSERT INTO hosts (id, name, fqdn, address, os_family, transport, port, credential_id, tags, notes,
|
||||
visibility, owner_user_id, group_id, created_at, updated_at)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||
`).run(
|
||||
hostId,
|
||||
payload.name,
|
||||
payload.fqdn || '',
|
||||
payload.address,
|
||||
payload.osFamily,
|
||||
payload.transport,
|
||||
payload.port || null,
|
||||
payload.credentialId || null,
|
||||
json(payload.tags),
|
||||
payload.notes || '',
|
||||
payload.visibility || 'shared',
|
||||
userId,
|
||||
scopedGroupId(payload),
|
||||
now(),
|
||||
now()
|
||||
);
|
||||
return camelHost(db.prepare('SELECT * FROM hosts WHERE id = ?').get(hostId));
|
||||
}
|
||||
|
||||
export function updateHost(hostId, payload, userId) {
|
||||
const existing = db.prepare(`SELECT * FROM hosts WHERE id = ? AND ${visibleClause()}`).get(hostId, userId, userId);
|
||||
if (!existing) return null;
|
||||
const visibility = payload.visibility || existing.visibility;
|
||||
db.prepare(`
|
||||
UPDATE hosts
|
||||
SET name = ?, fqdn = ?, address = ?, os_family = ?, transport = ?, port = ?, credential_id = ?,
|
||||
tags = ?, notes = ?, visibility = ?, group_id = ?, updated_at = ?
|
||||
WHERE id = ?
|
||||
`).run(
|
||||
payload.name || existing.name,
|
||||
payload.fqdn ?? existing.fqdn,
|
||||
payload.address || existing.address,
|
||||
payload.osFamily || existing.os_family,
|
||||
payload.transport || existing.transport,
|
||||
payload.port ?? existing.port,
|
||||
payload.credentialId ?? existing.credential_id,
|
||||
json(payload.tags ?? parseJson(existing.tags)),
|
||||
payload.notes ?? existing.notes,
|
||||
visibility,
|
||||
visibility === 'group' ? (payload.groupId ?? existing.group_id) : null,
|
||||
now(),
|
||||
hostId
|
||||
);
|
||||
return camelHost(db.prepare('SELECT * FROM hosts WHERE id = ?').get(hostId));
|
||||
}
|
||||
|
||||
export function deleteHost(hostId, userId) {
|
||||
db.prepare(`DELETE FROM hosts WHERE id = ? AND ${visibleClause()}`).run(hostId, userId, userId);
|
||||
}
|
||||
|
||||
// Return only the host IDs from the requested set that are visible to the user.
|
||||
// Used to stop a RunPlan from targeting hosts the operator cannot see.
|
||||
export function filterVisibleHostIds(hostIds = [], userId) {
|
||||
if (!hostIds.length) return [];
|
||||
const visible = new Set(
|
||||
db.prepare(`SELECT id FROM hosts WHERE ${visibleClause()}`).all(userId, userId).map((row) => row.id)
|
||||
);
|
||||
return hostIds.filter((hostId) => visible.has(hostId));
|
||||
}
|
||||
Reference in New Issue
Block a user