/home/techb158/trellopowerup.abdallabala.com/src
NameSizeModeActions
assessmentAnalytics.js71440644editdlrm
riskEngine.js57560644editdlrm
server.js70790644editdlrm
store.js35450644editdlrm
Edit: /home/techb158/trellopowerup.abdallabala.com/src/store.js (3545B)
import fs from 'node:fs'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { v4 as uuidv4 } from 'uuid'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const defaultStoreFile = path.join(__dirname, '..', 'data', 'store.json'); const storeFile = process.env.COSMIC_STORE_FILE || defaultStoreFile; const boards = new Map(); const cards = new Map(); const assessments = new Map(); function ensureStoreDirectory() { fs.mkdirSync(path.dirname(storeFile), { recursive: true }); } function mapValues(map) { return [...map.values()]; } function loadCollection(map, values = []) { for (const item of values) { const id = item.id || item.boardId || item.cardId; if (id) map.set(id, item); } } function loadStore() { if (!fs.existsSync(storeFile)) return; try { const data = JSON.parse(fs.readFileSync(storeFile, 'utf8')); loadCollection(boards, data.boards); loadCollection(cards, data.cards); loadCollection(assessments, data.assessments); } catch (error) { console.warn(`COSMIC store could not be loaded from ${storeFile}:`, error.message); } } function persistStore() { ensureStoreDirectory(); const payload = { version: 1, updatedAt: new Date().toISOString(), boards: mapValues(boards), cards: mapValues(cards), assessments: mapValues(assessments) }; const tempFile = `${storeFile}.${process.pid}.${Date.now()}.tmp`; fs.writeFileSync(tempFile, `${JSON.stringify(payload, null, 2)}\n`); fs.renameSync(tempFile, storeFile); } loadStore(); export function upsertBoard(boardId, data) { const current = boards.get(boardId) || { boardId, createdAt: new Date().toISOString() }; const next = { ...current, ...data, boardId, updatedAt: new Date().toISOString() }; boards.set(boardId, next); persistStore(); return next; } export function upsertCard(cardId, data) { const current = cards.get(cardId) || { cardId, createdAt: new Date().toISOString() }; const next = { ...current, ...data, cardId, updatedAt: new Date().toISOString() }; cards.set(cardId, next); persistStore(); return next; } export function saveAssessment(data) { const id = data.id || uuidv4(); const assessment = { id, ...data, createdAt: data.createdAt || new Date().toISOString(), updatedAt: new Date().toISOString() }; assessments.set(id, assessment); persistStore(); return assessment; } function newestFirst(items) { return items.sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)); } export function listAssessmentsByBoard(boardId) { return newestFirst([...assessments.values()].filter((item) => item.boardId === boardId)); } export function listAssessmentsByCard(cardId) { return newestFirst([...assessments.values()].filter((item) => item.cardId === cardId)); } export function listAssessmentsByBoardCard(boardId, cardId) { return newestFirst([...assessments.values()].filter((item) => item.boardId === boardId && item.cardId === cardId)); } export function deleteAssessmentsByCard(boardId, cardId) { const matching = [...assessments.values()].filter((item) => item.boardId === boardId && item.cardId === cardId); for (const item of matching) { assessments.delete(item.id); } if (matching.length) persistStore(); return { deleted: matching.length }; } export function getStoreInfo() { return { mode: 'json-file', file: storeFile, boards: boards.size, cards: cards.size, assessments: assessments.size }; }