From 231f4dce0726c36e0bdfec157ec344a11b3ec676 Mon Sep 17 00:00:00 2001 From: snipe Date: Thu, 26 Jan 2017 19:16:06 -0800 Subject: [PATCH] Basic components API --- .../Controllers/Api/ComponentsController.php | 69 +++++++++++++-- .../Controllers/Api/ConsumablesController.php | 2 +- app/Http/Controllers/ComponentsController.php | 56 ------------- .../Transformers/ComponentsTransformer.php | 66 +++++++++++++++ .../Transformers/ConsumablesTransformer.php | 2 +- app/Presenters/ComponentPresenter.php | 78 ----------------- app/Presenters/ConsumablePresenter.php | 83 ------------------- resources/views/components/index.blade.php | 17 ++-- resources/views/components/view.blade.php | 2 +- resources/views/consumables/index.blade.php | 4 +- resources/views/consumables/view.blade.php | 2 +- routes/api.php | 1 + 12 files changed, 145 insertions(+), 237 deletions(-) create mode 100644 app/Http/Transformers/ComponentsTransformer.php delete mode 100644 app/Presenters/ComponentPresenter.php delete mode 100644 app/Presenters/ConsumablePresenter.php diff --git a/app/Http/Controllers/Api/ComponentsController.php b/app/Http/Controllers/Api/ComponentsController.php index e45f17bc29..903182928f 100644 --- a/app/Http/Controllers/Api/ComponentsController.php +++ b/app/Http/Controllers/Api/ComponentsController.php @@ -4,6 +4,10 @@ namespace App\Http\Controllers\Api; use Illuminate\Http\Request; use App\Http\Controllers\Controller; +use App\Http\Transformers\ComponentsTransformer; +use App\Models\Component; +use App\Models\Company; + class ComponentsController extends Controller { @@ -15,9 +19,41 @@ class ComponentsController extends Controller * * @return \Illuminate\Http\Response */ - public function index() + public function index(Request $request) { - // + $this->authorize('view', Component::class); + $components = Company::scopeCompanyables(Component::select('components.*')->whereNull('components.deleted_at') + ->with('company', 'location', 'category')); + + if ($request->has('search')) { + $components = $components->TextSearch($request->input('search')); + } + + $offset = request('offset', 0); + $limit = request('limit', 50); + + $allowed_columns = ['id','name','min_amt','order_number','serial','purchase_date','purchase_cost','company','category','qty','location']; + $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; + $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; + + switch ($sort) { + case 'category': + $components = $components->OrderCategory($order); + break; + case 'location': + $components = $components->OrderLocation($order); + break; + case 'company': + $components = $components->OrderCompany($order); + break; + default: + $components = $components->orderBy($sort, $order); + break; + } + + $total = $components->count(); + $components = $components->skip($offset)->take($limit)->get(); + return (new ComponentsTransformer)->transformComponents($components, $total); } @@ -31,7 +67,14 @@ class ComponentsController extends Controller */ public function store(Request $request) { - // + $this->authorize('create', Component::class); + $component = new Component; + $component->fill($request->all()); + + if ($component->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $component, trans('admin/components/message.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $component->getErrors())); } /** @@ -43,7 +86,9 @@ class ComponentsController extends Controller */ public function show($id) { - // + $this->authorize('view', Component::class); + $component = Component::findOrFail($id); + return (new ComponentsTransformer)->transformComponent($component); } @@ -58,7 +103,15 @@ class ComponentsController extends Controller */ public function update(Request $request, $id) { - // + $this->authorize('edit', Component::class); + $component = Component::findOrFail($id); + $component->fill($request->all()); + + if ($component->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $component, trans('admin/components/message.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $component->getErrors())); } /** @@ -71,7 +124,11 @@ class ComponentsController extends Controller */ public function destroy($id) { - // + $this->authorize('delete', Component::class); + $component = Component::findOrFail($id); + $this->authorize('delete', $component); + $component->delete(); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/components/message.delete.success'))); } } diff --git a/app/Http/Controllers/Api/ConsumablesController.php b/app/Http/Controllers/Api/ConsumablesController.php index 8f608e67e2..24584193e2 100644 --- a/app/Http/Controllers/Api/ConsumablesController.php +++ b/app/Http/Controllers/Api/ConsumablesController.php @@ -34,7 +34,7 @@ class ConsumablesController extends Controller $offset = request('offset', 0); $limit = request('limit', 50); - $allowed_columns = ['id','name','order_number','min_amt','purchase_date','purchase_cost','company','category','model_number', 'item_no', 'manufacturer','location']; + $allowed_columns = ['id','name','order_number','min_amt','purchase_date','purchase_cost','company','category','model_number', 'item_no', 'manufacturer','location','qty']; $order = $request->input('order') === 'asc' ? 'asc' : 'desc'; $sort = in_array($request->input('sort'), $allowed_columns) ? $request->input('sort') : 'created_at'; diff --git a/app/Http/Controllers/ComponentsController.php b/app/Http/Controllers/ComponentsController.php index bbb2aee7f0..f176985e72 100644 --- a/app/Http/Controllers/ComponentsController.php +++ b/app/Http/Controllers/ComponentsController.php @@ -300,62 +300,6 @@ class ComponentsController extends Controller } - /** - * Generates the JSON response for accessories listing view. - * - * For debugging, see at /api/accessories/list - * - * @author [A. Gianotto] [] - * @since [v3.0] - * @return string JSON - **/ - public function getDatatable() - { - $this->authorize('view', Component::class); - $components = Company::scopeCompanyables(Component::select('components.*')->whereNull('components.deleted_at') - ->with('company', 'location', 'category')); - - if (Input::has('search')) { - $components = $components->TextSearch(Input::get('search')); - } - - $offset = request('offset', 0); - $limit = request('limit', 50); - - $allowed_columns = ['id','name','min_amt','order_number','serial','purchase_date','purchase_cost','companyName','category','total_qty']; - $order = Input::get('order') === 'asc' ? 'asc' : 'desc'; - $sort = in_array(Input::get('sort'), $allowed_columns) ? Input::get('sort') : 'created_at'; - - switch ($sort) { - case 'category': - $components = $components->OrderCategory($order); - break; - case 'location': - $components = $components->OrderLocation($order); - break; - case 'companyName': - $components = $components->OrderCompany($order); - break; - default: - $components = $components->orderBy($sort, $order); - break; - } - - $componentsCount = $components->count(); - $components = $components->skip($offset)->take($limit)->get(); - - $rows = array(); - - foreach ($components as $component) { - $rows[] = $component->present()->forDataTable(); - } - - $data = array('total' => $componentsCount, 'rows' => $rows); - - return $data; - - } - /** * Return JSON data to populate the components view, * diff --git a/app/Http/Transformers/ComponentsTransformer.php b/app/Http/Transformers/ComponentsTransformer.php new file mode 100644 index 0000000000..f1c4923d35 --- /dev/null +++ b/app/Http/Transformers/ComponentsTransformer.php @@ -0,0 +1,66 @@ +transformDatatables($array, $total); + } + + public function transformComponent (Component $component) + { + $transformed = [ + + 'id' => $component->id, + 'name' => e($component->name), + 'serial_number' => e($component->serial), + 'location' => ($component->location) ? + [ + 'id' => $component->location->id, + 'name' => $component->location->name + ] : null, + 'qty' => number_format($component->qty), + 'min_amt' => e($component->min_amt), + 'category' => ($component->category) ? + [ + 'id' => $component->category->id, + 'name' => e($component->category->name) + ] : null, + 'order_number' => e($component->order_number), + 'purchase_date' => $component->purchase_date, + 'purchase_cost' => Helper::formatCurrencyOutput($component->purchase_cost), + 'remaining' => $component->numRemaining(), + 'company' => ($component->company) ? + [ + 'id' => $component->company->id, + 'name' => e($component->company->name) + ] : null, + + ]; + return $transformed; + } + + + public function transformCheckedoutComponents (Collection $components_users, $total) + { + + $array = array(); + foreach ($components_users as $user) { + $array[] = (new UsersTransformer)->transformUser($user); + } + return (new DatatablesTransformer)->transformDatatables($array, $total); + } + + + +} diff --git a/app/Http/Transformers/ConsumablesTransformer.php b/app/Http/Transformers/ConsumablesTransformer.php index 691ac1c0f1..bfbdd0dd48 100644 --- a/app/Http/Transformers/ConsumablesTransformer.php +++ b/app/Http/Transformers/ConsumablesTransformer.php @@ -29,7 +29,7 @@ class ConsumablesTransformer 'min_amt' => $consumable->min_amt, 'model_number' => $consumable->model_number, 'name' => $consumable->name, - 'numRemaining' => $consumable->numRemaining(), + 'remaining' => $consumable->numRemaining(), 'order_number' => $consumable->order_number, 'purchase_cost' => Helper::formatCurrencyOutput($consumable->purchase_cost), 'purchase_date' => $consumable->purchase_date, diff --git a/app/Presenters/ComponentPresenter.php b/app/Presenters/ComponentPresenter.php deleted file mode 100644 index d8ad156481..0000000000 --- a/app/Presenters/ComponentPresenter.php +++ /dev/null @@ -1,78 +0,0 @@ -'; - if (Gate::allows('checkout', $this->model)) { - $actions .= Helper::generateDatatableButton('checkout', route('checkout/component', $this->id), $this->numRemaining() > 0); - } - - if (Gate::allows('update', $this->model)) { - $actions .= Helper::generateDatatableButton('edit', route('components.edit', $this->id)); - } - - if (Gate::allows('delete', $this->model)) { - $actions .= Helper::generateDatatableButton( - 'delete', - route('components.destroy', $this->id), - true, /* enabled */ - trans('admin/components/message.delete.confirm'), - $this->name - ); - } - - $actions .=''; - - $results = [ - 'checkbox' =>'
', - 'id' => $this->id, - 'name' => $this->nameUrl(), - 'serial_number' => $this->serial, - 'location' => $this->locationUrl(), - 'qty' => number_format($this->qty), - 'min_amt' => e($this->min_amt), - 'category' => $this->categoryUrl(), - 'order_number' => $this->order_number, - 'purchase_date' => $this->purchase_date, - 'purchase_cost' => Helper::formatCurrencyOutput($this->purchase_cost), - 'numRemaining' => $this->numRemaining(), - 'actions' => $actions, - 'companyName' => $this->companyUrl(), - ]; - - return $results; - } - - /** - * Link to this components name - * @return string - */ - public function nameUrl() - { - return (string) link_to_route('components.show', $this->name, $this->id); - } - /** - * Url to view this item. - * @return string - */ - public function viewUrl() - { - return route('components.show', $this->id); - } -} diff --git a/app/Presenters/ConsumablePresenter.php b/app/Presenters/ConsumablePresenter.php deleted file mode 100644 index 7c2be419c9..0000000000 --- a/app/Presenters/ConsumablePresenter.php +++ /dev/null @@ -1,83 +0,0 @@ -'; - if (Gate::allows('checkout', $this->model)) { - $actions .= Helper::generateDatatableButton('checkout', route('checkout/consumable', $this->id), $this->numRemaining() > 0); - } - - if (Gate::allows('update', $this->model)) { - $actions .= Helper::generateDatatableButton('edit', route('consumables.edit', $this->id)); - } - if (Gate::allows('delete', $this->model)) { - $actions .= Helper::generateDatatableButton( - 'delete', - route('consumables.destroy', $this->id), - true, /* enabled */ - trans('admin/consumables/message.delete.confirm'), - $this->name - ); - } - $actions .=''; - - $results = [ - 'actions' => $actions, - 'category' => $this->categoryUrl(), - 'companyName' => $this->companyUrl(), - 'id' => $this->id, - 'item_no' => $this->item_no, - 'location' => $this->locationUrl(), - 'manufacturer' => $this->manufacturerUrl(), - 'min_amt' => $this->min_amt, - 'model_number' => $this->model_number, - 'name' => $this->nameUrl(), - 'numRemaining' => $this->numRemaining(), - 'order_number' => $this->order_number, - 'purchase_cost' => Helper::formatCurrencyOutput($this->purchase_cost), - 'purchase_date' => $this->purchase_date, - 'qty' => $this->qty, - ]; - return $results; - } - - /** - * Displayable name of consumable - * @return string - */ - - public function name() - { - return $this->model->name; - } - - public function nameUrl() - { - return (string)link_to_route('consumables.show', $this->name, $this->id); - } - - /** - * Url to view this item. - * @return string - */ - public function viewUrl() - { - return route('consumables.show', $this->id); - } -} diff --git a/resources/views/components/index.blade.php b/resources/views/components/index.blade.php index d773302c99..9e54eb2399 100644 --- a/resources/views/components/index.blade.php +++ b/resources/views/components/index.blade.php @@ -44,20 +44,21 @@ > -
+ {{----}} + {{ trans('general.id') }} - {{ trans('admin/companies/table.title') }} - {{ trans('admin/components/table.title') }} + {{ trans('admin/companies/table.title') }} + {{ trans('admin/components/table.title') }} {{ trans('admin/hardware/form.serial') }} - {{ trans('general.location') }} - {{ trans('general.category') }} - {{ trans('admin/components/general.total') }} + {{ trans('general.location') }} + {{ trans('general.category') }} + {{ trans('admin/components/general.total') }} {{ trans('general.min_amt') }} - {{ trans('admin/components/general.remaining') }} + {{ trans('admin/components/general.remaining') }} {{ trans('admin/components/general.order') }} {{ trans('admin/components/general.date') }} {{ trans('admin/components/general.cost') }} - {{ trans('table.actions') }} + {{ trans('table.actions') }} diff --git a/resources/views/components/view.blade.php b/resources/views/components/view.blade.php index e67da4fcb3..18c327db0d 100644 --- a/resources/views/components/view.blade.php +++ b/resources/views/components/view.blade.php @@ -49,7 +49,7 @@ name="component_users" class="table table-striped snipe-table" id="table" - data-url="{{route('api.components.view', $component->id)}}" + data-url="{{route('api.components.show', $component->id)}}" data-cookie="true" data-click-to-select="true" data-cookie-id-table="componentDetailTable-{{ config('version.hash_version') }}" diff --git a/resources/views/consumables/index.blade.php b/resources/views/consumables/index.blade.php index 15eb5c4aa2..51be2c1001 100644 --- a/resources/views/consumables/index.blade.php +++ b/resources/views/consumables/index.blade.php @@ -36,8 +36,8 @@ {{ trans('admin/consumables/table.title') }} {{ trans('general.location') }} {{ trans('general.category') }} - {{ trans('admin/consumables/general.total') }} - {{ trans('admin/consumables/general.remaining') }} + {{ trans('admin/consumables/general.total') }} + {{ trans('admin/consumables/general.remaining') }} {{ trans('general.min_amt') }} {{ trans('general.manufacturer') }} {{ trans('general.model_no') }} diff --git a/resources/views/consumables/view.blade.php b/resources/views/consumables/view.blade.php index f24b39d3d4..7032d2c7a5 100644 --- a/resources/views/consumables/view.blade.php +++ b/resources/views/consumables/view.blade.php @@ -35,7 +35,7 @@ name="consumable_users" class="table table-striped snipe-table" id="table" - data-url="{{route('api.consumables.view', $consumable->id)}}" + data-url="{{route('api.consumables.show', $consumable->id)}}" data-cookie="true" data-click-to-select="true" data-cookie-id-table="consumableDetailTable-{{ config('version.hash_version') }}" diff --git a/routes/api.php b/routes/api.php index c5f2372ded..0249662fe9 100644 --- a/routes/api.php +++ b/routes/api.php @@ -209,6 +209,7 @@ Route::group(['prefix' => 'v1','namespace' => 'Api'], function () { [ 'index' => 'api.consumables.index', 'create' => 'api.consumables.create', + 'show' => 'api.consumables.show', 'destroy' => 'api.consumables.destroy' ], 'parameters' =>