Files
memind/scripts/mindspace-rebuild-thumbnails.mjs
John 2e14873f2d Initial commit: Memind H5 portal with MindSpace, Plaza, and agent jobs.
Track application source and tests; exclude local env, user workspaces, and runtime data via .gitignore.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-15 15:04:43 -07:00

71 lines
2.5 KiB
JavaScript

#!/usr/bin/env node
import fs from 'node:fs/promises';
import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { loadH5Environment } from './load-env.mjs';
import { createDbPool } from '../db.mjs';
import {
ensureHtmlThumbnail,
pageThumbnailKey,
assetThumbnailKey,
} from '../mindspace-thumbnails.mjs';
const root = path.join(path.dirname(fileURLToPath(import.meta.url)), '..');
loadH5Environment(path.dirname(fileURLToPath(import.meta.url)));
const storageRoot = process.env.MINDSPACE_STORAGE_ROOT
? path.resolve(process.env.MINDSPACE_STORAGE_ROOT)
: path.join(root, 'data', 'mindspace');
async function rebuildPageThumbnails(pool) {
const [rows] = await pool.query(
`SELECT p.id AS page_id, p.user_id, p.title, p.summary, p.page_type, pv.version_no, av.storage_key
FROM h5_page_records p
JOIN h5_page_versions pv ON pv.id = p.current_version_id
JOIN h5_asset_versions av ON av.asset_id = pv.content_asset_id AND av.version_no = 1
WHERE p.status <> 'deleted' AND p.page_type = 'html'`,
);
let rebuilt = 0;
for (const row of rows) {
const content = await fs.readFile(path.join(storageRoot, row.storage_key), 'utf8');
await ensureHtmlThumbnail(storageRoot, pageThumbnailKey(row.user_id, row.page_id), content, {
title: row.title,
subtitle: row.summary || `草稿 v${row.version_no}`,
tag: '网页',
contentStorageKey: row.storage_key,
});
rebuilt += 1;
}
return rebuilt;
}
async function rebuildAssetThumbnails(pool) {
const [rows] = await pool.query(
`SELECT a.id AS asset_id, a.user_id, a.display_name, c.category_code, av.storage_key
FROM h5_assets a
JOIN h5_space_categories c ON c.id = a.category_id
JOIN h5_asset_versions av ON av.asset_id = a.id AND av.version_no = 1
WHERE a.status <> 'deleted' AND a.mime_type = 'text/html'`,
);
let rebuilt = 0;
for (const row of rows) {
const content = await fs.readFile(path.join(storageRoot, row.storage_key), 'utf8');
await ensureHtmlThumbnail(storageRoot, assetThumbnailKey(row.user_id, row.asset_id), content, {
title: row.display_name,
subtitle: String(row.category_code ?? 'HTML').toUpperCase(),
contentStorageKey: row.storage_key,
});
rebuilt += 1;
}
return rebuilt;
}
const pool = createDbPool();
try {
const pages = await rebuildPageThumbnails(pool);
const assets = await rebuildAssetThumbnails(pool);
console.log(`已重建缩略图:${pages} 个页面,${assets} 个 HTML 资产`);
} finally {
await pool.end();
}