fix(projects): Plan 5 Task 2 code-review fixes (2 Important + 2 Minor)
I-1/M-1: introduce resolvedSupplierProjects() private helper on Project model; rewrite aggregateSyncStatus(), aggregateLastSyncedAt(), getSupplierLinks() to read from eager-loaded supplierB1/B2/B3 relations instead of SupplierProject::find() — eliminates up to 120 SELECTs/page. I-2: aggregateLastSyncedAt() now uses sortBy(timestamp) instead of Collection::min() on Carbon objects (string-comparison was unreliable). M-2: add explanatory comment on intval+array_filter silent-drop behaviour in the ?ids batch-fetch path. M-3: new test — ?ids batch silently excludes foreign-tenant project IDs. M-4: new test — show returns 200 for archived project (read preserved). PHPStan baseline updated: 2 new test functions raise actingAs() count 7→9. Tests: 9/9 passed (33 assertions). Larastan: 0 errors. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -24,10 +24,15 @@ class ProjectController extends Controller
|
||||
/** GET /api/projects */
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$query = Project::query()->where('tenant_id', $request->user()->tenant_id);
|
||||
$query = Project::query()
|
||||
->with(['supplierB1', 'supplierB2', 'supplierB3']) // eager-load to avoid N+1 in aggregation helpers
|
||||
->where('tenant_id', $request->user()->tenant_id);
|
||||
|
||||
// Batch-fetch по ids — возвращает без пагинации (для dropdown'ов и т.п.)
|
||||
if ($ids = $request->query('ids')) {
|
||||
// '?ids=' batch fetch. Non-numeric and zero values silently dropped via intval+filter
|
||||
// (intval('abc')=0 → array_filter drops 0). Acceptable for a read-only dropdown:
|
||||
// invalid input produces empty result, not 422.
|
||||
$idArray = array_filter(array_map('intval', explode(',', (string) $ids)));
|
||||
$items = $query->whereIn('id', $idArray)->get();
|
||||
|
||||
@@ -76,7 +81,9 @@ class ProjectController extends Controller
|
||||
/** GET /api/projects/{id} */
|
||||
public function show(Request $request, int $id): JsonResponse
|
||||
{
|
||||
$project = Project::where('tenant_id', $request->user()->tenant_id)->findOrFail($id);
|
||||
$project = Project::with(['supplierB1', 'supplierB2', 'supplierB3']) // eager-load to avoid N+1
|
||||
->where('tenant_id', $request->user()->tenant_id)
|
||||
->findOrFail($id);
|
||||
|
||||
return response()->json(['data' => new ProjectResource($project)]);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user