/home/techb158/trellopowerup.abdallabala.com/src
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
};
}