QR_code_generator/app/Http/Controllers/Api/Objects/ObjectsController.php

75 lines
3.1 KiB
PHP

<?php
namespace App\Http\Controllers\Api\Objects;
use App\Http\Controllers\Controller;
use App\Models\Objects\Field;
use App\Models\Objects\NirObject;
use App\Models\Objects\ObjectType;
use App\Transformers\Objects\ObjectTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class ObjectsController extends Controller {
protected NirObject $model;
public function __construct(NirObject $model) {
$this->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);
}
}