import type { PageDef, ScenarioPageRef, UserScenario, UserScenariosConfig } from "../config/types.js";
|
import { loadPagesConfig, loadUserScenariosConfig, writeUserScenariosConfig } from "../config/loadConfig.js";
|
|
export const STAYTIME_MIN = 5;
|
export const STAYTIME_MAX = 86400;
|
|
function isValidStaytime(n: number): boolean {
|
return Number.isInteger(n) && n >= STAYTIME_MIN && n <= STAYTIME_MAX;
|
}
|
|
function pagesById(): Record<string, PageDef> {
|
const cfg = loadPagesConfig();
|
const map: Record<string, PageDef> = {};
|
for (const p of cfg.pages) {
|
map[p.id] = p;
|
}
|
return map;
|
}
|
|
function ensureUser(cfg: UserScenariosConfig, username: string): void {
|
if (!cfg.users[username]) {
|
cfg.users[username] = { scenarios: [] };
|
}
|
}
|
|
function newScenarioId(): string {
|
const rnd = Math.random().toString(36).slice(2, 10);
|
return `u_${Date.now()}_${rnd}`;
|
}
|
|
export function listUserScenarios(username: string): UserScenario[] {
|
const cfg = loadUserScenariosConfig();
|
return cfg.users[username]?.scenarios ?? [];
|
}
|
|
export function deleteUserScenario(
|
username: string,
|
scenarioId: string
|
): { ok: true } | { ok: false; error: string } {
|
const cfg = loadUserScenariosConfig();
|
ensureUser(cfg, username);
|
const before = cfg.users[username].scenarios.length;
|
cfg.users[username].scenarios = cfg.users[username].scenarios.filter(
|
(s) => s.id !== scenarioId
|
);
|
if (cfg.users[username].scenarios.length === before) {
|
return { ok: false, error: "未找到该场景" };
|
}
|
writeUserScenariosConfig(cfg);
|
return { ok: true };
|
}
|
|
export function createUserScenario(
|
username: string,
|
name: string,
|
pageRefs: ScenarioPageRef[]
|
): { ok: true; scenario: UserScenario } | { ok: false; error: string } {
|
const nm = String(name ?? "").trim();
|
if (!nm) {
|
return { ok: false, error: "场景名称不能为空" };
|
}
|
if (!Array.isArray(pageRefs) || !pageRefs.length) {
|
return { ok: false, error: "至少选择 1 个 page" };
|
}
|
|
const pages = pagesById();
|
for (const r of pageRefs) {
|
if (!r?.pageId || !pages[r.pageId]) {
|
return { ok: false, error: `pageId 不存在:${String(r?.pageId ?? "")}` };
|
}
|
if (!isValidStaytime(r.staytime)) {
|
return {
|
ok: false,
|
error: `停留时间须为 ${STAYTIME_MIN}~${STAYTIME_MAX} 的整数(秒)`,
|
};
|
}
|
}
|
|
const cfg = loadUserScenariosConfig();
|
ensureUser(cfg, username);
|
const exists = cfg.users[username].scenarios.some((s) => s.name === nm);
|
if (exists) {
|
return { ok: false, error: "该用户下已存在同名场景" };
|
}
|
|
const firstPage = pages[pageRefs[0].pageId];
|
const scenario: UserScenario = {
|
id: newScenarioId(),
|
name: nm,
|
image: firstPage?.image ?? "",
|
pages: pageRefs,
|
createdAtMs: Date.now(),
|
};
|
cfg.users[username].scenarios.unshift(scenario);
|
writeUserScenariosConfig(cfg);
|
return { ok: true, scenario };
|
}
|
|