fixed buy and sell

This commit is contained in:
2026-07-09 13:37:03 +03:30
parent eb48179b2a
commit af6f9a2fee
+212 -212
View File
@@ -1,212 +1,212 @@
<?php <?php
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
class File extends Model class File extends Model
{ {
use HasFactory, Selector; use HasFactory, Selector;
protected $fillable = [ protected $fillable = [
'original_name', 'original_name',
'title', 'title',
'ext', 'ext',
'src', 'src',
'size', 'size',
'user_id', 'user_id',
'type', 'type',
'has_thumb', 'has_thumb',
'url', 'url',
]; ];
protected $casts = [ protected $casts = [
'has_thumb' => 'boolean', 'has_thumb' => 'boolean',
]; ];
protected $appends = [ protected $appends = [
'full_src', 'full_src',
]; ];
/** /**
* URL کامل تصویر — همان قرارداد قبلی API (src = آدرس قابل نمایش). * URL کامل تصویر — همان قرارداد قبلی API (src = آدرس قابل نمایش).
*/ */
public function getSrcAttribute(): ?string public function getSrcAttribute(): ?string
{ {
return self::publicUrl($this->attributes['src'] ?? null); return self::publicUrl($this->attributes['src'] ?? null);
} }
public function getFullSrcAttribute(): ?string public function getFullSrcAttribute(): ?string
{ {
return $this->src; return $this->src;
} }
public static function publicUrl(?string $path): ?string public static function publicUrl(?string $path): ?string
{ {
if ($path === null || trim($path) === '') { if ($path === null || trim($path) === '') {
return null; return null;
} }
$trimmed = trim($path); $trimmed = trim($path);
if (preg_match('/^https?:\/\//i', $trimmed)) { if (preg_match('/^https?:\/\//i', $trimmed)) {
return self::rewriteWrongPublicUrl($trimmed) ?? $trimmed; return self::rewriteWrongPublicUrl($trimmed) ?? $trimmed;
} }
$relative = self::normalizeRelativeStoragePath($trimmed); $relative = self::normalizeRelativeStoragePath($trimmed);
$base = self::resolvePublicBaseUrl(); $base = self::resolvePublicBaseUrl();
if ($relative === '') { if ($relative === '') {
return null; return null;
} }
if ($base === '') { if ($base === '') {
return $relative; return $relative;
} }
return $base.'/'.$relative; return $base.'/'.$relative;
} }
/** /**
* مسیر نسبی داخل public/storage — حتی اگر قبلاً URL کامل اشتباه در DB ذخیره شده باشد. * مسیر نسبی داخل public/storage — حتی اگر قبلاً URL کامل اشتباه در DB ذخیره شده باشد.
*/ */
public static function normalizeRelativeStoragePath(string $path): string public static function normalizeRelativeStoragePath(string $path): string
{ {
$path = trim($path); $path = trim($path);
if (preg_match('#/storage/(.+)$#i', $path, $matches)) { if (preg_match('#/storage/(.+)$#i', $path, $matches)) {
return 'storage/'.ltrim($matches[1], '/'); return 'storage/'.ltrim($matches[1], '/');
} }
$relative = ltrim($path, '/'); $relative = ltrim($path, '/');
if (! str_starts_with($relative, 'storage/')) { if (! str_starts_with($relative, 'storage/')) {
$relative = 'storage/'.$relative; $relative = 'storage/'.$relative;
} }
return $relative; return $relative;
} }
/** /**
* اصلاح URLهای قدیمی: https://site.ir/storage/... → https://site.ir/server/storage/... * اصلاح URLهای قدیمی: https://site.ir/storage/... → https://site.ir/server/storage/...
*/ */
public static function rewriteWrongPublicUrl(string $url): ?string public static function rewriteWrongPublicUrl(string $url): ?string
{ {
if (! preg_match('#^(https?://[^/]+)/storage/(.+)$#i', $url, $matches)) { if (! preg_match('#^(https?://[^/]+)/storage/(.+)$#i', $url, $matches)) {
return null; return null;
} }
$base = self::resolvePublicBaseUrl(); $base = self::resolvePublicBaseUrl();
if ($base === '') { if ($base === '') {
return null; return null;
} }
if (str_contains($base, '/server') && ! str_contains($matches[1].'/storage/', '/server/storage/')) { if (str_contains($base, '/server') && ! str_contains($matches[1].'/storage/', '/server/storage/')) {
return $base.'/storage/'.$matches[2]; return $base.'/storage/'.$matches[2];
} }
return null; return null;
} }
/** /**
* پایهٔ URL فایل‌های storage. * پایهٔ URL فایل‌های storage.
* در درخواست HTTP، دامنهٔ همان درخواست اولویت دارد (جلوگیری از URL اشتباه وقتی settings دامنهٔ ماژول دیگر است). * در درخواست HTTP، دامنهٔ همان درخواست اولویت دارد (جلوگیری از URL اشتباه وقتی settings دامنهٔ ماژول دیگر است).
*/ */
public static function resolvePublicBaseUrl(): string public static function resolvePublicBaseUrl(): string
{ {
$fromRequest = self::baseUrlFromRequest(); $fromRequest = self::baseUrlFromRequest();
if ($fromRequest !== '') { if ($fromRequest !== '') {
return $fromRequest; return $fromRequest;
} }
$fromSettings = self::baseUrlFromSettings(); $fromSettings = self::baseUrlFromSettings();
if ($fromSettings !== '') { if ($fromSettings !== '') {
return self::ensureAbsoluteUrl($fromSettings); return self::ensureAbsoluteUrl($fromSettings);
} }
$domain = config('app.domain'); $domain = config('app.domain');
if (is_string($domain) && $domain !== '' && ! str_contains($domain, 'localhost')) { if (is_string($domain) && $domain !== '' && ! str_contains($domain, 'localhost')) {
return self::ensureAbsoluteUrl(self::ensureServerPublicBase(rtrim($domain, '/'))); return self::ensureAbsoluteUrl(self::ensureServerPublicBase(rtrim($domain, '/')));
} }
$appUrl = config('app.url'); $appUrl = config('app.url');
if (is_string($appUrl) && $appUrl !== '' && ! str_contains($appUrl, 'localhost')) { if (is_string($appUrl) && $appUrl !== '' && ! str_contains($appUrl, 'localhost')) {
return self::ensureAbsoluteUrl(self::ensureServerPublicBase(rtrim($appUrl, '/'))); return self::ensureAbsoluteUrl(self::ensureServerPublicBase(rtrim($appUrl, '/')));
} }
return ''; return '';
} }
private static function baseUrlFromRequest(): string private static function baseUrlFromRequest(): string
{ {
try { try {
if (app()->bound('request')) { if (app()->bound('request')) {
$request = request(); $request = request();
$host = $request?->getSchemeAndHttpHost(); $host = $request?->getSchemeAndHttpHost();
if (is_string($host) && $host !== '' && ! str_contains($host, 'localhost')) { if (is_string($host) && $host !== '' && ! str_contains($host, 'localhost')) {
return self::ensureAbsoluteUrl(self::ensureServerPublicBase($host)); return self::ensureAbsoluteUrl(self::ensureServerPublicBase($host));
} }
} }
} catch (\Throwable) { } catch (\Throwable) {
} }
return ''; return '';
} }
private static function ensureAbsoluteUrl(string $base): string private static function ensureAbsoluteUrl(string $base): string
{ {
$base = rtrim(trim($base), '/'); $base = rtrim(trim($base), '/');
if ($base === '') { if ($base === '') {
return ''; return '';
} }
if (! preg_match('/^https?:\/\//i', $base)) { if (! preg_match('/^https?:\/\//i', $base)) {
$base = 'https://'.ltrim($base, '/'); $base = 'https://'.ltrim($base, '/');
} }
return $base; return $base;
} }
private static function baseUrlFromSettings(): string private static function baseUrlFromSettings(): string
{ {
try { try {
$rows = Setting::query() $rows = Setting::query()
->whereIn('key', ['bace_url', 'server_url', 'admin_url', 'app_url']) ->whereIn('key', ['bace_url', 'server_url', 'admin_url', 'app_url'])
->where('is_active', 1) ->where('is_active', 1)
->pluck('value', 'key'); ->pluck('value', 'key');
foreach (['server_url', 'bace_url'] as $key) { foreach (['server_url', 'bace_url'] as $key) {
$value = trim((string) ($rows[$key] ?? '')); $value = trim((string) ($rows[$key] ?? ''));
if ($value !== '') { if ($value !== '') {
return rtrim($value, '/'); return rtrim($value, '/');
} }
} }
$adminUrl = trim((string) ($rows['admin_url'] ?? '')); $adminUrl = trim((string) ($rows['admin_url'] ?? ''));
if ($adminUrl !== '' && preg_match('#/admin#i', $adminUrl)) { if ($adminUrl !== '' && preg_match('#/admin#i', $adminUrl)) {
return rtrim(preg_replace('#/admin/?$#i', '/server', rtrim($adminUrl, '/')), '/'); return rtrim(preg_replace('#/admin/?$#i', '/server', rtrim($adminUrl, '/')), '/');
} }
$siteUrl = trim((string) ($rows['app_url'] ?? '')); $siteUrl = trim((string) ($rows['app_url'] ?? ''));
if ($siteUrl !== '') { if ($siteUrl !== '') {
$siteUrl = rtrim($siteUrl, '/'); $siteUrl = rtrim($siteUrl, '/');
if (! preg_match('#/server$#i', $siteUrl)) { if (! preg_match('#/server$#i', $siteUrl)) {
$siteUrl .= '/server'; $siteUrl .= '/server';
} }
return $siteUrl; return $siteUrl;
} }
} catch (\Throwable) { } catch (\Throwable) {
} }
return ''; return '';
} }
private static function ensureServerPublicBase(string $base): string private static function ensureServerPublicBase(string $base): string
{ {
if (preg_match('#/(server|api)(/|$)#i', $base)) { if (preg_match('#/(server|api)(/|$)#i', $base)) {
return rtrim($base, '/'); return rtrim($base, '/');
} }
return rtrim($base, '/').'/server'; return rtrim($base, '/').'/server';
} }
} }