Files
skipper/shared/resources.js
2026-04-05 15:28:04 +02:00

95 lines
2.4 KiB
JavaScript

const path = require('path');
const { getResourceDir, resourceTypeToDirName } = require('./paths');
const { ensureDir, listJsonFiles, readJsonIfExists, writeJson } = require('./fs');
function resourcePath(resourceType, resourceId) {
return path.join(getResourceDir(resourceType), `${resourceId}.json`);
}
function nowIso() {
return new Date().toISOString();
}
function createResourceDocument({
id,
resource_type,
desired_state,
current_state,
last_applied_state,
metadata,
created_at,
updated_at,
}) {
const timestamp = nowIso();
return {
id,
resource_type,
schema_version: 'v1',
desired_state: desired_state || {},
current_state: current_state || {},
last_applied_state: last_applied_state || {},
metadata: metadata || {},
created_at: created_at || timestamp,
updated_at: updated_at || timestamp,
};
}
async function getResource(resourceType, resourceId) {
return readJsonIfExists(resourcePath(resourceType, resourceId));
}
async function saveResource(document) {
const existing = await getResource(document.resource_type, document.id);
const next = createResourceDocument({
...document,
created_at: existing ? existing.created_at : document.created_at,
updated_at: nowIso(),
});
await writeJson(resourcePath(next.resource_type, next.id), next);
return next;
}
async function patchResourceState(resourceType, resourceId, patch) {
const existing = await getResource(resourceType, resourceId);
if (!existing) {
return null;
}
return saveResource({
...existing,
desired_state: patch.desired_state || existing.desired_state,
current_state: patch.current_state || existing.current_state,
last_applied_state: patch.last_applied_state || existing.last_applied_state,
metadata: patch.metadata || existing.metadata,
});
}
async function listResources(resourceType) {
const files = await listJsonFiles(getResourceDir(resourceType));
return Promise.all(files.map((filePath) => readJsonIfExists(filePath)));
}
async function listAllResources() {
const result = {};
for (const resourceType of Object.keys(resourceTypeToDirName)) {
await ensureDir(getResourceDir(resourceType));
result[resourceType] = await listResources(resourceType);
}
return result;
}
module.exports = {
createResourceDocument,
getResource,
saveResource,
patchResourceState,
listResources,
listAllResources,
};