validated()); $itemsQuery = $this->getQuery($requestData); CatEvent::dispatch(Filter::getBeforeActionEventName(), $requestData); $items = $request->header('X-Paginate', true) !== 'false' ? $itemsQuery->paginate() : $itemsQuery->get(); Filter::process( Filter::getActionFilterName(), $items, ); CatEvent::dispatch(Filter::getAfterActionEventName(), [$items, $requestData]); return responder()->success($items)->respond(); } /** * @throws Exception */ protected function getQuery(array $filter = []): Builder { $model = static::MODEL; $model = new $model; $query = new Builder($model::getQuery()); $query->setModel($model); $modelScopes = $model->getGlobalScopes(); foreach ($modelScopes as $key => $value) { $query->withGlobalScope($key, $value); } foreach (Filter::process(Filter::getQueryAdditionalRelationsFilterName(), []) as $with) { $query->with($with); } foreach (Filter::process(Filter::getQueryAdditionalRelationsSumFilterName(), []) as $withSum) { $query->withSum(...$withSum); } QueryHelper::apply($query, $model, $filter); return Filter::process( Filter::getQueryFilterName(), $query ); } /** * @throws Throwable */ public function _create(CattrFormRequest $request): JsonResponse { $requestData = Filter::process(Filter::getRequestFilterName(), $request->validated()); CatEvent::dispatch(Filter::getBeforeActionEventName(), [$requestData]); /** @var Model $cls */ $cls = static::MODEL; $item = Filter::process( Filter::getActionFilterName(), $cls::create($requestData), ); CatEvent::dispatch(Filter::getAfterActionEventName(), [$item, $requestData]); return responder()->success($item)->respond(); } /** * @throws Throwable */ public function _edit(CattrFormRequest $request): JsonResponse { $requestData = Filter::process(Filter::getRequestFilterName(), $request->validated()); throw_unless(is_int($request->get('id')), ValidationException::withMessages(['Invalid id'])); $itemsQuery = $this->getQuery(); /** @var Model $item */ $item = $itemsQuery->get()->collect()->firstWhere('id', $request->get('id')); if (!$item) { /** @var Model $cls */ $cls = static::MODEL; throw_if($cls::find($request->get('id'))?->count(), new AccessDeniedHttpException); throw new NotFoundHttpException; } CatEvent::dispatch(Filter::getBeforeActionEventName(), [$item, $requestData]); $item = Filter::process(Filter::getActionFilterName(), $item->fill($requestData)); $item->save(); CatEvent::dispatch(Filter::getAfterActionEventName(), [$item, $requestData]); return responder()->success($item)->respond(); } /** * @throws Throwable */ public function _destroy(CattrFormRequest $request): JsonResponse { $requestId = Filter::process(Filter::getRequestFilterName(), $request->validated('id')); throw_unless(is_int($requestId), ValidationException::withMessages(['Invalid id'])); $itemsQuery = $this->getQuery(['where' => ['id' => $requestId]]); /** @var Model $item */ $item = $itemsQuery->first(); if (!$item) { /** @var Model $cls */ $cls = static::MODEL; throw_if($cls::find($requestId)?->count(), new AccessDeniedHttpException); throw new NotFoundHttpException; } CatEvent::dispatch(Filter::getBeforeActionEventName(), $requestId); CatEvent::dispatch( Filter::getAfterActionEventName(), tap( Filter::process(Filter::getActionFilterName(), $item), static fn ($item) => $item->delete(), ) ); return responder()->success()->respond(204); } /** * @throws Exception */ protected function _count(CattrFormRequest $request): JsonResponse { $requestData = Filter::process(Filter::getRequestFilterName(), $request->validated()); CatEvent::dispatch(Filter::getBeforeActionEventName(), $requestData); $itemsQuery = $this->getQuery($requestData); $count = Filter::process(Filter::getActionFilterName(), $itemsQuery->count()); CatEvent::dispatch(Filter::getAfterActionEventName(), [$count, $requestData]); return responder()->success(['total' => $count])->respond(); } /** * @throws Throwable */ protected function _show(CattrFormRequest $request): JsonResponse { $requestData = Filter::process(Filter::getRequestFilterName(), $request->validated()); $itemId = (int)$requestData['id']; throw_unless($itemId, ValidationException::withMessages(['Invalid id'])); $filters = [ 'where' => ['id' => $itemId] ]; if (!empty($requestData['with'])) { $filters['with'] = $requestData['with']; } if (!empty($requestData['withSum'])) { $filters['withSum'] = $requestData['withSum']; } CatEvent::dispatch(Filter::getBeforeActionEventName(), $filters); $itemsQuery = $this->getQuery($filters ?: []); $item = Filter::process(Filter::getActionFilterName(), $itemsQuery->first()); throw_unless($item, new NotFoundHttpException); CatEvent::dispatch(Filter::getAfterActionEventName(), [$item, $filters]); return responder()->success($item)->respond(); } }