Improve WeChat MP replies and ship MindSpace/H5 production updates.
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>
This commit is contained in:
@@ -0,0 +1,73 @@
|
||||
/**
|
||||
* 下线 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();
|
||||
Reference in New Issue
Block a user