229805a070
Add WeChat service account routing with sync acks, connectivity tests, and context isolation; document deploy runbooks; and bundle related MindSpace, voice, Plaza, and server gateway changes for production rollout. Co-authored-by: Cursor <cursoragent@cursor.com>
74 lines
2.3 KiB
JavaScript
74 lines
2.3 KiB
JavaScript
/**
|
|
* 下线 john 账户多余的 Plaza 演示公开页,释放发布配额。
|
|
* 用法:node scripts/offline-john-demo-pages.mjs [--keep=N]
|
|
*/
|
|
import fs from 'node:fs';
|
|
import path from 'node:path';
|
|
import { fileURLToPath } from 'node:url';
|
|
import { createDbPool } from '../db.mjs';
|
|
import { createPublicationService } from '../mindspace-publications.mjs';
|
|
|
|
const root = path.join(path.dirname(fileURLToPath(import.meta.url)), '..');
|
|
|
|
function loadEnvFile(filePath) {
|
|
if (!fs.existsSync(filePath)) return;
|
|
for (const line of fs.readFileSync(filePath, 'utf8').split('\n')) {
|
|
const trimmed = line.trim();
|
|
if (!trimmed || trimmed.startsWith('#')) continue;
|
|
const eq = trimmed.indexOf('=');
|
|
if (eq < 0) continue;
|
|
const key = trimmed.slice(0, eq).trim();
|
|
const value = trimmed.slice(eq + 1).trim();
|
|
if (!process.env[key]) process.env[key] = value;
|
|
}
|
|
}
|
|
|
|
loadEnvFile(path.join(root, '.env'));
|
|
loadEnvFile(path.join(root, '../../.env.local'));
|
|
|
|
const keepCount = Number(process.argv.find((arg) => arg.startsWith('--keep='))?.split('=')[1] ?? 3);
|
|
|
|
const pool = createDbPool();
|
|
const publications = createPublicationService(pool);
|
|
|
|
const [users] = await pool.query(
|
|
`SELECT id FROM h5_users WHERE username = 'john' LIMIT 1`,
|
|
);
|
|
const userId = users[0]?.id;
|
|
if (!userId) {
|
|
console.error('未找到 john 用户');
|
|
process.exit(1);
|
|
}
|
|
|
|
const [rows] = await pool.query(
|
|
`SELECT id, url_slug, published_at
|
|
FROM h5_publish_records
|
|
WHERE user_id = ? AND status = 'online' AND url_slug LIKE 'demo-%'
|
|
ORDER BY published_at DESC`,
|
|
[userId],
|
|
);
|
|
|
|
const keep = rows.slice(0, keepCount);
|
|
const offline = rows.slice(keepCount);
|
|
|
|
if (offline.length === 0) {
|
|
console.log(`当前 demo 在线页 ${rows.length} 个,无需下线(保留 ${keepCount} 个)。`);
|
|
await pool.end();
|
|
process.exit(0);
|
|
}
|
|
|
|
console.log(`保留 ${keep.length} 个 demo 页,下线 ${offline.length} 个…`);
|
|
for (const row of offline) {
|
|
await publications.offline(userId, row.id);
|
|
console.log(`✓ 已下线 ${row.url_slug}`);
|
|
}
|
|
|
|
const [usage] = await pool.query(
|
|
`SELECT COUNT(DISTINCT page_id) AS public_page_used
|
|
FROM h5_publish_records WHERE user_id = ? AND status = 'online'`,
|
|
[userId],
|
|
);
|
|
|
|
console.log(`\n完成:john 当前在线公开页 ${usage[0]?.public_page_used ?? 0} 个。`);
|
|
await pool.end();
|