@@ -2,11 +2,14 @@
|
||||
/**
|
||||
* منبع حقیقت: khaneghi_server/database/sql/deploy_settings_const.sql
|
||||
* خروجی:
|
||||
* - prisma/setting-templates-from-deploy.json (فقط can_edit=0 نهایی)
|
||||
* - prisma/setting-templates-from-deploy.json (فقط کلیدهای مالکیت سوپرادمین)
|
||||
* - src/program-settings/deploy-setting-catalog-keys.ts
|
||||
* - ../controlpanel_user/src/config/superAdminSettingKeys.ts
|
||||
*
|
||||
* قالب value خالی است برای توکن/رمز/شناسه پروژه — هر پروژه در سوپرادمین مقدار خودش را دارد.
|
||||
* مالکیت سوپرادمین دیگر با can_edit تعیین نمیشود: فقط کلیدهای SUPERADMIN_OWNED_KEYS
|
||||
* (تب «دسترسی مشتری به قابلیتها») در سوپرادمین میمانند و بقیه مالک دیتابیس هر نصباند.
|
||||
* کلیدهای لوکال در جدول settings همان can_edit=0 خودشان را نگه میدارند تا در تب
|
||||
* «تنظیمات پیشرفته» پنل خانگی بمانند؛ اینجا فقط از قالب سوپرادمین بیرون میروند.
|
||||
*/
|
||||
import { readFileSync, writeFileSync } from 'fs';
|
||||
import { dirname, join } from 'path';
|
||||
@@ -204,12 +207,29 @@ for (const key of EXTRA_EDITABLE) {
|
||||
if (row) row.can_edit = 1;
|
||||
}
|
||||
|
||||
/** تنها کلیدهایی که سوپرادمین مالکشان میماند — گروه «دسترسی مشتری به قابلیتها» */
|
||||
const SUPERADMIN_OWNED_KEYS = new Set([
|
||||
'customer_direct_sms',
|
||||
'customer_special_pricing',
|
||||
'enable_conditional_order',
|
||||
'enable_customer_level_profit',
|
||||
'enable_product_funds',
|
||||
'group_sms',
|
||||
'has_page_earn_money',
|
||||
'has_page_gift_card',
|
||||
'has_page_notification',
|
||||
'has_page_price_trigger',
|
||||
'jibit_enabled',
|
||||
'permision__enabled',
|
||||
'show_to_users_chat',
|
||||
]);
|
||||
|
||||
const systemRows = [...rows.values()]
|
||||
.filter((r) => r.can_edit === 0)
|
||||
.filter((r) => r.can_edit === 0 && SUPERADMIN_OWNED_KEYS.has(r.key))
|
||||
.sort((a, b) => a.key.localeCompare(b.key));
|
||||
|
||||
const editableRows = [...rows.values()]
|
||||
.filter((r) => r.can_edit === 1)
|
||||
.filter((r) => !SUPERADMIN_OWNED_KEYS.has(r.key))
|
||||
.sort((a, b) => a.key.localeCompare(b.key));
|
||||
|
||||
const jsonOut = systemRows.map((r) => ({
|
||||
@@ -223,14 +243,17 @@ const jsonOut = systemRows.map((r) => ({
|
||||
}));
|
||||
|
||||
const tsKeys = `/**
|
||||
* کلیدهای can_edit=0 در deploy_settings_const.sql — فقط همینها در قالب سوپرادمین.
|
||||
* کلیدهای مالکیت سوپرادمین — گروه «دسترسی مشتری به قابلیتها».
|
||||
* تولید خودکار: node scripts/sync-superadmin-setting-template.mjs
|
||||
*/
|
||||
export const DEPLOY_SETTING_CATALOG_KEYS = new Set<string>([
|
||||
${systemRows.map((r) => ` ${JSON.stringify(r.key)},`).join('\n')}
|
||||
]);
|
||||
|
||||
/** کلیدهای can_edit=1 — نباید در قالب/جدول settings سوپرادمین باشند */
|
||||
/**
|
||||
* کلیدهایی که سوپرادمین مالکشان نیست (مالک: دیتابیس هر نصب).
|
||||
* در هر بوت با purgeEditableFromSuperAdmin از قالب و ردیف همهٔ پروژهها حذف میشوند.
|
||||
*/
|
||||
export const DEPLOY_SETTING_EDITABLE_KEYS = new Set<string>([
|
||||
${editableRows.map((r) => ` ${JSON.stringify(r.key)},`).join('\n')}
|
||||
]);
|
||||
@@ -240,7 +263,7 @@ writeFileSync(join(root, 'prisma/setting-templates-from-deploy.json'), `${JSON.s
|
||||
writeFileSync(join(root, 'src/program-settings/deploy-setting-catalog-keys.ts'), `${tsKeys}\n`);
|
||||
|
||||
const userTs = `/**
|
||||
* کلیدهای تنظیمات سوپرادمین — همتراز deploy_settings_const.sql
|
||||
* کلیدهای تنظیمات سوپرادمین — فقط گروه «دسترسی مشتری به قابلیتها».
|
||||
* تولید خودکار: controlpanel_server/scripts/sync-superadmin-setting-template.mjs
|
||||
*/
|
||||
export const SUPERADMIN_SYSTEM_SETTING_KEYS = new Set<string>([
|
||||
@@ -261,24 +284,25 @@ export function isSuperAdminSystemSettingKey(key?: string | null): boolean {
|
||||
|
||||
writeFileSync(join(root, '../controlpanel_user/src/config/superAdminSettingKeys.ts'), `${userTs}\n`);
|
||||
|
||||
console.log(`system keys (can_edit=0): ${systemRows.length}`);
|
||||
console.log(`editable keys (can_edit=1): ${editableRows.length}`);
|
||||
const mustHave = [
|
||||
'price_provider',
|
||||
'zaarbox_api_url',
|
||||
'main_product',
|
||||
'profit_gold_api_enabled',
|
||||
'title_pwa',
|
||||
'title_fav',
|
||||
'unit',
|
||||
'main_wallet_products',
|
||||
];
|
||||
for (const key of mustHave) {
|
||||
console.log(`superadmin-owned keys: ${systemRows.length}`);
|
||||
console.log(`locally owned keys (purged from superadmin): ${editableRows.length}`);
|
||||
for (const key of SUPERADMIN_OWNED_KEYS) {
|
||||
const ok = systemRows.some((r) => r.key === key);
|
||||
console.log(` ${ok ? 'OK' : 'MISSING'} ${key}`);
|
||||
}
|
||||
const mustNot = ['montzar_token', 'montzar_diff', 'name_fa', 'buy_fee'];
|
||||
const mustNot = [
|
||||
'price_provider',
|
||||
'node_shared_secret',
|
||||
'chat_api_key',
|
||||
'external_payment_client_secret',
|
||||
'wallet_payment_provider',
|
||||
'zarin_token',
|
||||
'tahesab_token',
|
||||
'pargar_password',
|
||||
'name_fa',
|
||||
'buy_fee',
|
||||
];
|
||||
for (const key of mustNot) {
|
||||
const bad = systemRows.some((r) => r.key === key);
|
||||
console.log(` ${bad ? 'LEAK' : 'OK'} system must not contain ${key}`);
|
||||
console.log(` ${bad ? 'LEAK' : 'OK'} superadmin must not own ${key}`);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user