From af6f9a2feed05ce2969878895576c55eecacb0a3 Mon Sep 17 00:00:00 2001 From: adonis Date: Thu, 9 Jul 2026 13:37:03 +0330 Subject: [PATCH] fixed buy and sell --- app/Models/File.php | 424 ++++++++++++++++++++++---------------------- 1 file changed, 212 insertions(+), 212 deletions(-) diff --git a/app/Models/File.php b/app/Models/File.php index 70f5df0..f947888 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -1,212 +1,212 @@ - 'boolean', - ]; - - protected $appends = [ - 'full_src', - ]; - - /** - * URL کامل تصویر — همان قرارداد قبلی API (src = آدرس قابل نمایش). - */ - public function getSrcAttribute(): ?string - { - return self::publicUrl($this->attributes['src'] ?? null); - } - - public function getFullSrcAttribute(): ?string - { - return $this->src; - } - - public static function publicUrl(?string $path): ?string - { - if ($path === null || trim($path) === '') { - return null; - } - - $trimmed = trim($path); - - if (preg_match('/^https?:\/\//i', $trimmed)) { - return self::rewriteWrongPublicUrl($trimmed) ?? $trimmed; - } - - $relative = self::normalizeRelativeStoragePath($trimmed); - $base = self::resolvePublicBaseUrl(); - if ($relative === '') { - return null; - } - if ($base === '') { - return $relative; - } - - return $base.'/'.$relative; - } - - /** - * مسیر نسبی داخل public/storage — حتی اگر قبلاً URL کامل اشتباه در DB ذخیره شده باشد. - */ - public static function normalizeRelativeStoragePath(string $path): string - { - $path = trim($path); - - if (preg_match('#/storage/(.+)$#i', $path, $matches)) { - return 'storage/'.ltrim($matches[1], '/'); - } - - $relative = ltrim($path, '/'); - - if (! str_starts_with($relative, 'storage/')) { - $relative = 'storage/'.$relative; - } - - return $relative; - } - - /** - * اصلاح URLهای قدیمی: https://site.ir/storage/... → https://site.ir/server/storage/... - */ - public static function rewriteWrongPublicUrl(string $url): ?string - { - if (! preg_match('#^(https?://[^/]+)/storage/(.+)$#i', $url, $matches)) { - return null; - } - - $base = self::resolvePublicBaseUrl(); - if ($base === '') { - return null; - } - - if (str_contains($base, '/server') && ! str_contains($matches[1].'/storage/', '/server/storage/')) { - return $base.'/storage/'.$matches[2]; - } - - return null; - } - - /** - * پایهٔ URL فایل‌های storage. - * در درخواست HTTP، دامنهٔ همان درخواست اولویت دارد (جلوگیری از URL اشتباه وقتی settings دامنهٔ ماژول دیگر است). - */ - public static function resolvePublicBaseUrl(): string - { - $fromRequest = self::baseUrlFromRequest(); - if ($fromRequest !== '') { - return $fromRequest; - } - - $fromSettings = self::baseUrlFromSettings(); - if ($fromSettings !== '') { - return self::ensureAbsoluteUrl($fromSettings); - } - - $domain = config('app.domain'); - if (is_string($domain) && $domain !== '' && ! str_contains($domain, 'localhost')) { - return self::ensureAbsoluteUrl(self::ensureServerPublicBase(rtrim($domain, '/'))); - } - - $appUrl = config('app.url'); - if (is_string($appUrl) && $appUrl !== '' && ! str_contains($appUrl, 'localhost')) { - return self::ensureAbsoluteUrl(self::ensureServerPublicBase(rtrim($appUrl, '/'))); - } - - return ''; - } - - private static function baseUrlFromRequest(): string - { - try { - if (app()->bound('request')) { - $request = request(); - $host = $request?->getSchemeAndHttpHost(); - if (is_string($host) && $host !== '' && ! str_contains($host, 'localhost')) { - return self::ensureAbsoluteUrl(self::ensureServerPublicBase($host)); - } - } - } catch (\Throwable) { - } - - return ''; - } - - private static function ensureAbsoluteUrl(string $base): string - { - $base = rtrim(trim($base), '/'); - if ($base === '') { - return ''; - } - - if (! preg_match('/^https?:\/\//i', $base)) { - $base = 'https://'.ltrim($base, '/'); - } - - return $base; - } - - private static function baseUrlFromSettings(): string - { - try { - $rows = Setting::query() - ->whereIn('key', ['bace_url', 'server_url', 'admin_url', 'app_url']) - ->where('is_active', 1) - ->pluck('value', 'key'); - - foreach (['server_url', 'bace_url'] as $key) { - $value = trim((string) ($rows[$key] ?? '')); - if ($value !== '') { - return rtrim($value, '/'); - } - } - - $adminUrl = trim((string) ($rows['admin_url'] ?? '')); - if ($adminUrl !== '' && preg_match('#/admin#i', $adminUrl)) { - return rtrim(preg_replace('#/admin/?$#i', '/server', rtrim($adminUrl, '/')), '/'); - } - - $siteUrl = trim((string) ($rows['app_url'] ?? '')); - if ($siteUrl !== '') { - $siteUrl = rtrim($siteUrl, '/'); - if (! preg_match('#/server$#i', $siteUrl)) { - $siteUrl .= '/server'; - } - - return $siteUrl; - } - } catch (\Throwable) { - } - - return ''; - } - - private static function ensureServerPublicBase(string $base): string - { - if (preg_match('#/(server|api)(/|$)#i', $base)) { - return rtrim($base, '/'); - } - - return rtrim($base, '/').'/server'; - } -} + 'boolean', + ]; + + protected $appends = [ + 'full_src', + ]; + + /** + * URL کامل تصویر — همان قرارداد قبلی API (src = آدرس قابل نمایش). + */ + public function getSrcAttribute(): ?string + { + return self::publicUrl($this->attributes['src'] ?? null); + } + + public function getFullSrcAttribute(): ?string + { + return $this->src; + } + + public static function publicUrl(?string $path): ?string + { + if ($path === null || trim($path) === '') { + return null; + } + + $trimmed = trim($path); + + if (preg_match('/^https?:\/\//i', $trimmed)) { + return self::rewriteWrongPublicUrl($trimmed) ?? $trimmed; + } + + $relative = self::normalizeRelativeStoragePath($trimmed); + $base = self::resolvePublicBaseUrl(); + if ($relative === '') { + return null; + } + if ($base === '') { + return $relative; + } + + return $base.'/'.$relative; + } + + /** + * مسیر نسبی داخل public/storage — حتی اگر قبلاً URL کامل اشتباه در DB ذخیره شده باشد. + */ + public static function normalizeRelativeStoragePath(string $path): string + { + $path = trim($path); + + if (preg_match('#/storage/(.+)$#i', $path, $matches)) { + return 'storage/'.ltrim($matches[1], '/'); + } + + $relative = ltrim($path, '/'); + + if (! str_starts_with($relative, 'storage/')) { + $relative = 'storage/'.$relative; + } + + return $relative; + } + + /** + * اصلاح URLهای قدیمی: https://site.ir/storage/... → https://site.ir/server/storage/... + */ + public static function rewriteWrongPublicUrl(string $url): ?string + { + if (! preg_match('#^(https?://[^/]+)/storage/(.+)$#i', $url, $matches)) { + return null; + } + + $base = self::resolvePublicBaseUrl(); + if ($base === '') { + return null; + } + + if (str_contains($base, '/server') && ! str_contains($matches[1].'/storage/', '/server/storage/')) { + return $base.'/storage/'.$matches[2]; + } + + return null; + } + + /** + * پایهٔ URL فایل‌های storage. + * در درخواست HTTP، دامنهٔ همان درخواست اولویت دارد (جلوگیری از URL اشتباه وقتی settings دامنهٔ ماژول دیگر است). + */ + public static function resolvePublicBaseUrl(): string + { + $fromRequest = self::baseUrlFromRequest(); + if ($fromRequest !== '') { + return $fromRequest; + } + + $fromSettings = self::baseUrlFromSettings(); + if ($fromSettings !== '') { + return self::ensureAbsoluteUrl($fromSettings); + } + + $domain = config('app.domain'); + if (is_string($domain) && $domain !== '' && ! str_contains($domain, 'localhost')) { + return self::ensureAbsoluteUrl(self::ensureServerPublicBase(rtrim($domain, '/'))); + } + + $appUrl = config('app.url'); + if (is_string($appUrl) && $appUrl !== '' && ! str_contains($appUrl, 'localhost')) { + return self::ensureAbsoluteUrl(self::ensureServerPublicBase(rtrim($appUrl, '/'))); + } + + return ''; + } + + private static function baseUrlFromRequest(): string + { + try { + if (app()->bound('request')) { + $request = request(); + $host = $request?->getSchemeAndHttpHost(); + if (is_string($host) && $host !== '' && ! str_contains($host, 'localhost')) { + return self::ensureAbsoluteUrl(self::ensureServerPublicBase($host)); + } + } + } catch (\Throwable) { + } + + return ''; + } + + private static function ensureAbsoluteUrl(string $base): string + { + $base = rtrim(trim($base), '/'); + if ($base === '') { + return ''; + } + + if (! preg_match('/^https?:\/\//i', $base)) { + $base = 'https://'.ltrim($base, '/'); + } + + return $base; + } + + private static function baseUrlFromSettings(): string + { + try { + $rows = Setting::query() + ->whereIn('key', ['bace_url', 'server_url', 'admin_url', 'app_url']) + ->where('is_active', 1) + ->pluck('value', 'key'); + + foreach (['server_url', 'bace_url'] as $key) { + $value = trim((string) ($rows[$key] ?? '')); + if ($value !== '') { + return rtrim($value, '/'); + } + } + + $adminUrl = trim((string) ($rows['admin_url'] ?? '')); + if ($adminUrl !== '' && preg_match('#/admin#i', $adminUrl)) { + return rtrim(preg_replace('#/admin/?$#i', '/server', rtrim($adminUrl, '/')), '/'); + } + + $siteUrl = trim((string) ($rows['app_url'] ?? '')); + if ($siteUrl !== '') { + $siteUrl = rtrim($siteUrl, '/'); + if (! preg_match('#/server$#i', $siteUrl)) { + $siteUrl .= '/server'; + } + + return $siteUrl; + } + } catch (\Throwable) { + } + + return ''; + } + + private static function ensureServerPublicBase(string $base): string + { + if (preg_match('#/(server|api)(/|$)#i', $base)) { + return rtrim($base, '/'); + } + + return rtrim($base, '/').'/server'; + } +}