From b1d62cc4784ed69ddadb87cc8ecdc407dba3be24 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Wed, 16 Oct 2024 17:23:22 -0500 Subject: [PATCH 01/17] initial untested --- _ide_helper_actions.php | 44 +++ .../CreateCheckoutRequest.php | 75 ++++ app/Http/Controllers/ViewAssetsController.php | 59 +-- composer.json | 4 +- composer.lock | 346 +++++++++++++++++- 5 files changed, 470 insertions(+), 58 deletions(-) create mode 100644 _ide_helper_actions.php create mode 100644 app/Actions/CheckoutRequests/CreateCheckoutRequest.php diff --git a/_ide_helper_actions.php b/_ide_helper_actions.php new file mode 100644 index 0000000000..a420493954 --- /dev/null +++ b/_ide_helper_actions.php @@ -0,0 +1,44 @@ +user(); + + // Check if the asset exists and is requestable + if (is_null($asset = Asset::RequestableAssets()->find($assetId))) { + return redirect()->route('requestable-assets') + ->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')); + } + if (!Company::isCurrentUserHasAccess($asset)) { + return redirect()->route('requestable-assets') + ->with('error', trans('general.insufficient_permissions')); + } + + $data['item'] = $asset; + $data['target'] = auth()->user(); + $data['item_quantity'] = 1; + $settings = Setting::getSettings(); + + $logaction = new Actionlog(); + $logaction->item_id = $data['asset_id'] = $asset->id; + $logaction->item_type = $data['item_type'] = Asset::class; + $logaction->created_at = $data['requested_date'] = date('Y-m-d H:i:s'); + + if ($user->location_id) { + $logaction->location_id = $user->location_id; + } + $logaction->target_id = $data['user_id'] = auth()->id(); + $logaction->target_type = User::class; + + // If it's already requested, cancel the request. + if ($asset->isRequestedBy(auth()->user())) { + $asset->cancelRequest(); + $asset->decrement('requests_counter', 1); + + $logaction->logaction('request canceled'); + try { + $settings->notify(new RequestAssetCancelation($data)); + } catch (\Exception $e) { + Log::warning($e); + } + return redirect()->route('requestable-assets') + ->with('success')->with('success', trans('admin/hardware/message.requests.canceled')); + } + + $logaction->logaction('requested'); + $asset->request(); + $asset->increment('requests_counter', 1); + try { + $settings->notify(new RequestAssetNotification($data)); + } catch (\Exception $e) { + Log::warning($e); + } + + return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); + } +} diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index 12c300e5bd..d9c1f0facf 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -2,10 +2,10 @@ namespace App\Http\Controllers; +use App\Actions\CheckoutRequests\CreateCheckoutRequest; use App\Models\Actionlog; use App\Models\Asset; use App\Models\AssetModel; -use App\Models\Company; use App\Models\Setting; use App\Models\User; use App\Notifications\RequestAssetCancelation; @@ -13,7 +13,6 @@ use App\Notifications\RequestAssetNotification; use Illuminate\Http\Request; use Illuminate\Http\RedirectResponse; use \Illuminate\Contracts\View\View; -use Log; /** * This controller handles all actions related to the ability for users @@ -144,61 +143,9 @@ class ViewAssetsController extends Controller * Process a specific requested asset * @param null $assetId */ - public function getRequestAsset($assetId = null) : RedirectResponse + public function getRequestAsset($assetId = null): void { - $user = auth()->user(); - - // Check if the asset exists and is requestable - if (is_null($asset = Asset::RequestableAssets()->find($assetId))) { - return redirect()->route('requestable-assets') - ->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')); - } - if (! Company::isCurrentUserHasAccess($asset)) { - return redirect()->route('requestable-assets') - ->with('error', trans('general.insufficient_permissions')); - } - - $data['item'] = $asset; - $data['target'] = auth()->user(); - $data['item_quantity'] = 1; - $settings = Setting::getSettings(); - - $logaction = new Actionlog(); - $logaction->item_id = $data['asset_id'] = $asset->id; - $logaction->item_type = $data['item_type'] = Asset::class; - $logaction->created_at = $data['requested_date'] = date('Y-m-d H:i:s'); - - if ($user->location_id) { - $logaction->location_id = $user->location_id; - } - $logaction->target_id = $data['user_id'] = auth()->id(); - $logaction->target_type = User::class; - - // If it's already requested, cancel the request. - if ($asset->isRequestedBy(auth()->user())) { - $asset->cancelRequest(); - $asset->decrement('requests_counter', 1); - - $logaction->logaction('request canceled'); - try { - $settings->notify(new RequestAssetCancelation($data)); - } catch (\Exception $e) { - Log::warning($e); - } - return redirect()->route('requestable-assets') - ->with('success')->with('success', trans('admin/hardware/message.requests.canceled')); - } - - $logaction->logaction('requested'); - $asset->request(); - $asset->increment('requests_counter', 1); - try { - $settings->notify(new RequestAssetNotification($data)); - } catch (\Exception $e) { - Log::warning($e); - } - - return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); + CreateCheckoutRequest::run($assetId); } public function getRequestedAssets() : View diff --git a/composer.json b/composer.json index 6d89312578..c96b11e1bc 100644 --- a/composer.json +++ b/composer.json @@ -50,6 +50,7 @@ "league/csv": "^9.7", "league/flysystem-aws-s3-v3": "^3.0", "livewire/livewire": "^3.5", + "lorisleiva/laravel-actions": "^2.8", "neitanod/forceutf8": "^2.0", "nesbot/carbon": "^2.32", "nunomaduro/collision": "^7.0", @@ -84,7 +85,8 @@ "squizlabs/php_codesniffer": "^3.5", "symfony/css-selector": "^4.4", "symfony/dom-crawler": "^4.4", - "vimeo/psalm": "^5.13" + "vimeo/psalm": "^5.13", + "wulfheart/laravel-actions-ide-helper": "^0.8.0" }, "extra": { "laravel": { diff --git a/composer.lock b/composer.lock index 3f79921b26..09504209f0 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "3819ab4ef72eb77fabe494c0e746b83b", + "content-hash": "9bbdc0f3c60b21a77208b4c65c2f5bdb", "packages": [ { "name": "alek13/slack", @@ -4535,6 +4535,154 @@ ], "time": "2024-10-01T12:40:06+00:00" }, + { + "name": "lorisleiva/laravel-actions", + "version": "v2.8.4", + "source": { + "type": "git", + "url": "https://github.com/lorisleiva/laravel-actions.git", + "reference": "5a168bfdd3b75dd6ff259019d4aeef784bbd5403" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lorisleiva/laravel-actions/zipball/5a168bfdd3b75dd6ff259019d4aeef784bbd5403", + "reference": "5a168bfdd3b75dd6ff259019d4aeef784bbd5403", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0|^11.0", + "lorisleiva/lody": "^0.5", + "php": "^8.1" + }, + "require-dev": { + "orchestra/testbench": "^8.0|^9.0", + "pestphp/pest": "^1.23|^2.34", + "phpunit/phpunit": "^9.6|^10.0" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Lorisleiva\\Actions\\ActionServiceProvider" + ], + "aliases": { + "Action": "Lorisleiva\\Actions\\Facades\\Actions" + } + } + }, + "autoload": { + "psr-4": { + "Lorisleiva\\Actions\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Loris Leiva", + "email": "loris.leiva@gmail.com", + "homepage": "https://lorisleiva.com", + "role": "Developer" + } + ], + "description": "Laravel components that take care of one specific task", + "homepage": "https://github.com/lorisleiva/laravel-actions", + "keywords": [ + "action", + "command", + "component", + "controller", + "job", + "laravel", + "listener", + "object" + ], + "support": { + "issues": "https://github.com/lorisleiva/laravel-actions/issues", + "source": "https://github.com/lorisleiva/laravel-actions/tree/v2.8.4" + }, + "funding": [ + { + "url": "https://github.com/sponsors/lorisleiva", + "type": "github" + } + ], + "time": "2024-09-10T09:57:29+00:00" + }, + { + "name": "lorisleiva/lody", + "version": "v0.5.0", + "source": { + "type": "git", + "url": "https://github.com/lorisleiva/lody.git", + "reference": "c2f51b070e99f3a240d66cf68ef1f232036917fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/lorisleiva/lody/zipball/c2f51b070e99f3a240d66cf68ef1f232036917fe", + "reference": "c2f51b070e99f3a240d66cf68ef1f232036917fe", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^9.0|^10.0|^11.0", + "php": "^8.0" + }, + "require-dev": { + "orchestra/testbench": "^9.0", + "pestphp/pest": "^1.20|^2.34", + "phpunit/phpunit": "^9.5.10|^10.5" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Lorisleiva\\Lody\\LodyServiceProvider" + ], + "aliases": { + "Lody": "Lorisleiva\\Lody\\Lody" + } + } + }, + "autoload": { + "psr-4": { + "Lorisleiva\\Lody\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Loris Leiva", + "email": "loris.leiva@gmail.com", + "homepage": "https://lorisleiva.com", + "role": "Developer" + } + ], + "description": "Load files and classes as lazy collections in Laravel.", + "homepage": "https://github.com/lorisleiva/lody", + "keywords": [ + "classes", + "collection", + "files", + "laravel", + "load" + ], + "support": { + "issues": "https://github.com/lorisleiva/lody/issues", + "source": "https://github.com/lorisleiva/lody/tree/v0.5.0" + }, + "funding": [ + { + "url": "https://github.com/sponsors/lorisleiva", + "type": "github" + } + ], + "time": "2024-03-13T12:08:59+00:00" + }, { "name": "masterminds/html5", "version": "2.9.0", @@ -13775,6 +13923,73 @@ }, "time": "2024-03-27T12:14:49+00:00" }, + { + "name": "phpdocumentor/reflection", + "version": "6.0.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/Reflection.git", + "reference": "61e2f1fe7683e9647b9ed8d9e53d08699385267d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/61e2f1fe7683e9647b9ed8d9e53d08699385267d", + "reference": "61e2f1fe7683e9647b9ed8d9e53d08699385267d", + "shasum": "" + }, + "require": { + "nikic/php-parser": "~4.18 || ^5.0", + "php": "8.1.*|8.2.*|8.3.*", + "phpdocumentor/reflection-common": "^2.1", + "phpdocumentor/reflection-docblock": "^5", + "phpdocumentor/type-resolver": "^1.2", + "symfony/polyfill-php80": "^1.28", + "webmozart/assert": "^1.7" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "doctrine/coding-standard": "^12.0", + "mikey179/vfsstream": "~1.2", + "mockery/mockery": "~1.6.0", + "phpspec/prophecy-phpunit": "^2.0", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^10.0", + "psalm/phar": "^5.24", + "rector/rector": "^1.0.0", + "squizlabs/php_codesniffer": "^3.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-5.x": "5.3.x-dev", + "dev-6.x": "6.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\": "src/phpDocumentor" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Reflection library to do Static Analysis for PHP Projects", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/Reflection/issues", + "source": "https://github.com/phpDocumentor/Reflection/tree/6.0.0" + }, + "time": "2024-05-23T19:28:12+00:00" + }, { "name": "phpmyadmin/sql-parser", "version": "5.10.0", @@ -14872,6 +15087,60 @@ ], "time": "2024-06-11T12:45:25+00:00" }, + { + "name": "riimu/kit-pathjoin", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/Riimu/Kit-PathJoin.git", + "reference": "8ad2656c79527dba9f7f20e1229dcd38abfe8cee" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Riimu/Kit-PathJoin/zipball/8ad2656c79527dba9f7f20e1229dcd38abfe8cee", + "reference": "8ad2656c79527dba9f7f20e1229dcd38abfe8cee", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "friendsofphp/php-cs-fixer": "^2.3", + "phpunit/phpunit": "^5.7 || ^6.2", + "squizlabs/php_codesniffer": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Riimu\\Kit\\PathJoin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Riikka Kalliomäki", + "email": "riikka.kalliomaki@gmail.com", + "homepage": "http://riimu.net" + } + ], + "description": "Cross-platform library for normalizing and joining file system paths", + "homepage": "http://kit.riimu.net", + "keywords": [ + "file", + "join", + "normalize", + "path", + "system" + ], + "support": { + "issues": "https://github.com/Riimu/Kit-PathJoin/issues", + "source": "https://github.com/Riimu/Kit-PathJoin/tree/master" + }, + "time": "2017-07-09T14:41:04+00:00" + }, { "name": "sebastian/cli-parser", "version": "2.0.1", @@ -16640,6 +16909,81 @@ "source": "https://github.com/vimeo/psalm" }, "time": "2024-09-08T18:53:08+00:00" + }, + { + "name": "wulfheart/laravel-actions-ide-helper", + "version": "v0.8.0", + "source": { + "type": "git", + "url": "https://github.com/Wulfheart/laravel-actions-ide-helper.git", + "reference": "48e9d7c89804fcd459a73cc22adee533e7a88deb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Wulfheart/laravel-actions-ide-helper/zipball/48e9d7c89804fcd459a73cc22adee533e7a88deb", + "reference": "48e9d7c89804fcd459a73cc22adee533e7a88deb", + "shasum": "" + }, + "require": { + "illuminate/contracts": "^10.0|^11.0", + "lorisleiva/laravel-actions": "^2.3", + "lorisleiva/lody": "^0.5.0", + "php": "^8.1|^8.2", + "phpdocumentor/reflection": "^5.1|^6.0", + "riimu/kit-pathjoin": "^1.2", + "spatie/laravel-package-tools": "^1.14" + }, + "require-dev": { + "brianium/paratest": "^6.8|^7.4", + "nunomaduro/collision": "^6.1|^8.0", + "orchestra/testbench": "^8.0|^9.0", + "pestphp/pest": "^1.22|^2.34", + "phpunit/phpunit": "^9.5.10|^10.5", + "spatie/invade": "^1.1|^2.0", + "spatie/laravel-ray": "^1.32", + "spatie/pest-plugin-snapshots": "^1.1|^2.1", + "vimeo/psalm": "^5.6" + }, + "type": "library", + "extra": { + "laravel": { + "providers": [ + "Wulfheart\\LaravelActionsIdeHelper\\LaravelActionsIdeHelperServiceProvider" + ], + "aliases": { + "LaravelActionsIdeHelper": "Wulfheart\\LaravelActionsIdeHelper\\LaravelActionsIdeHelperFacade" + } + } + }, + "autoload": { + "psr-4": { + "Wulfheart\\LaravelActionsIdeHelper\\": "src", + "Wulfheart\\LaravelActionsIdeHelper\\Database\\Factories\\": "database/factories" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Alexander Wulf", + "email": "dev@alexfwulf.de", + "role": "Developer" + } + ], + "description": "Generate a new IDE Helper file for Laravel Actions.", + "homepage": "https://github.com/wulfheart/laravel-actions-ide-helper", + "keywords": [ + "laravel", + "laravel-actions-ide-helper", + "wulfheart" + ], + "support": { + "issues": "https://github.com/Wulfheart/laravel-actions-ide-helper/issues", + "source": "https://github.com/Wulfheart/laravel-actions-ide-helper/tree/v0.8.0" + }, + "time": "2024-08-30T14:32:22+00:00" } ], "aliases": [], From a524c0b418de29f2393aa49a9dc82f7de00ce2e7 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Wed, 16 Oct 2024 18:48:15 -0500 Subject: [PATCH 02/17] more work --- _ide_helper_actions.php | 44 ------------------- .../CreateCheckoutRequest.php | 41 +++++++++++++---- app/Http/Controllers/ViewAssetsController.php | 6 ++- 3 files changed, 37 insertions(+), 54 deletions(-) delete mode 100644 _ide_helper_actions.php diff --git a/_ide_helper_actions.php b/_ide_helper_actions.php deleted file mode 100644 index a420493954..0000000000 --- a/_ide_helper_actions.php +++ /dev/null @@ -1,44 +0,0 @@ -user(); // Check if the asset exists and is requestable if (is_null($asset = Asset::RequestableAssets()->find($assetId))) { - return redirect()->route('requestable-assets') - ->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')); + $this->status = 'doesNotExist'; + return false; } if (!Company::isCurrentUserHasAccess($asset)) { - return redirect()->route('requestable-assets') - ->with('error', trans('general.insufficient_permissions')); + $this->status = 'accessDenied'; + return false; } $data['item'] = $asset; @@ -57,8 +61,8 @@ class CreateCheckoutRequest } catch (\Exception $e) { Log::warning($e); } - return redirect()->route('requestable-assets') - ->with('success')->with('success', trans('admin/hardware/message.requests.canceled')); + $this->status = 'cancelled'; + return true; } $logaction->logaction('requested'); @@ -67,9 +71,28 @@ class CreateCheckoutRequest try { $settings->notify(new RequestAssetNotification($data)); } catch (\Exception $e) { - Log::warning($e); + \Log::warning($e); } - return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); + return true; + } + + public function jsonResponse(): JsonResponse + { + return match ($this->status) { + 'doesNotExist' => response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist_or_not_requestable'))), + 'accessDenied' => response()->json(Helper::formatStandardApiResponse('error', null, trans('general.insufficient_permissions'))), + default => response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.request_successfully_created'))), + }; + } + + public function htmlResponse(): RedirectResponse + { + return match ($this->status) { + 'doesNotExist' => redirect()->route('requestable-assets')->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')), + 'accessDenied' => redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')), + 'cancelled' => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')), + default => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')), + }; } } diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index d9c1f0facf..722974713f 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -145,7 +145,11 @@ class ViewAssetsController extends Controller */ public function getRequestAsset($assetId = null): void { - CreateCheckoutRequest::run($assetId); + $request = CreateCheckoutRequest::run($assetId); + + if (!$request) { + \Log::debug('problem'); + } } public function getRequestedAssets() : View From b2ff34260a0d33bc4daea43554cb5d992a1cfc38 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Thu, 17 Oct 2024 00:02:15 -0500 Subject: [PATCH 03/17] hm, lots of thinking to do --- .../CreateCheckoutRequest.php | 19 ++++++++++++++++--- app/Http/Controllers/ViewAssetsController.php | 6 +----- routes/web.php | 1 + 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php index a8c6d41368..5cfcecc785 100644 --- a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php +++ b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php @@ -13,15 +13,19 @@ use App\Notifications\RequestAssetNotification; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Lorisleiva\Actions\Concerns\AsAction; +use Lorisleiva\Actions\Concerns\AsController; +use Lorisleiva\Actions\Concerns\WithAttributes; class CreateCheckoutRequest { use AsAction; + use WithAttributes; - public string $status; + public string $status = ''; public function handle($assetId) { + dump($assetId); $user = auth()->user(); // Check if the asset exists and is requestable @@ -59,7 +63,7 @@ class CreateCheckoutRequest try { $settings->notify(new RequestAssetCancelation($data)); } catch (\Exception $e) { - Log::warning($e); + \Log::warning($e); } $this->status = 'cancelled'; return true; @@ -73,12 +77,19 @@ class CreateCheckoutRequest } catch (\Exception $e) { \Log::warning($e); } + dump('handle end'); + } - return true; + public function asController($assetId) + { + dump('asController'); + $asset = $this->handle($assetId); + //return $asset; } public function jsonResponse(): JsonResponse { + dump('json'); return match ($this->status) { 'doesNotExist' => response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist_or_not_requestable'))), 'accessDenied' => response()->json(Helper::formatStandardApiResponse('error', null, trans('general.insufficient_permissions'))), @@ -88,7 +99,9 @@ class CreateCheckoutRequest public function htmlResponse(): RedirectResponse { + dump('redirects'); return match ($this->status) { + dump('redirects'), 'doesNotExist' => redirect()->route('requestable-assets')->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')), 'accessDenied' => redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')), 'cancelled' => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')), diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index 722974713f..d9c1f0facf 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -145,11 +145,7 @@ class ViewAssetsController extends Controller */ public function getRequestAsset($assetId = null): void { - $request = CreateCheckoutRequest::run($assetId); - - if (!$request) { - \Log::debug('problem'); - } + CreateCheckoutRequest::run($assetId); } public function getRequestedAssets() : View diff --git a/routes/web.php b/routes/web.php index 60b74476c7..76df83e116 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,5 +1,6 @@ Date: Thu, 17 Oct 2024 12:45:49 -0500 Subject: [PATCH 04/17] this works --- .../CreateCheckoutRequest.php | 51 +++++++++---------- app/Http/Controllers/Api/CheckoutRequest.php | 23 +++++++++ app/Http/Controllers/ViewAssetsController.php | 12 ++++- 3 files changed, 58 insertions(+), 28 deletions(-) create mode 100644 app/Http/Controllers/Api/CheckoutRequest.php diff --git a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php index 5cfcecc785..e0caafa278 100644 --- a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php +++ b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php @@ -30,12 +30,10 @@ class CreateCheckoutRequest // Check if the asset exists and is requestable if (is_null($asset = Asset::RequestableAssets()->find($assetId))) { - $this->status = 'doesNotExist'; - return false; + return $this->status = 'doesNotExist'; } if (!Company::isCurrentUserHasAccess($asset)) { - $this->status = 'accessDenied'; - return false; + return $this->status = 'accessDenied'; } $data['item'] = $asset; @@ -65,8 +63,7 @@ class CreateCheckoutRequest } catch (\Exception $e) { \Log::warning($e); } - $this->status = 'cancelled'; - return true; + return $this->status = 'cancelled'; } $logaction->logaction('requested'); @@ -78,6 +75,8 @@ class CreateCheckoutRequest \Log::warning($e); } dump('handle end'); + + return $this->status = 'success'; } public function asController($assetId) @@ -87,25 +86,25 @@ class CreateCheckoutRequest //return $asset; } - public function jsonResponse(): JsonResponse - { - dump('json'); - return match ($this->status) { - 'doesNotExist' => response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist_or_not_requestable'))), - 'accessDenied' => response()->json(Helper::formatStandardApiResponse('error', null, trans('general.insufficient_permissions'))), - default => response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.request_successfully_created'))), - }; - } + //public function jsonResponse(): JsonResponse + //{ + // dump('json'); + // return match ($this->status) { + // 'doesNotExist' => response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist_or_not_requestable'))), + // 'accessDenied' => response()->json(Helper::formatStandardApiResponse('error', null, trans('general.insufficient_permissions'))), + // default => response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.request_successfully_created'))), + // }; + //} - public function htmlResponse(): RedirectResponse - { - dump('redirects'); - return match ($this->status) { - dump('redirects'), - 'doesNotExist' => redirect()->route('requestable-assets')->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')), - 'accessDenied' => redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')), - 'cancelled' => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')), - default => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')), - }; - } + //public function htmlResponse(): RedirectResponse + //{ + // dump('redirects'); + // return match ($this->status) { + // dump('redirects'), + // 'doesNotExist' => redirect()->route('requestable-assets')->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')), + // 'accessDenied' => redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')), + // 'cancelled' => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')), + // default => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')), + // }; + //} } diff --git a/app/Http/Controllers/Api/CheckoutRequest.php b/app/Http/Controllers/Api/CheckoutRequest.php new file mode 100644 index 0000000000..bbf7cd3587 --- /dev/null +++ b/app/Http/Controllers/Api/CheckoutRequest.php @@ -0,0 +1,23 @@ + response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist_or_not_requestable'))), + 'accessDenied' => response()->json(Helper::formatStandardApiResponse('error', null, trans('general.insufficient_permissions'))), + default => response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.request_successfully_created'))), + }; + } +} diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index d9c1f0facf..6772a57620 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -143,9 +143,17 @@ class ViewAssetsController extends Controller * Process a specific requested asset * @param null $assetId */ - public function getRequestAsset($assetId = null): void + public function getRequestAsset($assetId = null): RedirectResponse { - CreateCheckoutRequest::run($assetId); + $status = CreateCheckoutRequest::run($assetId); + + return match ($status) { + 'doesNotExist' => redirect()->route('requestable-assets')->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')), + 'accessDenied' => redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')), + 'cancelled' => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')), + 'success' => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')), + default => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')), + }; } public function getRequestedAssets() : View From 95a32864cf7c10866d65207156b3c919e5727a2f Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Thu, 17 Oct 2024 18:11:18 -0500 Subject: [PATCH 05/17] =?UTF-8?q?hm,=20lots=20to=20think=20about=20?= =?UTF-8?q?=F0=9F=A4=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Actions/BaseAction.php | 19 +++++ .../CreateCheckoutRequestNew.php | 75 +++++++++++++++++++ app/Http/Controllers/ViewAssetsController.php | 6 +- 3 files changed, 98 insertions(+), 2 deletions(-) create mode 100644 app/Actions/BaseAction.php create mode 100644 app/Actions/CheckoutRequests/CreateCheckoutRequestNew.php diff --git a/app/Actions/BaseAction.php b/app/Actions/BaseAction.php new file mode 100644 index 0000000000..bb48b336d0 --- /dev/null +++ b/app/Actions/BaseAction.php @@ -0,0 +1,19 @@ +$method(...$args); + } + + //abstract static function run($parameters = null) + //{ + // return call_user_func($this->run(...$parameters)); + //} + +} diff --git a/app/Actions/CheckoutRequests/CreateCheckoutRequestNew.php b/app/Actions/CheckoutRequests/CreateCheckoutRequestNew.php new file mode 100644 index 0000000000..6b5a7565c7 --- /dev/null +++ b/app/Actions/CheckoutRequests/CreateCheckoutRequestNew.php @@ -0,0 +1,75 @@ +user(); + + // Check if the asset exists and is requestable + if (is_null($asset = Asset::RequestableAssets()->find($assetId))) { + return $status = 'doesNotExist'; + } + if (!Company::isCurrentUserHasAccess($asset)) { + return $status = 'accessDenied'; + } + + $data['item'] = $asset; + $data['target'] = auth()->user(); + $data['item_quantity'] = 1; + $settings = Setting::getSettings(); + + $logaction = new Actionlog(); + $logaction->item_id = $data['asset_id'] = $asset->id; + $logaction->item_type = $data['item_type'] = Asset::class; + $logaction->created_at = $data['requested_date'] = date('Y-m-d H:i:s'); + + if ($user->location_id) { + $logaction->location_id = $user->location_id; + } + $logaction->target_id = $data['user_id'] = auth()->id(); + $logaction->target_type = User::class; + + // If it's already requested, cancel the request. + if ($asset->isRequestedBy(auth()->user())) { + $asset->cancelRequest(); + $asset->decrement('requests_counter', 1); + + $logaction->logaction('request canceled'); + try { + $settings->notify(new RequestAssetCancelation($data)); + } catch (\Exception $e) { + \Log::warning($e); + } + return $status = 'cancelled'; + } + + $logaction->logaction('requested'); + $asset->request(); + $asset->increment('requests_counter', 1); + try { + $settings->notify(new RequestAssetNotification($data)); + } catch (\Exception $e) { + \Log::warning($e); + } + dump('handle end'); + + return $status = 'success'; + } + + +} \ No newline at end of file diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index 6772a57620..67c3ee1c8e 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -3,6 +3,7 @@ namespace App\Http\Controllers; use App\Actions\CheckoutRequests\CreateCheckoutRequest; +use App\Actions\CheckoutRequests\CreateCheckoutRequestNew; use App\Models\Actionlog; use App\Models\Asset; use App\Models\AssetModel; @@ -143,9 +144,10 @@ class ViewAssetsController extends Controller * Process a specific requested asset * @param null $assetId */ - public function getRequestAsset($assetId = null): RedirectResponse + public function getRequestAsset(CreateCheckoutRequestNew $checkoutRequestNew, $assetId = null): RedirectResponse { - $status = CreateCheckoutRequest::run($assetId); + $status = CreateCheckoutRequestNew::run($assetId); + //$status = $checkoutRequestNew->run($assetId); return match ($status) { 'doesNotExist' => redirect()->route('requestable-assets')->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')), From e40849c910bb89aa4a7fa2137ee651f610248bb1 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Mon, 21 Oct 2024 17:31:26 -0500 Subject: [PATCH 06/17] this stuff works --- app/Actions/BaseAction.php | 19 - .../CreateCheckoutRequest.php | 67 +--- .../CreateCheckoutRequestNew.php | 75 ---- app/Exceptions/AssetNotRequestable.php | 27 ++ app/Exceptions/UserDoestExistException.php | 10 + app/Http/Controllers/Api/CheckoutRequest.php | 9 +- app/Http/Controllers/ViewAssetsController.php | 43 ++- app/Models/Asset.php | 2 +- composer.json | 4 +- composer.lock | 346 +----------------- routes/web.php | 2 +- 11 files changed, 90 insertions(+), 514 deletions(-) delete mode 100644 app/Actions/BaseAction.php delete mode 100644 app/Actions/CheckoutRequests/CreateCheckoutRequestNew.php create mode 100644 app/Exceptions/AssetNotRequestable.php create mode 100644 app/Exceptions/UserDoestExistException.php diff --git a/app/Actions/BaseAction.php b/app/Actions/BaseAction.php deleted file mode 100644 index bb48b336d0..0000000000 --- a/app/Actions/BaseAction.php +++ /dev/null @@ -1,19 +0,0 @@ -$method(...$args); - } - - //abstract static function run($parameters = null) - //{ - // return call_user_func($this->run(...$parameters)); - //} - -} diff --git a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php index e0caafa278..f0a36d46ab 100644 --- a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php +++ b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php @@ -2,7 +2,7 @@ namespace App\Actions\CheckoutRequests; -use App\Helpers\Helper; +use App\Exceptions\AssetNotRequestable; use App\Models\Actionlog; use App\Models\Asset; use App\Models\Company; @@ -10,34 +10,27 @@ use App\Models\Setting; use App\Models\User; use App\Notifications\RequestAssetCancelation; use App\Notifications\RequestAssetNotification; -use Illuminate\Http\JsonResponse; -use Illuminate\Http\RedirectResponse; -use Lorisleiva\Actions\Concerns\AsAction; -use Lorisleiva\Actions\Concerns\AsController; -use Lorisleiva\Actions\Concerns\WithAttributes; +use Illuminate\Auth\Access\AuthorizationException; +use Illuminate\Database\Eloquent\ModelNotFoundException; class CreateCheckoutRequest { - use AsAction; - use WithAttributes; - - public string $status = ''; - - public function handle($assetId) + /** + * @throws AssetNotRequestable + * @throws AuthorizationException + */ + public static function run(Asset $asset, User $user): string { - dump($assetId); - $user = auth()->user(); - - // Check if the asset exists and is requestable - if (is_null($asset = Asset::RequestableAssets()->find($assetId))) { - return $this->status = 'doesNotExist'; + // Check if asset is requestable + if (is_null(Asset::RequestableAssets()->find($asset->id))) { + throw new AssetNotRequestable($asset); } if (!Company::isCurrentUserHasAccess($asset)) { - return $this->status = 'accessDenied'; + throw new AuthorizationException(); } $data['item'] = $asset; - $data['target'] = auth()->user(); + $data['target'] = $user; $data['item_quantity'] = 1; $settings = Setting::getSettings(); @@ -63,7 +56,7 @@ class CreateCheckoutRequest } catch (\Exception $e) { \Log::warning($e); } - return $this->status = 'cancelled'; + return $status = 'cancelled'; } $logaction->logaction('requested'); @@ -74,37 +67,9 @@ class CreateCheckoutRequest } catch (\Exception $e) { \Log::warning($e); } - dump('handle end'); - return $this->status = 'success'; + return $asset; } - public function asController($assetId) - { - dump('asController'); - $asset = $this->handle($assetId); - //return $asset; - } - //public function jsonResponse(): JsonResponse - //{ - // dump('json'); - // return match ($this->status) { - // 'doesNotExist' => response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist_or_not_requestable'))), - // 'accessDenied' => response()->json(Helper::formatStandardApiResponse('error', null, trans('general.insufficient_permissions'))), - // default => response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.request_successfully_created'))), - // }; - //} - - //public function htmlResponse(): RedirectResponse - //{ - // dump('redirects'); - // return match ($this->status) { - // dump('redirects'), - // 'doesNotExist' => redirect()->route('requestable-assets')->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')), - // 'accessDenied' => redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')), - // 'cancelled' => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')), - // default => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')), - // }; - //} -} +} \ No newline at end of file diff --git a/app/Actions/CheckoutRequests/CreateCheckoutRequestNew.php b/app/Actions/CheckoutRequests/CreateCheckoutRequestNew.php deleted file mode 100644 index 6b5a7565c7..0000000000 --- a/app/Actions/CheckoutRequests/CreateCheckoutRequestNew.php +++ /dev/null @@ -1,75 +0,0 @@ -user(); - - // Check if the asset exists and is requestable - if (is_null($asset = Asset::RequestableAssets()->find($assetId))) { - return $status = 'doesNotExist'; - } - if (!Company::isCurrentUserHasAccess($asset)) { - return $status = 'accessDenied'; - } - - $data['item'] = $asset; - $data['target'] = auth()->user(); - $data['item_quantity'] = 1; - $settings = Setting::getSettings(); - - $logaction = new Actionlog(); - $logaction->item_id = $data['asset_id'] = $asset->id; - $logaction->item_type = $data['item_type'] = Asset::class; - $logaction->created_at = $data['requested_date'] = date('Y-m-d H:i:s'); - - if ($user->location_id) { - $logaction->location_id = $user->location_id; - } - $logaction->target_id = $data['user_id'] = auth()->id(); - $logaction->target_type = User::class; - - // If it's already requested, cancel the request. - if ($asset->isRequestedBy(auth()->user())) { - $asset->cancelRequest(); - $asset->decrement('requests_counter', 1); - - $logaction->logaction('request canceled'); - try { - $settings->notify(new RequestAssetCancelation($data)); - } catch (\Exception $e) { - \Log::warning($e); - } - return $status = 'cancelled'; - } - - $logaction->logaction('requested'); - $asset->request(); - $asset->increment('requests_counter', 1); - try { - $settings->notify(new RequestAssetNotification($data)); - } catch (\Exception $e) { - \Log::warning($e); - } - dump('handle end'); - - return $status = 'success'; - } - - -} \ No newline at end of file diff --git a/app/Exceptions/AssetNotRequestable.php b/app/Exceptions/AssetNotRequestable.php new file mode 100644 index 0000000000..8c3daa7cf8 --- /dev/null +++ b/app/Exceptions/AssetNotRequestable.php @@ -0,0 +1,27 @@ +errorMessage = $errorMessage; + + parent::__construct($errorMessage); + } + + public function __toString() + { + return is_null($this->errorMessage) ? 'This asset is not requestable.' : $this->errorMessage; + } + + public function getTranslatedMessage() + { + return trans($this->errorMessage); + } +} diff --git a/app/Exceptions/UserDoestExistException.php b/app/Exceptions/UserDoestExistException.php new file mode 100644 index 0000000000..e14069dca4 --- /dev/null +++ b/app/Exceptions/UserDoestExistException.php @@ -0,0 +1,10 @@ + response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.does_not_exist_or_not_requestable'))), - 'accessDenied' => response()->json(Helper::formatStandardApiResponse('error', null, trans('general.insufficient_permissions'))), - default => response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/hardware/message.request_successfully_created'))), - }; + CreateCheckoutRequest::run($assetId); } } diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index 67c3ee1c8e..8c8b1e993f 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -3,7 +3,7 @@ namespace App\Http\Controllers; use App\Actions\CheckoutRequests\CreateCheckoutRequest; -use App\Actions\CheckoutRequests\CreateCheckoutRequestNew; +use App\Exceptions\AssetNotRequestable; use App\Models\Actionlog; use App\Models\Asset; use App\Models\AssetModel; @@ -11,9 +11,11 @@ use App\Models\Setting; use App\Models\User; use App\Notifications\RequestAssetCancelation; use App\Notifications\RequestAssetNotification; +use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\Request; use Illuminate\Http\RedirectResponse; use \Illuminate\Contracts\View\View; +use Illuminate\Support\Facades\Log; /** * This controller handles all actions related to the ability for users @@ -144,20 +146,39 @@ class ViewAssetsController extends Controller * Process a specific requested asset * @param null $assetId */ - public function getRequestAsset(CreateCheckoutRequestNew $checkoutRequestNew, $assetId = null): RedirectResponse + public function getRequestAsset(Asset $asset): RedirectResponse { - $status = CreateCheckoutRequestNew::run($assetId); - //$status = $checkoutRequestNew->run($assetId); + try { + CreateCheckoutRequest::run($asset, auth()->user()); + return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); + } catch (AssetNotRequestable $e) { + return redirect()->back()->with('error', 'poop'); + } catch (AuthorizationException $e) { + return redirect()->back()->with('error', trans('admin/hardware/message.requests.error')); + } catch (\Exception $e) { + report($e); + return redirect()->back()->with('error', 'generic error message'); + } - return match ($status) { - 'doesNotExist' => redirect()->route('requestable-assets')->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')), - 'accessDenied' => redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')), - 'cancelled' => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')), - 'success' => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')), - default => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')), - }; + + //$status = CreateCheckoutRequest::run($asset, auth()->user()); + // + //return match ($status) { + // 'doesNotExist' => redirect()->route('requestable-assets')->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')), + // 'accessDenied' => redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')), + // 'cancelled' => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')), + // default => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')), + //}; } + //public function destroy(Asset $asset): RedirectResponse + //{ + // try { + // CancelCheckoutRequest($asset, auth()->user()); + // } + //} + + public function getRequestedAssets() : View { return view('account/requested'); diff --git a/app/Models/Asset.php b/app/Models/Asset.php index ce8b870eb2..5bf49186f0 100644 --- a/app/Models/Asset.php +++ b/app/Models/Asset.php @@ -1433,7 +1433,7 @@ class Asset extends Depreciable * @return \Illuminate\Database\Query\Builder Modified query builder */ - public function scopeRequestableAssets($query) + public function scopeRequestableAssets($query): Builder { $table = $query->getModel()->getTable(); diff --git a/composer.json b/composer.json index c96b11e1bc..6d89312578 100644 --- a/composer.json +++ b/composer.json @@ -50,7 +50,6 @@ "league/csv": "^9.7", "league/flysystem-aws-s3-v3": "^3.0", "livewire/livewire": "^3.5", - "lorisleiva/laravel-actions": "^2.8", "neitanod/forceutf8": "^2.0", "nesbot/carbon": "^2.32", "nunomaduro/collision": "^7.0", @@ -85,8 +84,7 @@ "squizlabs/php_codesniffer": "^3.5", "symfony/css-selector": "^4.4", "symfony/dom-crawler": "^4.4", - "vimeo/psalm": "^5.13", - "wulfheart/laravel-actions-ide-helper": "^0.8.0" + "vimeo/psalm": "^5.13" }, "extra": { "laravel": { diff --git a/composer.lock b/composer.lock index 09504209f0..3f79921b26 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "9bbdc0f3c60b21a77208b4c65c2f5bdb", + "content-hash": "3819ab4ef72eb77fabe494c0e746b83b", "packages": [ { "name": "alek13/slack", @@ -4535,154 +4535,6 @@ ], "time": "2024-10-01T12:40:06+00:00" }, - { - "name": "lorisleiva/laravel-actions", - "version": "v2.8.4", - "source": { - "type": "git", - "url": "https://github.com/lorisleiva/laravel-actions.git", - "reference": "5a168bfdd3b75dd6ff259019d4aeef784bbd5403" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lorisleiva/laravel-actions/zipball/5a168bfdd3b75dd6ff259019d4aeef784bbd5403", - "reference": "5a168bfdd3b75dd6ff259019d4aeef784bbd5403", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^10.0|^11.0", - "lorisleiva/lody": "^0.5", - "php": "^8.1" - }, - "require-dev": { - "orchestra/testbench": "^8.0|^9.0", - "pestphp/pest": "^1.23|^2.34", - "phpunit/phpunit": "^9.6|^10.0" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Lorisleiva\\Actions\\ActionServiceProvider" - ], - "aliases": { - "Action": "Lorisleiva\\Actions\\Facades\\Actions" - } - } - }, - "autoload": { - "psr-4": { - "Lorisleiva\\Actions\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Loris Leiva", - "email": "loris.leiva@gmail.com", - "homepage": "https://lorisleiva.com", - "role": "Developer" - } - ], - "description": "Laravel components that take care of one specific task", - "homepage": "https://github.com/lorisleiva/laravel-actions", - "keywords": [ - "action", - "command", - "component", - "controller", - "job", - "laravel", - "listener", - "object" - ], - "support": { - "issues": "https://github.com/lorisleiva/laravel-actions/issues", - "source": "https://github.com/lorisleiva/laravel-actions/tree/v2.8.4" - }, - "funding": [ - { - "url": "https://github.com/sponsors/lorisleiva", - "type": "github" - } - ], - "time": "2024-09-10T09:57:29+00:00" - }, - { - "name": "lorisleiva/lody", - "version": "v0.5.0", - "source": { - "type": "git", - "url": "https://github.com/lorisleiva/lody.git", - "reference": "c2f51b070e99f3a240d66cf68ef1f232036917fe" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/lorisleiva/lody/zipball/c2f51b070e99f3a240d66cf68ef1f232036917fe", - "reference": "c2f51b070e99f3a240d66cf68ef1f232036917fe", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^9.0|^10.0|^11.0", - "php": "^8.0" - }, - "require-dev": { - "orchestra/testbench": "^9.0", - "pestphp/pest": "^1.20|^2.34", - "phpunit/phpunit": "^9.5.10|^10.5" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Lorisleiva\\Lody\\LodyServiceProvider" - ], - "aliases": { - "Lody": "Lorisleiva\\Lody\\Lody" - } - } - }, - "autoload": { - "psr-4": { - "Lorisleiva\\Lody\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Loris Leiva", - "email": "loris.leiva@gmail.com", - "homepage": "https://lorisleiva.com", - "role": "Developer" - } - ], - "description": "Load files and classes as lazy collections in Laravel.", - "homepage": "https://github.com/lorisleiva/lody", - "keywords": [ - "classes", - "collection", - "files", - "laravel", - "load" - ], - "support": { - "issues": "https://github.com/lorisleiva/lody/issues", - "source": "https://github.com/lorisleiva/lody/tree/v0.5.0" - }, - "funding": [ - { - "url": "https://github.com/sponsors/lorisleiva", - "type": "github" - } - ], - "time": "2024-03-13T12:08:59+00:00" - }, { "name": "masterminds/html5", "version": "2.9.0", @@ -13923,73 +13775,6 @@ }, "time": "2024-03-27T12:14:49+00:00" }, - { - "name": "phpdocumentor/reflection", - "version": "6.0.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/Reflection.git", - "reference": "61e2f1fe7683e9647b9ed8d9e53d08699385267d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/Reflection/zipball/61e2f1fe7683e9647b9ed8d9e53d08699385267d", - "reference": "61e2f1fe7683e9647b9ed8d9e53d08699385267d", - "shasum": "" - }, - "require": { - "nikic/php-parser": "~4.18 || ^5.0", - "php": "8.1.*|8.2.*|8.3.*", - "phpdocumentor/reflection-common": "^2.1", - "phpdocumentor/reflection-docblock": "^5", - "phpdocumentor/type-resolver": "^1.2", - "symfony/polyfill-php80": "^1.28", - "webmozart/assert": "^1.7" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^1.0", - "doctrine/coding-standard": "^12.0", - "mikey179/vfsstream": "~1.2", - "mockery/mockery": "~1.6.0", - "phpspec/prophecy-phpunit": "^2.0", - "phpstan/extension-installer": "^1.1", - "phpstan/phpstan": "^1.8", - "phpstan/phpstan-webmozart-assert": "^1.2", - "phpunit/phpunit": "^10.0", - "psalm/phar": "^5.24", - "rector/rector": "^1.0.0", - "squizlabs/php_codesniffer": "^3.8" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-5.x": "5.3.x-dev", - "dev-6.x": "6.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\": "src/phpDocumentor" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Reflection library to do Static Analysis for PHP Projects", - "homepage": "http://www.phpdoc.org", - "keywords": [ - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "support": { - "issues": "https://github.com/phpDocumentor/Reflection/issues", - "source": "https://github.com/phpDocumentor/Reflection/tree/6.0.0" - }, - "time": "2024-05-23T19:28:12+00:00" - }, { "name": "phpmyadmin/sql-parser", "version": "5.10.0", @@ -15087,60 +14872,6 @@ ], "time": "2024-06-11T12:45:25+00:00" }, - { - "name": "riimu/kit-pathjoin", - "version": "v1.2.0", - "source": { - "type": "git", - "url": "https://github.com/Riimu/Kit-PathJoin.git", - "reference": "8ad2656c79527dba9f7f20e1229dcd38abfe8cee" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Riimu/Kit-PathJoin/zipball/8ad2656c79527dba9f7f20e1229dcd38abfe8cee", - "reference": "8ad2656c79527dba9f7f20e1229dcd38abfe8cee", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "friendsofphp/php-cs-fixer": "^2.3", - "phpunit/phpunit": "^5.7 || ^6.2", - "squizlabs/php_codesniffer": "^3.0" - }, - "type": "library", - "autoload": { - "psr-4": { - "Riimu\\Kit\\PathJoin\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Riikka Kalliomäki", - "email": "riikka.kalliomaki@gmail.com", - "homepage": "http://riimu.net" - } - ], - "description": "Cross-platform library for normalizing and joining file system paths", - "homepage": "http://kit.riimu.net", - "keywords": [ - "file", - "join", - "normalize", - "path", - "system" - ], - "support": { - "issues": "https://github.com/Riimu/Kit-PathJoin/issues", - "source": "https://github.com/Riimu/Kit-PathJoin/tree/master" - }, - "time": "2017-07-09T14:41:04+00:00" - }, { "name": "sebastian/cli-parser", "version": "2.0.1", @@ -16909,81 +16640,6 @@ "source": "https://github.com/vimeo/psalm" }, "time": "2024-09-08T18:53:08+00:00" - }, - { - "name": "wulfheart/laravel-actions-ide-helper", - "version": "v0.8.0", - "source": { - "type": "git", - "url": "https://github.com/Wulfheart/laravel-actions-ide-helper.git", - "reference": "48e9d7c89804fcd459a73cc22adee533e7a88deb" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Wulfheart/laravel-actions-ide-helper/zipball/48e9d7c89804fcd459a73cc22adee533e7a88deb", - "reference": "48e9d7c89804fcd459a73cc22adee533e7a88deb", - "shasum": "" - }, - "require": { - "illuminate/contracts": "^10.0|^11.0", - "lorisleiva/laravel-actions": "^2.3", - "lorisleiva/lody": "^0.5.0", - "php": "^8.1|^8.2", - "phpdocumentor/reflection": "^5.1|^6.0", - "riimu/kit-pathjoin": "^1.2", - "spatie/laravel-package-tools": "^1.14" - }, - "require-dev": { - "brianium/paratest": "^6.8|^7.4", - "nunomaduro/collision": "^6.1|^8.0", - "orchestra/testbench": "^8.0|^9.0", - "pestphp/pest": "^1.22|^2.34", - "phpunit/phpunit": "^9.5.10|^10.5", - "spatie/invade": "^1.1|^2.0", - "spatie/laravel-ray": "^1.32", - "spatie/pest-plugin-snapshots": "^1.1|^2.1", - "vimeo/psalm": "^5.6" - }, - "type": "library", - "extra": { - "laravel": { - "providers": [ - "Wulfheart\\LaravelActionsIdeHelper\\LaravelActionsIdeHelperServiceProvider" - ], - "aliases": { - "LaravelActionsIdeHelper": "Wulfheart\\LaravelActionsIdeHelper\\LaravelActionsIdeHelperFacade" - } - } - }, - "autoload": { - "psr-4": { - "Wulfheart\\LaravelActionsIdeHelper\\": "src", - "Wulfheart\\LaravelActionsIdeHelper\\Database\\Factories\\": "database/factories" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Alexander Wulf", - "email": "dev@alexfwulf.de", - "role": "Developer" - } - ], - "description": "Generate a new IDE Helper file for Laravel Actions.", - "homepage": "https://github.com/wulfheart/laravel-actions-ide-helper", - "keywords": [ - "laravel", - "laravel-actions-ide-helper", - "wulfheart" - ], - "support": { - "issues": "https://github.com/Wulfheart/laravel-actions-ide-helper/issues", - "source": "https://github.com/Wulfheart/laravel-actions-ide-helper/tree/v0.8.0" - }, - "time": "2024-08-30T14:32:22+00:00" } ], "aliases": [], diff --git a/routes/web.php b/routes/web.php index 76df83e116..137ed83b45 100644 --- a/routes/web.php +++ b/routes/web.php @@ -304,7 +304,7 @@ Route::group(['prefix' => 'account', 'middleware' => ['auth']], function () { [ViewAssetsController::class, 'getRequestableIndex'] )->name('requestable-assets'); Route::post( - 'request-asset/{assetId}', + 'request-asset/{asset}', [ViewAssetsController::class, 'getRequestAsset'] )->name('account/request-asset'); From b59bf495e148af73eef047b7de84f3b2ba3e9db2 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Tue, 22 Oct 2024 15:09:35 -0500 Subject: [PATCH 07/17] stuff --- .../CheckoutRequests/CreateCheckoutRequest.php | 12 +++++++++--- app/Http/Controllers/Api/CheckoutRequest.php | 17 +++++++++++++++-- app/Http/Controllers/ViewAssetsController.php | 16 +++------------- routes/api.php | 2 ++ routes/web.php | 2 +- .../Feature/Checkouts/Api/AssetCheckoutTest.php | 9 +++++++++ 6 files changed, 39 insertions(+), 19 deletions(-) diff --git a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php index f0a36d46ab..c9fd4c9387 100644 --- a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php +++ b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php @@ -3,6 +3,7 @@ namespace App\Actions\CheckoutRequests; use App\Exceptions\AssetNotRequestable; +use App\Exceptions\ThereIsNoUser; use App\Models\Actionlog; use App\Models\Asset; use App\Models\Company; @@ -11,7 +12,6 @@ use App\Models\User; use App\Notifications\RequestAssetCancelation; use App\Notifications\RequestAssetNotification; use Illuminate\Auth\Access\AuthorizationException; -use Illuminate\Database\Eloquent\ModelNotFoundException; class CreateCheckoutRequest { @@ -21,7 +21,7 @@ class CreateCheckoutRequest */ public static function run(Asset $asset, User $user): string { - // Check if asset is requestable + //throw new \Exception(); if (is_null(Asset::RequestableAssets()->find($asset->id))) { throw new AssetNotRequestable($asset); } @@ -46,6 +46,7 @@ class CreateCheckoutRequest $logaction->target_type = User::class; // If it's already requested, cancel the request. + // this is going into another action class if ($asset->isRequestedBy(auth()->user())) { $asset->cancelRequest(); $asset->decrement('requests_counter', 1); @@ -68,7 +69,12 @@ class CreateCheckoutRequest \Log::warning($e); } - return $asset; + return true; // or $asset, or whatever + } + + public function doSomethingElse() + { + } diff --git a/app/Http/Controllers/Api/CheckoutRequest.php b/app/Http/Controllers/Api/CheckoutRequest.php index f7a6023cd3..b1c976cf24 100644 --- a/app/Http/Controllers/Api/CheckoutRequest.php +++ b/app/Http/Controllers/Api/CheckoutRequest.php @@ -3,14 +3,27 @@ namespace App\Http\Controllers\Api; use App\Actions\CheckoutRequests\CreateCheckoutRequest; +use App\Exceptions\AssetNotRequestable; use App\Helpers\Helper; use App\Http\Controllers\Controller; +use App\Models\Asset; +use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\JsonResponse; class CheckoutRequest extends Controller { - public function store($assetId): JsonResponse + public function store(CheckoutRequestRequest $request, Asset $asset): JsonResponse { - CreateCheckoutRequest::run($assetId); + try { + CreateCheckoutRequest::run($asset, $request->validated()['user_id']); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.requests.success'))); + } catch (AssetNotRequestable $e) { + return response()->json(Helper::formatStandardApiResponse('error', 'Asset is not requestable')); + } catch (AuthorizationException $e) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.insufficient_permissions'))); + } catch (\Exception $e) { + report($e); + return response()->json(Helper::formatStandardApiResponse('error', null, 'Something terrible has gone wrong and we\'re not sure if we can help - may god have mercy on your soul. Contact your admin :)')); + } } } diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index 8c8b1e993f..605bbb8b99 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -146,29 +146,19 @@ class ViewAssetsController extends Controller * Process a specific requested asset * @param null $assetId */ - public function getRequestAsset(Asset $asset): RedirectResponse + public function store(Asset $asset): RedirectResponse { try { CreateCheckoutRequest::run($asset, auth()->user()); return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); } catch (AssetNotRequestable $e) { - return redirect()->back()->with('error', 'poop'); + return redirect()->back()->with('error', 'Asset is not requestable'); } catch (AuthorizationException $e) { return redirect()->back()->with('error', trans('admin/hardware/message.requests.error')); } catch (\Exception $e) { report($e); - return redirect()->back()->with('error', 'generic error message'); + return redirect()->back()->with('error', 'Something terrible has gone wrong and we\'re not sure if we can help - may god have mercy on your soul. Contact your admin :)'); } - - - //$status = CreateCheckoutRequest::run($asset, auth()->user()); - // - //return match ($status) { - // 'doesNotExist' => redirect()->route('requestable-assets')->with('error', trans('admin/hardware/message.does_not_exist_or_not_requestable')), - // 'accessDenied' => redirect()->route('requestable-assets')->with('error', trans('general.insufficient_permissions')), - // 'cancelled' => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')), - // default => redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')), - //}; } //public function destroy(Asset $asset): RedirectResponse diff --git a/routes/api.php b/routes/api.php index 0581a04682..129e4d6ea1 100644 --- a/routes/api.php +++ b/routes/api.php @@ -40,6 +40,8 @@ Route::group(['prefix' => 'v1', 'middleware' => ['api', 'throttle:api']], functi ] )->name('api.assets.requested'); + Route::post('request/{asset}', [Api\CheckoutRequest::class, 'store'])->name('api.assets.requests.store'); + Route::get('requestable/hardware', [ Api\AssetsController::class, diff --git a/routes/web.php b/routes/web.php index 137ed83b45..f719231c51 100644 --- a/routes/web.php +++ b/routes/web.php @@ -305,7 +305,7 @@ Route::group(['prefix' => 'account', 'middleware' => ['auth']], function () { )->name('requestable-assets'); Route::post( 'request-asset/{asset}', - [ViewAssetsController::class, 'getRequestAsset'] + [ViewAssetsController::class, 'store'] )->name('account/request-asset'); Route::post( diff --git a/tests/Feature/Checkouts/Api/AssetCheckoutTest.php b/tests/Feature/Checkouts/Api/AssetCheckoutTest.php index ded3889642..0763478a98 100644 --- a/tests/Feature/Checkouts/Api/AssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Api/AssetCheckoutTest.php @@ -21,6 +21,15 @@ class AssetCheckoutTest extends TestCase Event::fake([CheckoutableCheckedOut::class]); } + public function testCheckoutRequest() + { + $asset = Asset::factory()->create(); + + $this->actingAsForApi(User::factory()->create()) + ->post(route('api.assets.requests.store', $asset->id)) + ->assertOk(); + } + public function testCheckingOutAssetRequiresCorrectPermission() { $this->actingAsForApi(User::factory()->create()) From 8a99cc1391ef7c98a9bdf22060cd5709e67350cc Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Tue, 22 Oct 2024 17:25:58 -0500 Subject: [PATCH 08/17] test working --- app/Http/Controllers/Api/CheckoutRequest.php | 4 ++-- database/factories/AssetFactory.php | 16 ++++++++++++++-- .../Feature/Checkouts/Api/AssetCheckoutTest.php | 15 ++++++++++++--- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/Api/CheckoutRequest.php b/app/Http/Controllers/Api/CheckoutRequest.php index b1c976cf24..cf179fb813 100644 --- a/app/Http/Controllers/Api/CheckoutRequest.php +++ b/app/Http/Controllers/Api/CheckoutRequest.php @@ -12,10 +12,10 @@ use Illuminate\Http\JsonResponse; class CheckoutRequest extends Controller { - public function store(CheckoutRequestRequest $request, Asset $asset): JsonResponse + public function store(Asset $asset): JsonResponse { try { - CreateCheckoutRequest::run($asset, $request->validated()['user_id']); + CreateCheckoutRequest::run($asset, auth()->user()); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.requests.success'))); } catch (AssetNotRequestable $e) { return response()->json(Helper::formatStandardApiResponse('error', 'Asset is not requestable')); diff --git a/database/factories/AssetFactory.php b/database/factories/AssetFactory.php index 4d6d20651c..1923b15150 100644 --- a/database/factories/AssetFactory.php +++ b/database/factories/AssetFactory.php @@ -347,12 +347,24 @@ class AssetFactory extends Factory public function requestable() { - return $this->state(['requestable' => true]); + $id = Statuslabel::factory()->create([ + 'archived' => false, + 'deployable' => true, + 'pending' => true, + ])->id; + //return $this->state(['requestable' => true]); + return $this->state(['status_id' => $id]); } public function nonrequestable() { - return $this->state(['requestable' => false]); + $id = Statuslabel::factory()->create([ + 'archived' => true, + 'deployable' => false, + 'pending' => false, + ])->id; + //return $this->state(['requestable' => false]); + return $this->state(['status_id' => $id]); } public function noPurchaseOrEolDate() diff --git a/tests/Feature/Checkouts/Api/AssetCheckoutTest.php b/tests/Feature/Checkouts/Api/AssetCheckoutTest.php index 0763478a98..efbe745231 100644 --- a/tests/Feature/Checkouts/Api/AssetCheckoutTest.php +++ b/tests/Feature/Checkouts/Api/AssetCheckoutTest.php @@ -2,6 +2,8 @@ namespace Tests\Feature\Checkouts\Api; +use Illuminate\Support\Facades\Mail; +use Notification; use PHPUnit\Framework\Attributes\DataProvider; use App\Events\CheckoutableCheckedOut; use App\Models\Asset; @@ -23,11 +25,18 @@ class AssetCheckoutTest extends TestCase public function testCheckoutRequest() { - $asset = Asset::factory()->create(); + Notification::fake(); + $requestable = Asset::factory()->requestable()->create(); + $nonRequestable = Asset::factory()->nonrequestable()->create(); $this->actingAsForApi(User::factory()->create()) - ->post(route('api.assets.requests.store', $asset->id)) - ->assertOk(); + ->post(route('api.assets.requests.store', $requestable->id)) + ->assertStatusMessageIs('success'); + + $this->actingAsForApi(User::factory()->create()) + ->post(route('api.assets.requests.store', $nonRequestable->id)) + ->assertStatusMessageIs('error'); + } public function testCheckingOutAssetRequiresCorrectPermission() From 48c812d34564c08b5e177545714efd25ddb433c3 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Tue, 22 Oct 2024 20:48:27 -0500 Subject: [PATCH 09/17] bunch of cleanup, split cancel out --- .../CancelCheckoutRequest.php | 43 +++++++++++++++++++ .../CreateCheckoutRequest.php | 36 ++++------------ app/Http/Controllers/ViewAssetsController.php | 2 +- database/factories/AssetFactory.php | 6 +-- routes/web.php | 20 +++------ 5 files changed, 62 insertions(+), 45 deletions(-) create mode 100644 app/Actions/CheckoutRequests/CancelCheckoutRequest.php diff --git a/app/Actions/CheckoutRequests/CancelCheckoutRequest.php b/app/Actions/CheckoutRequests/CancelCheckoutRequest.php new file mode 100644 index 0000000000..235728be14 --- /dev/null +++ b/app/Actions/CheckoutRequests/CancelCheckoutRequest.php @@ -0,0 +1,43 @@ +cancelRequest(); + + $asset->decrement('requests_counter', 1); + + $data['item'] = $asset; + $data['target'] = $user; + $data['item_quantity'] = 1; + $settings = Setting::getSettings(); + + $logaction = Actionlog::create([ + 'item_id' => $data['asset_id'] = $asset->id, + 'item_type' => $data['item_type'] = Asset::class, + 'created_at' => $data['requested_date'] = date('Y-m-d H:i:s'), + 'target_id' => $data['user_id'] = auth()->id(), + 'target_type' => User::class, + 'location_id' => $user->location_id ?? null, + ]); + $logaction->logaction('request canceled'); + + try { + $settings->notify(new RequestAssetCancelation($data)); + } catch (\Exception $e) { + \Log::warning($e); + } + + return true; + } + +} \ No newline at end of file diff --git a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php index c9fd4c9387..825c1ddeb4 100644 --- a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php +++ b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php @@ -21,7 +21,6 @@ class CreateCheckoutRequest */ public static function run(Asset $asset, User $user): string { - //throw new \Exception(); if (is_null(Asset::RequestableAssets()->find($asset->id))) { throw new AssetNotRequestable($asset); } @@ -34,33 +33,16 @@ class CreateCheckoutRequest $data['item_quantity'] = 1; $settings = Setting::getSettings(); - $logaction = new Actionlog(); - $logaction->item_id = $data['asset_id'] = $asset->id; - $logaction->item_type = $data['item_type'] = Asset::class; - $logaction->created_at = $data['requested_date'] = date('Y-m-d H:i:s'); - - if ($user->location_id) { - $logaction->location_id = $user->location_id; - } - $logaction->target_id = $data['user_id'] = auth()->id(); - $logaction->target_type = User::class; - - // If it's already requested, cancel the request. - // this is going into another action class - if ($asset->isRequestedBy(auth()->user())) { - $asset->cancelRequest(); - $asset->decrement('requests_counter', 1); - - $logaction->logaction('request canceled'); - try { - $settings->notify(new RequestAssetCancelation($data)); - } catch (\Exception $e) { - \Log::warning($e); - } - return $status = 'cancelled'; - } - + $logaction = Actionlog::create([ + 'target_id' => $data['asset_id'] = $asset->id, + 'item_type' => $data['item_type'] = Asset::class, + 'created_at' => $data['requested_date'] = date('Y-m-d H:i:s'), + 'user_id' => $data['user_id'] = auth()->id(), + 'target_type' => User::class, + 'location_id' => $user->location_id ?? null, + ]); $logaction->logaction('requested'); + $asset->request(); $asset->increment('requests_counter', 1); try { diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index 605bbb8b99..1f4a54b4dd 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -83,7 +83,7 @@ class ViewAssetsController extends Controller return view('account/requestable-assets', compact('assets', 'models')); } - public function getRequestItem(Request $request, $itemType, $itemId = null, $cancel_by_admin = false, $requestingUser = null) : RedirectResponse + public function getRequestItem(Request $request, $itemType, $itemId = null, $cancel_by_admin = false, $requestingUser = null): RedirectResponse { $item = null; $fullItemType = 'App\\Models\\'.studly_case($itemType); diff --git a/database/factories/AssetFactory.php b/database/factories/AssetFactory.php index 1923b15150..00105205c1 100644 --- a/database/factories/AssetFactory.php +++ b/database/factories/AssetFactory.php @@ -352,8 +352,7 @@ class AssetFactory extends Factory 'deployable' => true, 'pending' => true, ])->id; - //return $this->state(['requestable' => true]); - return $this->state(['status_id' => $id]); + return $this->state(['status_id' => $id, 'requestable' => true]); } public function nonrequestable() @@ -363,8 +362,7 @@ class AssetFactory extends Factory 'deployable' => false, 'pending' => false, ])->id; - //return $this->state(['requestable' => false]); - return $this->state(['status_id' => $id]); + return $this->state(['status_id' => $id, 'requestable' => false]); } public function noPurchaseOrEolDate() diff --git a/routes/web.php b/routes/web.php index f719231c51..51451e5b8a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -294,24 +294,18 @@ Route::group(['prefix' => 'account', 'middleware' => ['auth']], function () { Route::get('api', [ProfileController::class, 'api'])->name('user.api'); // View Assets - Route::get('view-assets', [ViewAssetsController::class, 'getIndex'])->name('view-assets'); + Route::get('view-assets', [ViewAssetsController::class, 'index'])->name('view-assets'); Route::get('requested', [ViewAssetsController::class, 'getRequestedAssets'])->name('account.requested'); // Profile - Route::get( - 'requestable-assets', - [ViewAssetsController::class, 'getRequestableIndex'] - )->name('requestable-assets'); - Route::post( - 'request-asset/{asset}', - [ViewAssetsController::class, 'store'] - )->name('account/request-asset'); + Route::get('requestable-assets', [ViewAssetsController::class, 'getRequestableIndex'])->name('requestable-assets'); - Route::post( - 'request/{itemType}/{itemId}/{cancel_by_admin?}/{requestingUser?}', - [ViewAssetsController::class, 'getRequestItem'] - )->name('account/request-item'); + Route::post('request-asset/{asset}', [ViewAssetsController::class, 'store']) + ->name('account/request-asset'); + + Route::post('request/{itemType}/{itemId}/{cancel_by_admin?}/{requestingUser?}', [ViewAssetsController::class, 'getRequestItem']) + ->name('account/request-item'); // Account Dashboard Route::get('/', [ViewAssetsController::class, 'getIndex'])->name('account'); From 3ee008e871049b9405fc051a26ac987d4fff3734 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Tue, 22 Oct 2024 20:54:20 -0500 Subject: [PATCH 10/17] revert --- .../CheckoutRequests/CancelCheckoutRequest.php | 15 +++++++-------- .../CheckoutRequests/CreateCheckoutRequest.php | 15 +++++++-------- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/app/Actions/CheckoutRequests/CancelCheckoutRequest.php b/app/Actions/CheckoutRequests/CancelCheckoutRequest.php index 235728be14..ccad6b2e64 100644 --- a/app/Actions/CheckoutRequests/CancelCheckoutRequest.php +++ b/app/Actions/CheckoutRequests/CancelCheckoutRequest.php @@ -21,14 +21,13 @@ class CancelCheckoutRequest $data['item_quantity'] = 1; $settings = Setting::getSettings(); - $logaction = Actionlog::create([ - 'item_id' => $data['asset_id'] = $asset->id, - 'item_type' => $data['item_type'] = Asset::class, - 'created_at' => $data['requested_date'] = date('Y-m-d H:i:s'), - 'target_id' => $data['user_id'] = auth()->id(), - 'target_type' => User::class, - 'location_id' => $user->location_id ?? null, - ]); + $logaction = new Actionlog(); + $logaction->item_id = $data['asset_id'] = $asset->id; + $logaction->item_type = $data['item_type'] = Asset::class; + $logaction->created_at = $data['requested_date'] = date('Y-m-d H:i:s'); + $logaction->target_id = $data['user_id'] = auth()->id(); + $logaction->target_type = User::class; + $logaction->location_id = $user->location_id ?? null; $logaction->logaction('request canceled'); try { diff --git a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php index 825c1ddeb4..c90ca4f23c 100644 --- a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php +++ b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php @@ -33,14 +33,13 @@ class CreateCheckoutRequest $data['item_quantity'] = 1; $settings = Setting::getSettings(); - $logaction = Actionlog::create([ - 'target_id' => $data['asset_id'] = $asset->id, - 'item_type' => $data['item_type'] = Asset::class, - 'created_at' => $data['requested_date'] = date('Y-m-d H:i:s'), - 'user_id' => $data['user_id'] = auth()->id(), - 'target_type' => User::class, - 'location_id' => $user->location_id ?? null, - ]); + $logaction = new Actionlog(); + $logaction->item_id = $data['asset_id'] = $asset->id; + $logaction->item_type = $data['item_type'] = Asset::class; + $logaction->created_at = $data['requested_date'] = date('Y-m-d H:i:s'); + $logaction->target_id = $data['user_id'] = auth()->id(); + $logaction->target_type = User::class; + $logaction->location_id = $user->location_id ?? null; $logaction->logaction('requested'); $asset->request(); From 79e6eafafa7d0295827f8b88b96d3903396664ba Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Tue, 22 Oct 2024 22:33:29 -0500 Subject: [PATCH 11/17] cancelled scaffolded out --- app/Http/Controllers/Api/CheckoutRequest.php | 7 +++++++ app/Http/Controllers/ViewAssetsController.php | 12 ++++++------ routes/api.php | 1 + routes/web.php | 5 ++++- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/Api/CheckoutRequest.php b/app/Http/Controllers/Api/CheckoutRequest.php index cf179fb813..3b31451376 100644 --- a/app/Http/Controllers/Api/CheckoutRequest.php +++ b/app/Http/Controllers/Api/CheckoutRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Api; +use App\Actions\CheckoutRequests\CancelCheckoutRequest; use App\Actions\CheckoutRequests\CreateCheckoutRequest; use App\Exceptions\AssetNotRequestable; use App\Helpers\Helper; @@ -26,4 +27,10 @@ class CheckoutRequest extends Controller return response()->json(Helper::formatStandardApiResponse('error', null, 'Something terrible has gone wrong and we\'re not sure if we can help - may god have mercy on your soul. Contact your admin :)')); } } + + public function destroy(Asset $asset): JsonResponse + { + CancelCheckoutRequest::run($asset, auth()->user()); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.requests.canceled'))); + } } diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index 1f4a54b4dd..3f723559f0 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers; +use App\Actions\CheckoutRequests\CancelCheckoutRequest; use App\Actions\CheckoutRequests\CreateCheckoutRequest; use App\Exceptions\AssetNotRequestable; use App\Models\Actionlog; @@ -161,12 +162,11 @@ class ViewAssetsController extends Controller } } - //public function destroy(Asset $asset): RedirectResponse - //{ - // try { - // CancelCheckoutRequest($asset, auth()->user()); - // } - //} + public function destroy(Asset $asset): RedirectResponse + { + CancelCheckoutRequest::run($asset, auth()->user()); + return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); + } public function getRequestedAssets() : View diff --git a/routes/api.php b/routes/api.php index 129e4d6ea1..64c55e51da 100644 --- a/routes/api.php +++ b/routes/api.php @@ -41,6 +41,7 @@ Route::group(['prefix' => 'v1', 'middleware' => ['api', 'throttle:api']], functi )->name('api.assets.requested'); Route::post('request/{asset}', [Api\CheckoutRequest::class, 'store'])->name('api.assets.requests.store'); + Route::post('request/{asset}/cancel', [Api\CheckoutRequest::class, 'destroy'])->name('api.assets.requests.destroy'); Route::get('requestable/hardware', [ diff --git a/routes/web.php b/routes/web.php index 51451e5b8a..728c9c51e0 100644 --- a/routes/web.php +++ b/routes/web.php @@ -302,7 +302,10 @@ Route::group(['prefix' => 'account', 'middleware' => ['auth']], function () { Route::get('requestable-assets', [ViewAssetsController::class, 'getRequestableIndex'])->name('requestable-assets'); Route::post('request-asset/{asset}', [ViewAssetsController::class, 'store']) - ->name('account/request-asset'); + ->name('account.request-asset'); + + Route::post('request-asset/{asset}/cancel', [ViewAssetsController::class, 'destroy']) + ->name('account.request-asset.cancel'); Route::post('request/{itemType}/{itemId}/{cancel_by_admin?}/{requestingUser?}', [ViewAssetsController::class, 'getRequestItem']) ->name('account/request-item'); From b0d7eb216868a8f9e73cf64ceeeb270957aaec07 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Tue, 22 Oct 2024 22:44:28 -0500 Subject: [PATCH 12/17] cancel action finished --- app/Http/Controllers/ViewAssetsController.php | 2 +- resources/views/partials/bootstrap-table.blade.php | 2 +- routes/web.php | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index 3f723559f0..83a2168311 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -165,7 +165,7 @@ class ViewAssetsController extends Controller public function destroy(Asset $asset): RedirectResponse { CancelCheckoutRequest::run($asset, auth()->user()); - return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); + return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')); } diff --git a/resources/views/partials/bootstrap-table.blade.php b/resources/views/partials/bootstrap-table.blade.php index f24552d753..5a1b8f5c22 100644 --- a/resources/views/partials/bootstrap-table.blade.php +++ b/resources/views/partials/bootstrap-table.blade.php @@ -480,7 +480,7 @@ if (value.assigned_to_self == true){ return ''; } else if (value.available_actions.cancel == true) { - return '
@csrf
'; + return '
@csrf
'; } else if (value.available_actions.request == true) { return '
@csrf
'; } diff --git a/routes/web.php b/routes/web.php index 728c9c51e0..6e32ac0135 100644 --- a/routes/web.php +++ b/routes/web.php @@ -294,7 +294,7 @@ Route::group(['prefix' => 'account', 'middleware' => ['auth']], function () { Route::get('api', [ProfileController::class, 'api'])->name('user.api'); // View Assets - Route::get('view-assets', [ViewAssetsController::class, 'index'])->name('view-assets'); + Route::get('view-assets', [ViewAssetsController::class, 'getIndex'])->name('view-assets'); Route::get('requested', [ViewAssetsController::class, 'getRequestedAssets'])->name('account.requested'); From fdb6970f36456c3b85ad3e7dcdeb824a8c935280 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Wed, 23 Oct 2024 01:41:27 -0500 Subject: [PATCH 13/17] this is pretty much done --- .../CheckoutRequests/CreateCheckoutRequest.php | 12 +++--------- app/Http/Controllers/Api/CheckoutRequest.php | 9 +++++++-- app/Http/Controllers/ViewAssetsController.php | 9 +++++++-- 3 files changed, 17 insertions(+), 13 deletions(-) diff --git a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php index c90ca4f23c..9d1ba332ff 100644 --- a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php +++ b/app/Actions/CheckoutRequests/CreateCheckoutRequest.php @@ -12,6 +12,7 @@ use App\Models\User; use App\Notifications\RequestAssetCancelation; use App\Notifications\RequestAssetNotification; use Illuminate\Auth\Access\AuthorizationException; +use Log; class CreateCheckoutRequest { @@ -47,16 +48,9 @@ class CreateCheckoutRequest try { $settings->notify(new RequestAssetNotification($data)); } catch (\Exception $e) { - \Log::warning($e); + Log::warning($e); } - return true; // or $asset, or whatever + return true; } - - public function doSomethingElse() - { - - } - - } \ No newline at end of file diff --git a/app/Http/Controllers/Api/CheckoutRequest.php b/app/Http/Controllers/Api/CheckoutRequest.php index 3b31451376..1ee9c4c025 100644 --- a/app/Http/Controllers/Api/CheckoutRequest.php +++ b/app/Http/Controllers/Api/CheckoutRequest.php @@ -30,7 +30,12 @@ class CheckoutRequest extends Controller public function destroy(Asset $asset): JsonResponse { - CancelCheckoutRequest::run($asset, auth()->user()); - return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.requests.canceled'))); + try { + CancelCheckoutRequest::run($asset, auth()->user()); + return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.requests.canceled'))); + } catch (\Exception $e) { + report($e); + return response()->json(Helper::formatStandardApiResponse('error', null, $e->getMessage())); + } } } diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index 83a2168311..56d1f8b390 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -164,8 +164,13 @@ class ViewAssetsController extends Controller public function destroy(Asset $asset): RedirectResponse { - CancelCheckoutRequest::run($asset, auth()->user()); - return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')); + try { + CancelCheckoutRequest::run($asset, auth()->user()); + return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')); + } catch (\Exception $e) { + report($e); + return redirect()->back()->with('error', 'something bad happened'); + } } From c76cccbb68dc55300127204653e269f8f460e606 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Wed, 23 Oct 2024 12:56:36 -0500 Subject: [PATCH 14/17] rm extraneous methods in exception --- app/Exceptions/AssetNotRequestable.php | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/app/Exceptions/AssetNotRequestable.php b/app/Exceptions/AssetNotRequestable.php index 8c3daa7cf8..4067dda385 100644 --- a/app/Exceptions/AssetNotRequestable.php +++ b/app/Exceptions/AssetNotRequestable.php @@ -6,22 +6,4 @@ use Exception; class AssetNotRequestable extends Exception { - private $errorMessage = 'Asset not requestable'; - - public function __construct($errorMessage = null) - { - $this->errorMessage = $errorMessage; - - parent::__construct($errorMessage); - } - - public function __toString() - { - return is_null($this->errorMessage) ? 'This asset is not requestable.' : $this->errorMessage; - } - - public function getTranslatedMessage() - { - return trans($this->errorMessage); - } } From 513c78a09f36817d8454304d03b7750928499d09 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Tue, 3 Dec 2024 17:51:12 -0600 Subject: [PATCH 15/17] Refactor CheckoutRequest actions for consistency Renamed CheckoutRequest action classes to include "Action" in their names for consistency and clarity. Enhanced error handling in controllers to standardize error responses with translations. Updated usage of the renamed action classes throughout the code to ensure proper integration. --- ...st.php => CancelCheckoutRequestAction.php} | 8 +++++++- ...st.php => CreateCheckoutRequestAction.php} | 4 +--- app/Http/Controllers/Api/CheckoutRequest.php | 19 +++++++++++-------- app/Http/Controllers/ViewAssetsController.php | 18 +++++++++--------- routes/web.php | 1 - 5 files changed, 28 insertions(+), 22 deletions(-) rename app/Actions/CheckoutRequests/{CancelCheckoutRequest.php => CancelCheckoutRequestAction.php} (83%) rename app/Actions/CheckoutRequests/{CreateCheckoutRequest.php => CreateCheckoutRequestAction.php} (93%) diff --git a/app/Actions/CheckoutRequests/CancelCheckoutRequest.php b/app/Actions/CheckoutRequests/CancelCheckoutRequestAction.php similarity index 83% rename from app/Actions/CheckoutRequests/CancelCheckoutRequest.php rename to app/Actions/CheckoutRequests/CancelCheckoutRequestAction.php index ccad6b2e64..2d6dd68a08 100644 --- a/app/Actions/CheckoutRequests/CancelCheckoutRequest.php +++ b/app/Actions/CheckoutRequests/CancelCheckoutRequestAction.php @@ -4,14 +4,20 @@ namespace App\Actions\CheckoutRequests; use App\Models\Actionlog; use App\Models\Asset; +use App\Models\Company; use App\Models\Setting; use App\Models\User; use App\Notifications\RequestAssetCancelation; +use Illuminate\Auth\Access\AuthorizationException; -class CancelCheckoutRequest +class CancelCheckoutRequestAction { public static function run(Asset $asset, User $user) { + if (!Company::isCurrentUserHasAccess($asset)) { + throw new AuthorizationException(); + } + $asset->cancelRequest(); $asset->decrement('requests_counter', 1); diff --git a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php b/app/Actions/CheckoutRequests/CreateCheckoutRequestAction.php similarity index 93% rename from app/Actions/CheckoutRequests/CreateCheckoutRequest.php rename to app/Actions/CheckoutRequests/CreateCheckoutRequestAction.php index 9d1ba332ff..6870cfba2d 100644 --- a/app/Actions/CheckoutRequests/CreateCheckoutRequest.php +++ b/app/Actions/CheckoutRequests/CreateCheckoutRequestAction.php @@ -3,18 +3,16 @@ namespace App\Actions\CheckoutRequests; use App\Exceptions\AssetNotRequestable; -use App\Exceptions\ThereIsNoUser; use App\Models\Actionlog; use App\Models\Asset; use App\Models\Company; use App\Models\Setting; use App\Models\User; -use App\Notifications\RequestAssetCancelation; use App\Notifications\RequestAssetNotification; use Illuminate\Auth\Access\AuthorizationException; use Log; -class CreateCheckoutRequest +class CreateCheckoutRequestAction { /** * @throws AssetNotRequestable diff --git a/app/Http/Controllers/Api/CheckoutRequest.php b/app/Http/Controllers/Api/CheckoutRequest.php index 1ee9c4c025..9b66531ae4 100644 --- a/app/Http/Controllers/Api/CheckoutRequest.php +++ b/app/Http/Controllers/Api/CheckoutRequest.php @@ -2,40 +2,43 @@ namespace App\Http\Controllers\Api; -use App\Actions\CheckoutRequests\CancelCheckoutRequest; -use App\Actions\CheckoutRequests\CreateCheckoutRequest; +use App\Actions\CheckoutRequests\CancelCheckoutRequestAction; +use App\Actions\CheckoutRequests\CreateCheckoutRequestAction; use App\Exceptions\AssetNotRequestable; use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Models\Asset; use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\JsonResponse; +use Exception; class CheckoutRequest extends Controller { public function store(Asset $asset): JsonResponse { try { - CreateCheckoutRequest::run($asset, auth()->user()); + CreateCheckoutRequestAction::run($asset, auth()->user()); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.requests.success'))); } catch (AssetNotRequestable $e) { return response()->json(Helper::formatStandardApiResponse('error', 'Asset is not requestable')); } catch (AuthorizationException $e) { return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.insufficient_permissions'))); - } catch (\Exception $e) { + } catch (Exception $e) { report($e); - return response()->json(Helper::formatStandardApiResponse('error', null, 'Something terrible has gone wrong and we\'re not sure if we can help - may god have mercy on your soul. Contact your admin :)')); + return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.something_went_wrong'))); } } public function destroy(Asset $asset): JsonResponse { try { - CancelCheckoutRequest::run($asset, auth()->user()); + CancelCheckoutRequestAction::run($asset, auth()->user()); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/hardware/message.requests.canceled'))); - } catch (\Exception $e) { + } catch (AuthorizationException $e) { + return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.insufficient_permissions'))); + } catch (Exception $e) { report($e); - return response()->json(Helper::formatStandardApiResponse('error', null, $e->getMessage())); + return response()->json(Helper::formatStandardApiResponse('error', null, trans('general.something_went_wrong'))); } } } diff --git a/app/Http/Controllers/ViewAssetsController.php b/app/Http/Controllers/ViewAssetsController.php index 56d1f8b390..bbff6ba4f7 100755 --- a/app/Http/Controllers/ViewAssetsController.php +++ b/app/Http/Controllers/ViewAssetsController.php @@ -2,8 +2,8 @@ namespace App\Http\Controllers; -use App\Actions\CheckoutRequests\CancelCheckoutRequest; -use App\Actions\CheckoutRequests\CreateCheckoutRequest; +use App\Actions\CheckoutRequests\CancelCheckoutRequestAction; +use App\Actions\CheckoutRequests\CreateCheckoutRequestAction; use App\Exceptions\AssetNotRequestable; use App\Models\Actionlog; use App\Models\Asset; @@ -16,7 +16,7 @@ use Illuminate\Auth\Access\AuthorizationException; use Illuminate\Http\Request; use Illuminate\Http\RedirectResponse; use \Illuminate\Contracts\View\View; -use Illuminate\Support\Facades\Log; +use Exception; /** * This controller handles all actions related to the ability for users @@ -150,26 +150,26 @@ class ViewAssetsController extends Controller public function store(Asset $asset): RedirectResponse { try { - CreateCheckoutRequest::run($asset, auth()->user()); + CreateCheckoutRequestAction::run($asset, auth()->user()); return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.success')); } catch (AssetNotRequestable $e) { return redirect()->back()->with('error', 'Asset is not requestable'); } catch (AuthorizationException $e) { return redirect()->back()->with('error', trans('admin/hardware/message.requests.error')); - } catch (\Exception $e) { + } catch (Exception $e) { report($e); - return redirect()->back()->with('error', 'Something terrible has gone wrong and we\'re not sure if we can help - may god have mercy on your soul. Contact your admin :)'); + return redirect()->back()->with('error', trans('general.something_went_wrong')); } } public function destroy(Asset $asset): RedirectResponse { try { - CancelCheckoutRequest::run($asset, auth()->user()); + CancelCheckoutRequestAction::run($asset, auth()->user()); return redirect()->route('requestable-assets')->with('success')->with('success', trans('admin/hardware/message.requests.canceled')); - } catch (\Exception $e) { + } catch (Exception $e) { report($e); - return redirect()->back()->with('error', 'something bad happened'); + return redirect()->back()->with('error', trans('general.something_went_wrong')); } } diff --git a/routes/web.php b/routes/web.php index 5482de9cac..473ac9a2b4 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,6 +1,5 @@ Date: Tue, 25 Mar 2025 15:21:18 -0500 Subject: [PATCH 16/17] Refactor asset retrieval to support pagination. Introduced offset and limit handling for API asset queries to enable proper pagination. Adjusted the total count logic to maintain consistency in responses and ensure accurate transformation of assets. --- app/Http/Controllers/Api/AssetsController.php | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 87ecdcb607..8ae9bdbb8b 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -498,8 +498,14 @@ class AssetsController extends Controller $assets = $assets->withTrashed(); } - if (($assets = $assets->get()) && ($assets->count()) > 0) { - return (new AssetsTransformer)->transformAssets($assets, $assets->count()); + $offset = ($request->input('offset') > $assets->count()) ? $assets->count() : app('api_offset_value'); + $limit = app('api_limit_value'); + + $total = $assets->count(); + $assets = $assets->skip($offset)->take($limit)->get(); + + if (($assets) && ($assets->count()) > 0) { + return (new AssetsTransformer)->transformAssets($assets, $total); } // If there are 0 results, return the "no such asset" response From bfd827e5296e983ef118f83d5111b59fe671c148 Mon Sep 17 00:00:00 2001 From: spencerrlongg Date: Mon, 31 Mar 2025 12:28:03 -0500 Subject: [PATCH 17/17] added more eager loading --- app/Http/Controllers/Api/AssetsController.php | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index 8ae9bdbb8b..d780bd8bde 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -491,7 +491,18 @@ class AssetsController extends Controller public function showBySerial(Request $request, $serial): JsonResponse | array { $this->authorize('index', Asset::class); - $assets = Asset::where('serial', $serial)->with('assetstatus')->with('assignedTo'); + $assets = Asset::where('serial', $serial)->with([ + 'assetstatus', + 'assignedTo', + 'company', + 'defaultLoc', + 'location', + 'model.category', + 'model.depreciation', + 'model.fieldset', + 'model.manufacturer', + 'supplier', + ]); // Check if they've passed ?deleted=true if ($request->input('deleted', 'false') == 'true') {