113 lines
3.1 KiB
JavaScript
113 lines
3.1 KiB
JavaScript
const CONFIG_TABLE = 'h5_wechat_admin_config';
|
|
const CONFIG_KEY = 'schedule_llm';
|
|
|
|
function normalizeBoolean(value, fallback = false) {
|
|
if (value == null || value === '') return fallback;
|
|
if (typeof value === 'boolean') return value;
|
|
const normalized = String(value).trim().toLowerCase();
|
|
if (['1', 'true', 'yes', 'on'].includes(normalized)) return true;
|
|
if (['0', 'false', 'no', 'off'].includes(normalized)) return false;
|
|
return fallback;
|
|
}
|
|
|
|
function parseConfigJson(value) {
|
|
if (!value) return {};
|
|
if (typeof value === 'object') return value;
|
|
try {
|
|
return JSON.parse(String(value));
|
|
} catch {
|
|
return {};
|
|
}
|
|
}
|
|
|
|
async function ensureConfigTable(pool) {
|
|
await pool.query(`
|
|
CREATE TABLE IF NOT EXISTS ${CONFIG_TABLE} (
|
|
config_key VARCHAR(64) PRIMARY KEY,
|
|
config_json JSON NOT NULL,
|
|
updated_by CHAR(36) NULL,
|
|
updated_at BIGINT NOT NULL
|
|
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
`);
|
|
}
|
|
|
|
function defaultsFromEnv(env = process.env) {
|
|
return {
|
|
scheduleLlmEnabled: normalizeBoolean(env.H5_WECHAT_SCHEDULE_LLM_ENABLED, false),
|
|
};
|
|
}
|
|
|
|
export function createWechatScheduleLlmConfigService(pool, { env = process.env } = {}) {
|
|
let ensurePromise = null;
|
|
|
|
async function ensureReady() {
|
|
if (!ensurePromise) ensurePromise = ensureConfigTable(pool);
|
|
await ensurePromise;
|
|
}
|
|
|
|
async function readRow() {
|
|
await ensureReady();
|
|
const [rows] = await pool.query(
|
|
`SELECT config_json, updated_by, updated_at
|
|
FROM ${CONFIG_TABLE}
|
|
WHERE config_key = ?
|
|
LIMIT 1`,
|
|
[CONFIG_KEY],
|
|
);
|
|
return rows[0] ?? null;
|
|
}
|
|
|
|
function mergeConfig(row) {
|
|
const defaults = defaultsFromEnv(env);
|
|
const stored = parseConfigJson(row?.config_json);
|
|
return {
|
|
scheduleLlmEnabled: normalizeBoolean(
|
|
stored.scheduleLlmEnabled,
|
|
defaults.scheduleLlmEnabled,
|
|
),
|
|
};
|
|
}
|
|
|
|
return {
|
|
async getConfig() {
|
|
const row = await readRow();
|
|
return {
|
|
...mergeConfig(row),
|
|
updatedAt: row?.updated_at ? Number(row.updated_at) : null,
|
|
updatedBy: row?.updated_by ?? null,
|
|
};
|
|
},
|
|
|
|
async isScheduleLlmEnabled() {
|
|
const config = await this.getConfig();
|
|
return config.scheduleLlmEnabled;
|
|
},
|
|
|
|
async updateConfig(payload = {}, { updatedBy = null } = {}) {
|
|
const current = await this.getConfig();
|
|
const next = {
|
|
scheduleLlmEnabled:
|
|
payload.scheduleLlmEnabled === undefined
|
|
? current.scheduleLlmEnabled
|
|
: normalizeBoolean(payload.scheduleLlmEnabled, current.scheduleLlmEnabled),
|
|
};
|
|
const now = Date.now();
|
|
await pool.query(
|
|
`INSERT INTO ${CONFIG_TABLE} (config_key, config_json, updated_by, updated_at)
|
|
VALUES (?, ?, ?, ?)
|
|
ON DUPLICATE KEY UPDATE
|
|
config_json = VALUES(config_json),
|
|
updated_by = VALUES(updated_by),
|
|
updated_at = VALUES(updated_at)`,
|
|
[CONFIG_KEY, JSON.stringify(next), updatedBy, now],
|
|
);
|
|
return this.getConfig();
|
|
},
|
|
};
|
|
}
|
|
|
|
export const wechatScheduleLlmConfigInternals = {
|
|
normalizeBoolean,
|
|
defaultsFromEnv,
|
|
};
|