setModel($model); $modelScopes = $model->getGlobalScopes(); foreach ($modelScopes as $key => $value) { $query->withGlobalScope($key, $value); } foreach (Filter::process(Filter::getQueryAdditionalRelationsFilterName(), []) as $with) { $query->with($with); } QueryHelper::apply($query, $model, $filter); $sortDirection = SortDirection::tryFrom($filter['orderBy'][1])?->value ?? 'asc'; $query->orderBy('id', $sortDirection); return Filter::process( Filter::getQueryFilterName(), $query ); } private function getCollectionFromModel(array $requestData, string $model): LengthAwarePaginator { if ($model === TaskComment::class) { $requestData['with'][] = 'attachmentsRelation'; $requestData['with'][] = 'attachmentsRelation.user:id,full_name'; } $itemsQuery = $this->getQueryBuilder($requestData, $model); $items = $itemsQuery->paginate(30); Filter::process( Filter::getActionFilterName(), $items, ); return $items; } /** * @param ShowTaskActivityRequest $request * @return JsonResponse * @throws Exception */ public function index(ShowTaskActivityRequest $request): JsonResponse { $requestData = Filter::process(Filter::getRequestFilterName(), $request->validated()); $requestedActivity = ActivityType::from($requestData['type']); CatEvent::dispatch(Filter::getBeforeActionEventName(), $requestData); $items = []; $total = 0; $perPage = 0; if ($requestedActivity === ActivityType::ALL) { $taskComments = $this->getCollectionFromModel($requestData, TaskComment::class); $taskHistory = $this->getCollectionFromModel($requestData, TaskHistory::class); $total = $taskComments->total() + $taskHistory->total(); $perPage = $taskComments->perPage() + $taskHistory->perPage(); $sortDirection = SortDirection::tryFrom($requestData['orderBy'][1])?->value ?? 'asc'; $items = collect(array_merge($taskComments->items(), $taskHistory->items()))->sortBy([ fn ($a, $b) => $sortDirection === 'asc' ? strtotime($a['created_at']) <=> strtotime($b['created_at']) : strtotime($b['created_at']) <=> strtotime($a['created_at']), ], SORT_REGULAR, $sortDirection === 'desc'); } elseif ($requestedActivity === ActivityType::HISTORY) { $taskHistory = $this->getCollectionFromModel($requestData, TaskHistory::class); $total = $taskHistory->total(); $perPage = $taskHistory->perPage(); $items = $taskHistory->items(); } elseif ($requestedActivity === ActivityType::COMMENTS) { $taskComments = $this->getCollectionFromModel($requestData, TaskComment::class); $total = $taskComments->total(); $perPage = $taskComments->perPage(); $items = $taskComments->items(); } CatEvent::dispatch(Filter::getAfterActionEventName(), [$items, $requestData]); return responder()->success(new LengthAwarePaginator($items, $total, $perPage))->respond(); } }