model = $model; } public function index(Request $request): JsonResponse { $query = $this->model->query(); if (($val = $request->get('type')) && ($type = ObjectType::query()->where(['name' => $val])->first())) { $query->whereHas('type', function ($query) use ($val) { $query->where('name', $val)->orWhereHas('parent', function ($query) use ($val) { $query->where('name', $val); }); }); if (in_array('product', [$type->name, $type->parent->name ?? null]) && ($field = Field::byUuidOrName('specification-holder')->first())) { $field->applyFilter($query, $request->user()->companies->pluck('uuid')->all()); } } $filters = collect($request->has('filters') ? json_decode($request->get('filters'), true) : []); $filters->each(function($value, $prop) use($query) { if ($prop === 'search') $this->model->applySearchFilter($query, $value); elseif ($field = Field::byUuidOrName($prop)->first()) $field->applyFilter($query, $value); }); $query->orderBy('created_at', 'desc'); $paginator = $query->paginate(config('app.pagination_limit')); return fractal($paginator, new ObjectTransformer())->respond(); } public function show($id): JsonResponse { $model = $this->model->byUuid($id)->firstOrFail(); return fractal($model, new ObjectTransformer())->respond(); } public function store(Request $request): JsonResponse { $this->validate($request, [ 'type' => 'required', 'properties' => 'required|array' ]); $objectType = ObjectType::byUuidOrName($request->get('type'))->firstOrFail(); $model = $objectType->objects()->create($request->only('name') + ['owner_id' => $request->user()->id]); $model->setValues($request->get('properties')); if ($objectType->name === 'product') $model->setValue('specification-holder', $request->user()->selectedMember->company->uuid ?? null); return fractal($model, new ObjectTransformer())->respond(201); } public function update(Request $request, $uuid): JsonResponse { $model = $this->model->byUuid($uuid)->firstOrFail(); $this->validate($request, [ 'properties' => 'required|array' ]); $model->setValues($request->get('properties')); $model->update($request->only('name')); return fractal($model->fresh(), new ObjectTransformer())->respond(); } public function destroy(Request $request, $uuid): JsonResponse { $model = $this->model->byUuid($uuid)->firstOrFail(); $model->delete(); return response()->json(null, 204); } }