diff --git a/app/Http/Controllers/api/BylawApiController.php b/app/Http/Controllers/api/BylawApiController.php index 95fd134..a880a77 100644 --- a/app/Http/Controllers/api/BylawApiController.php +++ b/app/Http/Controllers/api/BylawApiController.php @@ -80,7 +80,7 @@ class BylawApiController extends Controller $perPage = min(max((int) $request->input('per_page', 15), 10), 100); $paginator = $query->paginate($perPage); - // BULLETPROOF NODE FETCHING + // واکشی بهینه گره‌ها از دیتابیس $documentIds = collect($paginator->items())->pluck('id')->toArray(); $allNodes = collect(); if (!empty($documentIds)) { @@ -91,8 +91,10 @@ class BylawApiController extends Controller } $items = collect($paginator->items())->map(function ($item) use ($allNodes) { - // Safely filter nodes belonging ONLY to this specific document - $itemNodes = $allNodes->where('document_id', $item->id); + // حل مشکل فیلتر سخت‌گیرانه (Strict) در کالکشن‌ها + $itemNodes = $allNodes->filter(function($node) use ($item) { + return $node->document_id == $item->id; + }); return $this->formatBylaw($item, $itemNodes); }); @@ -120,7 +122,7 @@ class BylawApiController extends Controller ], 404); } - // Fetch nodes using raw DB + // واکشی خام گره‌ها برای توضیحات کلی $rawNodes = DB::table('bylaw_nodes') ->where('document_id', $bylaw->id) ->orderBy('sort_order', 'asc') @@ -211,7 +213,6 @@ class BylawApiController extends Controller $perPage = min(max((int) $request->input('per_page', 15), 10), 100); $paginator = $query->paginate($perPage); - // BULLETPROOF NODE FETCHING $documentIds = collect($paginator->items())->pluck('id')->toArray(); $allNodes = collect(); if (!empty($documentIds)) { @@ -222,7 +223,9 @@ class BylawApiController extends Controller } $items = collect($paginator->items())->map(function ($item) use ($allNodes) { - $itemNodes = $allNodes->where('document_id', $item->id); + $itemNodes = $allNodes->filter(function($node) use ($item) { + return $node->document_id == $item->id; + }); return $this->formatBylaw($item, $itemNodes); }); @@ -262,7 +265,6 @@ class BylawApiController extends Controller $count = $query->count(); $items = $query->orderBy('approval_date', 'desc')->take(5)->get(); - // BULLETPROOF NODE FETCHING $documentIds = $items->pluck('id')->toArray(); $allNodes = collect(); if (!empty($documentIds)) { @@ -273,7 +275,9 @@ class BylawApiController extends Controller } $formattedItems = $items->map(function ($item) use ($allNodes) { - $itemNodes = $allNodes->where('document_id', $item->id); + $itemNodes = $allNodes->filter(function($node) use ($item) { + return $node->document_id == $item->id; + }); return $this->formatBylaw($item, $itemNodes); }); @@ -345,7 +349,9 @@ class BylawApiController extends Controller } $results = array_values(array_map(function($item) use ($allNodes) { - $itemNodes = $allNodes->where('document_id', $item->id); + $itemNodes = $allNodes->filter(function($node) use ($item) { + return $node->document_id == $item->id; + }); return $this->formatBylaw($item, $itemNodes); }, $itemsToFormat)); @@ -365,13 +371,13 @@ class BylawApiController extends Controller $isLocked = $this->isLockedForCurrentUser($item); $description = $item->description; - // Check if description is practically empty (less than 5 chars = garbage HTML) $cleanDesc = trim(str_replace([' ', '‌', "\r", "\n", "\t", ' '], '', strip_tags($description ?? ''))); + // اگر فیلد اصلی description خالی بود (که در خزش فعلی خالی است)، به سراغ متن اصلی می‌رویم if (strlen($cleanDesc) < 5) { - // Absolute Safety Net: If somehow $itemNodes is still null, FORCE a direct query for this specific ID. - if ($itemNodes === null) { + // شبکه اطمینان: اگر متغیر حاوی گره‌ها به هر دلیلی خالی بود، مستقیماً از دیتابیس می‌گیریم + if ($itemNodes === null || (is_countable($itemNodes) && count($itemNodes) === 0)) { $itemNodes = DB::table('bylaw_nodes') ->where('document_id', $item->id) ->orderBy('sort_order', 'asc') @@ -380,8 +386,10 @@ class BylawApiController extends Controller $nodeContents = []; foreach ($itemNodes as $node) { - // EXPLICITLY GET node_content - $content = trim(strip_tags($node->node_content ?? '')); + // استخراج امن متن از آبجکت یا آرایه (برای جلوگیری از خطاهای احتمالی) + $contentRaw = is_array($node) ? ($node['node_content'] ?? '') : ($node->node_content ?? ''); + + $content = trim(strip_tags($contentRaw)); if (!empty($content)) { $nodeContents[] = $content; } @@ -408,7 +416,7 @@ class BylawApiController extends Controller 'bylaw_type' => $item->bylaw_type, 'global_status' => $item->global_status, 'pdf_file_url' => $isLocked ? null : ($item->pdf_file_path ? asset('storage/' . $item->pdf_file_path) : null), - 'description' => $isLocked ? null : $description, + 'description' => $isLocked ? null : $description, // متن کامل از node_content اینجا قرار می‌گیرد 'is_locked' => $isLocked, ]; }