Fix API reliability and CORS config for hosted deployment

هذا الالتزام موجود في:
Abdul Kareem
2026-02-22 01:17:35 +03:00
الأصل cc11f2e063
التزام 090427cf2c
20 ملفات معدلة مع 267 إضافات و22 حذوفات

عرض الملف

@@ -11,6 +11,7 @@ use App\Models\Venue;
use App\Models\VenueImage;
use App\Models\VenueTable;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Schema;
@@ -18,6 +19,9 @@ use Illuminate\Validation\ValidationException;
class VenueController extends Controller
{
private ?bool $hasInlineVenueArraysCache = null;
private ?bool $hasStructuredVenueDataCache = null;
// LIST VENUES (customer)
public function index(Request $request)
{
@@ -129,6 +133,8 @@ class VenueController extends Controller
// LIST VENUES (admin)
public function adminIndex(Request $request)
{
@set_time_limit(120);
$ownerColumn = Venue::ownerColumn();
$validated = $request->validate([
'search' => 'nullable|string|max:255',
@@ -145,7 +151,7 @@ class VenueController extends Controller
$q->where('is_active', true);
},
]);
$this->applyVenueRelations($query);
// Keep admin list lightweight; loading full relations here can timeout.
if (! empty($validated['search'])) {
$query->where('name', 'like', '%' . $validated['search'] . '%');
@@ -171,6 +177,8 @@ class VenueController extends Controller
// CREATE VENUE (admin)
public function adminStore(Request $request)
{
@set_time_limit(120);
$validated = $request->validate([
'vendor_id' => 'nullable|integer|exists:users,id',
'name' => 'required|string|max:255',
@@ -268,6 +276,8 @@ class VenueController extends Controller
// UPDATE VENUE (admin)
public function adminUpdate(Request $request, int $id)
{
@set_time_limit(120);
$validated = $request->validate([
'vendor_id' => 'nullable|integer|exists:users,id',
'name' => 'sometimes|required|string|max:255',
@@ -542,6 +552,10 @@ class VenueController extends Controller
}
if ($this->hasStructuredVenueData()) {
if (! $venue->relationLoaded('amenitiesRelation')) {
return [];
}
return ($venue->amenitiesRelation ?? collect())
->pluck('name')
->values()
@@ -558,6 +572,10 @@ class VenueController extends Controller
}
if ($this->hasStructuredVenueData()) {
if (! $venue->relationLoaded('images')) {
return [];
}
return ($venue->images ?? collect())
->sortBy('sort_order')
->pluck('url')
@@ -575,6 +593,10 @@ class VenueController extends Controller
}
if ($this->hasStructuredVenueData()) {
if (! $venue->relationLoaded('offersRelation')) {
return [];
}
return ($venue->offersRelation ?? collect())
->map(fn (Offer $offer) => [
'title' => $offer->title,
@@ -591,17 +613,48 @@ class VenueController extends Controller
private function hasInlineVenueArrays(): bool
{
return Schema::hasColumn('venues', 'amenities')
&& Schema::hasColumn('venues', 'image_urls')
&& Schema::hasColumn('venues', 'offers');
if ($this->hasInlineVenueArraysCache !== null) {
return $this->hasInlineVenueArraysCache;
}
$this->hasInlineVenueArraysCache = $this->rememberSchemaFlag(
'schema:venues:inline-arrays:v1',
fn () => Schema::hasColumn('venues', 'amenities')
&& Schema::hasColumn('venues', 'image_urls')
&& Schema::hasColumn('venues', 'offers')
);
return $this->hasInlineVenueArraysCache;
}
private function hasStructuredVenueData(): bool
{
return Schema::hasTable('venue_images')
&& Schema::hasTable('offers')
&& Schema::hasTable('venue_amenities')
&& Schema::hasTable('amenities');
if ($this->hasStructuredVenueDataCache !== null) {
return $this->hasStructuredVenueDataCache;
}
$this->hasStructuredVenueDataCache = $this->rememberSchemaFlag(
'schema:venues:structured-data:v1',
fn () => Schema::hasTable('venue_images')
&& Schema::hasTable('offers')
&& Schema::hasTable('venue_amenities')
&& Schema::hasTable('amenities')
);
return $this->hasStructuredVenueDataCache;
}
private function rememberSchemaFlag(string $cacheKey, callable $resolver): bool
{
try {
return (bool) Cache::remember(
$cacheKey,
now()->addMinutes(30),
fn () => (bool) $resolver()
);
} catch (\Throwable) {
return (bool) $resolver();
}
}
private function inlineVenuePayload(array $amenities, array $imageUrls, array $offers): array