chore(scripts): 新增带鉴权的时光机触发脚本,优化本地运维体验
This commit is contained in:
parent
d7f8a338b6
commit
ef412b366a
@ -435,3 +435,11 @@
|
|||||||
- **Tooltip 防御性解构**:`CustomTooltip` 中的值读取改为 `Number(dataNode.totalValueCny || dataNode._raw?.totalValueCny || 0) || 0`,通过 `_raw` 快照兜底读取,确保 Tooltip 永远能拿到本金和现值的真实数据。
|
- **Tooltip 防御性解构**:`CustomTooltip` 中的值读取改为 `Number(dataNode.totalValueCny || dataNode._raw?.totalValueCny || 0) || 0`,通过 `_raw` 快照兜底读取,确保 Tooltip 永远能拿到本金和现值的真实数据。
|
||||||
- **Snapshot 接口扩展**:新增 `total_value_cny?: string` 和 `total_cost_cny?: string` 可选字段,`ChartDatum` 接口新增 `_raw: Snapshot` 字段用于 Tooltip 层 fallback。
|
- **Snapshot 接口扩展**:新增 `total_value_cny?: string` 和 `total_cost_cny?: string` 可选字段,`ChartDatum` 接口新增 `_raw: Snapshot` 字段用于 Tooltip 层 fallback。
|
||||||
- **验收标准**:控制台 `【CHART DATA DEBUG】` 打印出带真实本金(如 5094)的字段;Tooltip 中投入本金显示真实法币数字,彻底消除 704 旧账残影。
|
- **验收标准**:控制台 `【CHART DATA DEBUG】` 打印出带真实本金(如 5094)的字段;Tooltip 中投入本金显示真实法币数字,彻底消除 704 旧账残影。
|
||||||
|
|
||||||
|
## 基于现有生产级 API 鉴权,补充开发了 scripts/trigger-rebuild.ts 本地触发脚本,实现了安全、隔离的本地时光机重置工作流 (Task 84)
|
||||||
|
- 在项目根目录创建 `scripts/trigger-rebuild.ts` 独立触发脚本,作为 `app/api/admin/rebuild-snapshots/route.ts` 的本地运维入口。
|
||||||
|
- 脚本通过 `dotenv` 强制加载 `.env.local` 和 `.env` 环境变量文件,优先读取 `REBUILD_SECRET`,降级读取 `CRON_SECRET`,确保鉴权密钥的安全获取。
|
||||||
|
- **核心逻辑**:脚本向 `http://localhost:8080/api/admin/rebuild-snapshots` 发送 POST 请求,携带 `Authorization: Bearer <secret>` 请求头,复用生产级 Bearer Token 强校验机制,未配置密钥时提前退出。
|
||||||
|
- **架构红线**:`app/api/admin/rebuild-snapshots/route.ts` 中的生产级 POST + Bearer Token 强校验代码未被修改,保持原有的安全隔离设计。
|
||||||
|
- **运行方式**:`npx tsx scripts/trigger-rebuild.ts`(需确保 `npm run dev` 在另一个终端运行且端口为 8080)。
|
||||||
|
- **设计收益**:本地开发者无需记忆 curl 命令或手动构造请求头,通过脚本即可安全触发历史快照重建,降低了运维门槛并保持了与生产鉴权机制的一致性。
|
||||||
38
scripts/trigger-rebuild.ts
Normal file
38
scripts/trigger-rebuild.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
import { config } from 'dotenv';
|
||||||
|
// 强制加载所有可能的本地环境变量文件
|
||||||
|
config({ path: ['.env.local', '.env'] });
|
||||||
|
|
||||||
|
const triggerRebuild = async () => {
|
||||||
|
// 优先读取 REBUILD_SECRET,降级读取 CRON_SECRET
|
||||||
|
const secret = process.env.REBUILD_SECRET || process.env.CRON_SECRET;
|
||||||
|
|
||||||
|
if (!secret) {
|
||||||
|
console.error('❌ 致命错误: 未在 .env.local 或 .env 找到 REBUILD_SECRET 或 CRON_SECRET');
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('🚀 正在携带合法 Token 请求时光机重置接口...');
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 默认请求本地 8080 端口,确保 Next.js 服务正在运行
|
||||||
|
const response = await fetch('http://localhost:8080/api/admin/rebuild-snapshots', {
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
'Authorization': `Bearer ${secret}`,
|
||||||
|
'Content-Type': 'application/json'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const data = await response.json();
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
console.log('✅ 历史快照重建成功!', JSON.stringify(data, null, 2));
|
||||||
|
} else {
|
||||||
|
console.error('❌ 重建失败,服务器返回:', data);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('❌ 请求发送异常 (请确认 npm run dev 正在运行且端口为 8080):', error);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
triggerRebuild();
|
||||||
Loading…
Reference in New Issue
Block a user