Files
boursecu_server/app/Services/SuperAdminProgramSettingsOverlay.php
T

251 lines
7.3 KiB
PHP
Raw Normal View History

<?php
namespace App\Services;
/**
* تنظیمات پیشرفته سوپرادمین برای ConfigService و get_settings.
* هر درخواست HTTP یک بار از سوپرادمین می‌خواند (memo فقط داخل همان درخواست) — بدون کش Redis.
*/
class SuperAdminProgramSettingsOverlay
{
2026-08-23 22:34:18 +03:30
/**
* فقط این ۱۴ دسترسی از سوپرادمین خوانده می‌شود.
* هر کلید دیگری (قیمت، ساعت کاری، برندینگ، …) مال پنل خانگی است.
2026-08-23 22:34:18 +03:30
*/
public const SUPERADMIN_OWNED_KEYS = [
'customer_direct_sms',
'customer_special_pricing',
'enable_automation',
2026-08-23 22:34:18 +03:30
'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',
];
/**
* دسترسی‌های سوپرادمین که منو/مسیر اپ کاربر را کنترل می‌کنند.
* باید همیشه در api/get_settings مشتری برسند (show_to_user).
*/
public const CLIENT_FEATURE_KEYS = [
'enable_conditional_order',
'enable_product_funds',
'has_page_earn_money',
'has_page_gift_card',
'has_page_notification',
'has_page_price_trigger',
'jibit_enabled',
'permision__enabled',
'show_to_users_chat',
];
/** کلیدهایی که هنوز صفحهٔ اختصاصی ادمین خانگی مالک‌شان است — از overlay دور انداخته می‌شوند */
public const LOCAL_OWNED_KEYS = [
'tracking_systems',
];
2026-08-26 12:56:57 +03:30
/**
* فقط کلیدهایی که هنوز از پنل قابل ویرایش نیستند و کد tenant می‌نویسد.
* بقیهٔ سابق (montzar_* / up_price / …) can_edit=0 و فقط در تنظیمات پیشرفته ویرایش می‌شوند.
*/
public const RUNTIME_KEYS = [
'do_send_liman',
];
/** @var array<string, array<string, mixed>>|null */
private static ?array $memo = null;
private static bool $loaded = false;
/** پاک کردن memo درخواست — برای دکمهٔ همگام‌سازی / بروزرسانی */
public function flushCache(): void
{
self::$memo = null;
self::$loaded = false;
}
/**
* دوباره از سوپرادمین می‌خواند (بدون کش پایدار).
*
* @return array{ok: bool, count: int, items: array<string, string>, source: string, meta?: array<string, mixed>}
*/
public function refreshFromSuperAdmin(): array
{
$this->flushCache();
$client = app(SuperAdminProgramSettingsClient::class);
$map = $this->catalogMap();
if ($map === null) {
return [
'ok' => false,
'count' => 0,
'items' => [],
'source' => 'unavailable',
'meta' => $client->lastFetchMeta(),
];
}
$items = [];
foreach ($map as $key => $row) {
if (! is_array($row)) {
continue;
}
$value = $row['value'] ?? null;
if ($value === null || $value === '') {
continue;
}
$items[(string) $key] = (string) $value;
}
return [
'ok' => true,
'count' => count($items),
'items' => $items,
'source' => 'superadmin',
'meta' => $client->lastFetchMeta(),
];
}
/**
* همهٔ کلیدهای سوپرادمین (حتی value خالی). null = سوپرادمین در دسترس نبود.
*
* @return array<string, array<string, mixed>>|null
*/
public function catalogMap(): ?array
{
return $this->load();
}
/**
* فقط کلیدهایی که سوپرادمین مقدار غیرخالی دارد — برای ConfigService.
*
* @return array<string, array<string, mixed>>|null
*/
public function map(): ?array
{
$full = $this->load();
if ($full === null) {
return null;
}
$withValue = [];
foreach ($full as $key => $row) {
$value = is_array($row) ? ($row['value'] ?? null) : null;
if ($value === null || $value === '') {
continue;
}
$withValue[$key] = $row;
}
return $withValue;
}
/**
* @return array<string, array<string, mixed>>|null
*/
private function load(): ?array
{
if (self::$loaded) {
return self::$memo;
}
self::$loaded = true;
$items = app(SuperAdminProgramSettingsClient::class)->fetchItems();
2026-08-22 18:06:35 +03:30
if ($items === null) {
self::$memo = null;
return null;
}
$map = self::ownedItemsMap($items);
self::$memo = $map;
return $map;
}
/**
* فقط کلیدهای دسترسی سوپرادمین — بقیهٔ پاسخ remote دور ریخته می‌شود.
*
* @param array<int, array<string, mixed>> $items
* @return array<string, array<string, mixed>>
*/
public static function ownedItemsMap(array $items): array
{
$map = [];
foreach ($items as $row) {
if (! is_array($row)) {
continue;
}
$key = trim((string) ($row['key'] ?? ''));
if ($key === '' || ! self::isSuperAdminOwned($key)) {
continue;
}
$map[$key] = $row;
}
return $map;
}
/**
* @return array<int, array<string, mixed>>
*/
public function items(): array
{
$map = $this->map();
if ($map === null || $map === []) {
return [];
}
return array_values($map);
}
/**
* @return array<string, mixed>|null
*/
public function row(string $key): ?array
{
$map = $this->map();
if ($map === null) {
return null;
}
$key = trim($key);
if ($key === '' || ! self::isSuperAdminOwned($key) || ! array_key_exists($key, $map)) {
return null;
}
return $map[$key];
}
public static function isRuntime(string $key): bool
{
return in_array($key, self::RUNTIME_KEYS, true);
}
/**
* کلیدهای صفحهٔ «ساعت کاری» هم مالکشان پنل خانگی است — اگر از overlay خوانده شوند
* مقدار ذخیره‌شده در پنل هیچ‌وقت روی قیمت کاربر اعمال نمی‌شود.
*/
public static function isLocalOwned(string $key): bool
{
return in_array($key, self::LOCAL_OWNED_KEYS, true)
|| in_array($key, ConfigService::TRADING_HOURS_CLIENT_KEYS, true);
}
2026-08-23 22:34:18 +03:30
public static function isSuperAdminOwned(string $key): bool
{
return in_array(trim($key), self::SUPERADMIN_OWNED_KEYS, true);
}
public static function isClientFeatureKey(string $key): bool
{
return in_array(trim($key), self::CLIENT_FEATURE_KEYS, true);
}
}