Files
boursecu_server/app/Models/Setting.php
T

118 lines
3.3 KiB
PHP

<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Schema;
use Rooyesh\Wallet\models\Transaction;
use Tymon\JWTAuth\Contracts\JWTSubject;
class Setting extends Model
{
use HasFactory,Selector;
private static ?bool $typeColumnExists = null;
public static function hasTypeColumn(): bool
{
if (static::$typeColumnExists !== null) {
return static::$typeColumnExists;
}
try {
static::$typeColumnExists = Schema::hasColumn((new static)->getTable(), 'type');
} catch (\Throwable) {
static::$typeColumnExists = false;
}
return static::$typeColumnExists;
}
/** @return array<int, string> */
public static function adminSelectColumns(): array
{
$cols = ['id', 'title_fa', 'key', 'value', 'description', 'is_active', 'can_edit'];
if (static::hasTypeColumn()) {
$cols[] = 'type';
}
return $cols;
}
/**
* کلیدهایی که هرگز نباید در پاسخ عمومی api/get_settings برگردند.
* credential درگاه، توکن‌ها، رمزها و پیکربندی داخلی پرداخت.
*/
public static function isSecretOrServerOnlyKey(string $key): bool
{
$key = strtolower(trim($key));
if ($key === '') {
return false;
}
// کل گروه پیکربندی پرداخت آنلاین — فقط سرور / ادمین
if (
str_starts_with($key, 'external_payment_')
|| $key === 'wallet_payment_provider'
|| str_starts_with($key, 'payping_')
) {
return true;
}
$exact = [
'node_client_id',
'node_shared_secret',
'montzar_password',
'montzar_token',
'montzar_mobile',
'bale_bot_token',
'telegram_bot_token',
'rubika_bot_token',
'tahesab_token',
'tahesab_host',
'tahesab_port',
'tahesab_db',
'pargar_password',
'pargar_api_token',
'pargar_username',
'zarin_api',
'zarin_token',
];
if (in_array($key, $exact, true)) {
return true;
}
return (bool) preg_match('/(^|_)(secret|password|token|api_key|apikey|private)(_|$)/', $key);
}
/**
* فیلتر تنظیمات برای پاسخ عمومی (اپ کاربر).
*
* @param \Illuminate\Support\Collection|iterable $settings
* @return \Illuminate\Support\Collection
*/
public static function forPublicApi($settings)
{
return collect($settings)
->filter(fn ($row) => ! static::isSecretOrServerOnlyKey((string) (is_array($row) ? ($row['key'] ?? '') : ($row->key ?? ''))))
->values();
}
protected $fillable = [
'key',
'title_fa',
'is_active',
'description',
'value',
'value_json',
'type',
];
protected $casts = [
'value_json'=>'array',
'is_active'=>'boolean',
];
}