diff --git a/app/Actions/Assets/StoreAssetAction.php b/app/Actions/Assets/StoreAssetAction.php index af771924f6..b6ca0a900c 100644 --- a/app/Actions/Assets/StoreAssetAction.php +++ b/app/Actions/Assets/StoreAssetAction.php @@ -13,10 +13,14 @@ use App\Models\User; use Carbon\Carbon; use Illuminate\Support\Facades\Crypt; use Illuminate\Support\Facades\Gate; +use Illuminate\Support\Facades\Log; use Illuminate\Support\MessageBag; class StoreAssetAction extends BaseAction { + /** + * @throws CheckoutNotAllowed + */ public static function run( $model_id,//gonna make these two optional for now... we can either make them required here or use the spread operator when calling... $status_id,// @@ -80,13 +84,19 @@ class StoreAssetAction extends BaseAction $asset->location_id = $rtd_location_id; } + //api only + if ($request->has('image_source')) { + $request->offsetSet('image', $request->offsetGet('image_source')); + } + if ($request->has('image')) { $asset = $request->handleImages($asset); } $model = AssetModel::find($model_id); - if (($model) && ($model->fieldset)) { + // added instanceof, was only in api before + if (($model) && ($model instanceof AssetModel) && ($model->fieldset)) { foreach ($model->fieldset->fields as $field) { if ($field->field_encrypted == '1') { if (Gate::allows('assets.view.encrypted_custom_fields')) { @@ -106,9 +116,46 @@ class StoreAssetAction extends BaseAction } } + // this is the api's custom fieldset logic, is there a real difference??????? + //if (($model) && ($model instanceof AssetModel) && ($model->fieldset)) { + // foreach ($model->fieldset->fields as $field) { + // + // // Set the field value based on what was sent in the request + // $field_val = $request->input($field->db_column, null); + // + // // If input value is null, use custom field's default value + // if ($field_val == null) { + // Log::debug('Field value for '.$field->db_column.' is null'); + // $field_val = $field->defaultValue($request->get('model_id')); + // Log::debug('Use the default fieldset value of '.$field->defaultValue($request->get('model_id'))); + // } + // + // // if the field is set to encrypted, make sure we encrypt the value + // if ($field->field_encrypted == '1') { + // Log::debug('This model field is encrypted in this fieldset.'); + // + // if (Gate::allows('assets.view.encrypted_custom_fields')) { + // + // // If input value is null, use custom field's default value + // if (($field_val == null) && ($request->has('model_id') != '')) { + // $field_val = Crypt::encrypt($field->defaultValue($request->get('model_id'))); + // } else { + // $field_val = Crypt::encrypt($request->input($field->db_column)); + // } + // } + // } + // if ($field->element == 'checkbox') { + // if (is_array($field_val)) { + // $field_val = implode(',', $field_val); + // } + // } + // } + + if ($asset->isValid() && $asset->save()) { if (request('assigned_user')) { $target = User::find(request('assigned_user')); + // the api doesn't have these location-y bits - good reason? $location = $target->location_id; } elseif (request('assigned_asset')) { $target = Asset::find(request('assigned_asset')); @@ -121,6 +168,12 @@ class StoreAssetAction extends BaseAction if (isset($target)) { $asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), $request->input('expected_checkin', null), 'Checked out on asset creation', $request->get('name'), $location); } + + //this was in api and not gui + if ($asset->image) { + $asset->image = $asset->getImageUrl(); + } + } if ($asset->save()) { diff --git a/app/Http/Controllers/Api/AssetsController.php b/app/Http/Controllers/Api/AssetsController.php index d8488f3229..c248624d98 100644 --- a/app/Http/Controllers/Api/AssetsController.php +++ b/app/Http/Controllers/Api/AssetsController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Api; use App\Actions\Assets\StoreAssetAction; use App\Events\CheckoutableCheckedIn; +use App\Exceptions\CheckoutNotAllowed; use App\Http\Requests\StoreAssetRequest; use App\Http\Requests\UpdateAssetRequest; use App\Http\Traits\MigratesLegacyAssetLocations; @@ -595,122 +596,47 @@ class AssetsController extends Controller */ public function store(StoreAssetRequest $request): JsonResponse { - $asset_tags = $request->input('asset_tags'); - $serials = $request->input('serials'); - $custom_fields = $request->collect()->filter(function ($value, $key) { - return starts_with($key, '_snipeit_'); - }); - - StoreAssetAction::run( - $request->validated('model_id'), - $request->validated('status_id'), - $request->validated('name'), - $serials[$key], - $request->validated('company_id'), - $asset_tag, - $request->validated('order_number'), - $request->validated('notes'), - $request->validated('user_id'), - $request->validated('warranty_months'), - $request->validated('purchase_cost'), - $request->validated('asset_eol_date'), - $request->validated('purchase_date'), - $request->validated('assigned_to'), - $request->validated('supplier_id'), - $request->validated('requestable'), - $request->validated('rtd_location_id'), - $request->validated('location_id'), - $request->validated('files'), - $request->validated('byod'), - $request->validated('assigned_user'), - $request->validated('assigned_asset'), - $request->validated('assigned_location'), - $custom_fields, - $request, - ); - - - $asset = new Asset(); - $asset->model()->associate(AssetModel::find((int) $request->get('model_id'))); - - $asset->fill($request->validated()); - $asset->created_by = auth()->id(); - - /** - * this is here just legacy reasons. Api\AssetController - * used image_source once to allow encoded image uploads. - */ - if ($request->has('image_source')) { - $request->offsetSet('image', $request->offsetGet('image_source')); - } - - $asset = $request->handleImages($asset); - - // Update custom fields in the database. - $model = AssetModel::find($request->input('model_id')); - - // Check that it's an object and not a collection - // (Sometimes people send arrays here and they shouldn't - if (($model) && ($model instanceof AssetModel) && ($model->fieldset)) { - foreach ($model->fieldset->fields as $field) { - - // Set the field value based on what was sent in the request - $field_val = $request->input($field->db_column, null); - - // If input value is null, use custom field's default value - if ($field_val == null) { - Log::debug('Field value for '.$field->db_column.' is null'); - $field_val = $field->defaultValue($request->get('model_id')); - Log::debug('Use the default fieldset value of '.$field->defaultValue($request->get('model_id'))); - } - - // if the field is set to encrypted, make sure we encrypt the value - if ($field->field_encrypted == '1') { - Log::debug('This model field is encrypted in this fieldset.'); - - if (Gate::allows('assets.view.encrypted_custom_fields')) { - - // If input value is null, use custom field's default value - if (($field_val == null) && ($request->has('model_id') != '')) { - $field_val = Crypt::encrypt($field->defaultValue($request->get('model_id'))); - } else { - $field_val = Crypt::encrypt($request->input($field->db_column)); - } - } - } - if ($field->element == 'checkbox') { - if(is_array($field_val)) { - $field_val = implode(',', $field_val); - } - } - - - $asset->{$field->db_column} = $field_val; - } - } - - if ($asset->save()) { - if ($request->get('assigned_user')) { - $target = User::find(request('assigned_user')); - } elseif ($request->get('assigned_asset')) { - $target = Asset::find(request('assigned_asset')); - } elseif ($request->get('assigned_location')) { - $target = Location::find(request('assigned_location')); - } - if (isset($target)) { - $asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), '', 'Checked out on asset creation', e($request->get('name'))); - } - - if ($asset->image) { - $asset->image = $asset->getImageUrl(); - } + try { + $custom_fields = $request->collect()->filter(function ($value, $key) { + return starts_with($key, '_snipeit_'); + }); + $asset = StoreAssetAction::run( + $request->validated('model_id'), + $request->validated('status_id'), + $request->validated('name'), + $request->validated('serial'), + $request->validated('company_id'), + $request->validated('asset_tag'), + $request->validated('order_number'), + $request->validated('notes'), + $request->validated('user_id'), + $request->validated('warranty_months'), + $request->validated('purchase_cost'), + $request->validated('asset_eol_date'), + $request->validated('purchase_date'), + $request->validated('assigned_to'), + $request->validated('supplier_id'), + $request->validated('requestable'), + $request->validated('rtd_location_id'), + $request->validated('location_id'), + $request->validated('files'), + $request->validated('byod'), + $request->validated('assigned_user'), + $request->validated('assigned_asset'), + $request->validated('assigned_location'), + $custom_fields, + $request, + ); return response()->json(Helper::formatStandardApiResponse('success', $asset, trans('admin/hardware/message.create.success'))); + // not sure why we're not using this yet, but i know there's a reason and a reason we want to return response()->json(Helper::formatStandardApiResponse('success', (new AssetsTransformer)->transformAsset($asset), trans('admin/hardware/message.create.success'))); + } catch (CheckoutNotAllowed $e) { + return response()->json(Helper::formatStandardApiResponse('error', null, $e->getMessage()), 200); + } catch (\Exception $e) { + return response()->json(Helper::formatStandardApiResponse('error', null, $e->getMessage())); } - - return response()->json(Helper::formatStandardApiResponse('error', null, $asset->getErrors()), 200); } diff --git a/app/Http/Controllers/Assets/AssetsController.php b/app/Http/Controllers/Assets/AssetsController.php index 1479d11fd0..3ee352dc89 100755 --- a/app/Http/Controllers/Assets/AssetsController.php +++ b/app/Http/Controllers/Assets/AssetsController.php @@ -102,7 +102,6 @@ class AssetsController extends Controller public function store(StoreAssetRequest $request): RedirectResponse { try { - $asset_tags = $request->input('asset_tags'); $serials = $request->input('serials'); $custom_fields = $request->collect()->filter(function ($value, $key) { @@ -110,7 +109,7 @@ class AssetsController extends Controller }); //DB::transaction(function () use ($request, $asset_tags, $serials, $custom_fields) { foreach ($asset_tags as $key => $asset_tag) { - StoreAssetAction::run( + $asset = StoreAssetAction::run( $request->validated('model_id'), $request->validated('status_id'), $request->validated('name'), @@ -139,129 +138,16 @@ class AssetsController extends Controller ); } //}); - return redirect()->route('hardware.index')->with('success', trans('admin/hardware/message.create.success')); + session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); + return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) + ->with('success-unescaped', trans('admin/hardware/message.create.success_linked', ['link' => route('hardware.show', ['hardware' => $asset->id]), 'id', 'tag' => e($asset->asset_tag)])); } catch (CheckoutNotAllowed $e) { return redirect()->route('hardware.index')->with('error', trans('admin/hardware/message.create.error')); } catch (\Exception $e) { - return redirect()->back()->withInput()->withErrors($asset); + return redirect()->back()->with('error', trans('admin/hardware/message.create.error')); } - - - // so do we want to foreach over the action, or convert the api's asset tags to an array as well - // so we can just easily add it to the action? // (obviously then this would move up to the request) $this->validate($request, ['asset_tags' => ['required', 'array']]); - - // Handle asset tags - there could be one, or potentially many. - // This is only necessary on create, not update, since bulk editing is handled - // differently - $asset_tags = $request->input('asset_tags'); - - $settings = Setting::getSettings(); - - $success = false; - $serials = $request->input('serials'); - - for ($a = 1; $a <= count($asset_tags); $a++) { - $asset = new Asset(); - $asset->model()->associate(AssetModel::find($request->input('model_id'))); - $asset->name = $request->input('name'); - - // Check for a corresponding serial - if (($serials) && (array_key_exists($a, $serials))) { - $asset->serial = $serials[$a]; - } - - if (($asset_tags) && (array_key_exists($a, $asset_tags))) { - $asset->asset_tag = $asset_tags[$a]; - } - - $asset->company_id = Company::getIdForCurrentUser($request->input('company_id')); - $asset->model_id = $request->input('model_id'); - $asset->order_number = $request->input('order_number'); - $asset->notes = $request->input('notes'); - $asset->created_by = auth()->id(); - $asset->status_id = request('status_id'); - $asset->warranty_months = request('warranty_months', null); - $asset->purchase_cost = request('purchase_cost'); - $asset->purchase_date = request('purchase_date', null); - $asset->asset_eol_date = request('asset_eol_date', null); - $asset->assigned_to = request('assigned_to', null); - $asset->supplier_id = request('supplier_id', null); - $asset->requestable = request('requestable', 0); - $asset->rtd_location_id = request('rtd_location_id', null); - $asset->byod = request('byod', 0); - - if (! empty($settings->audit_interval)) { - $asset->next_audit_date = Carbon::now()->addMonths($settings->audit_interval)->toDateString(); - } - - // Set location_id to rtd_location_id ONLY if the asset isn't being checked out - if (!request('assigned_user') && !request('assigned_asset') && !request('assigned_location')) { - $asset->location_id = $request->input('rtd_location_id', null); - } - - // Create the image (if one was chosen.) - //this one's interesting... - if ($request->has('image')) { - $asset = $request->handleImages($asset); - } - - // Update custom fields in the database. - // Validation for these fields is handled through the AssetRequest form request - $model = AssetModel::find($request->get('model_id')); - - if (($model) && ($model->fieldset)) { - foreach ($model->fieldset->fields as $field) { - if ($field->field_encrypted == '1') { - if (Gate::allows('assets.view.encrypted_custom_fields')) { - if (is_array($request->input($field->db_column))) { - $asset->{$field->db_column} = Crypt::encrypt(implode(', ', $request->input($field->db_column))); - } else { - $asset->{$field->db_column} = Crypt::encrypt($request->input($field->db_column)); - } - } - } else { - if (is_array($request->input($field->db_column))) { - $asset->{$field->db_column} = implode(', ', $request->input($field->db_column)); - } else { - $asset->{$field->db_column} = $request->input($field->db_column); - } - } - } - } - - // Validate the asset before saving - if ($asset->isValid() && $asset->save()) { - if (request('assigned_user')) { - $target = User::find(request('assigned_user')); - $location = $target->location_id; - } elseif (request('assigned_asset')) { - $target = Asset::find(request('assigned_asset')); - $location = $target->location_id; - } elseif (request('assigned_location')) { - $target = Location::find(request('assigned_location')); - $location = $target->id; - } - - if (isset($target)) { - $asset->checkOut($target, auth()->user(), date('Y-m-d H:i:s'), $request->input('expected_checkin', null), 'Checked out on asset creation', $request->get('name'), $location); - } - - $success = true; - - } - } - - session()->put(['redirect_option' => $request->get('redirect_option'), 'checkout_to_type' => $request->get('checkout_to_type')]); - - - if ($success) { - return redirect()->to(Helper::getRedirectOption($request, $asset->id, 'Assets')) - ->with('success-unescaped', trans('admin/hardware/message.create.success_linked', ['link' => route('hardware.show', ['hardware' => $asset->id]), 'id', 'tag' => e($asset->asset_tag)])); - } - - return redirect()->back()->withInput()->withErrors($asset->getErrors()); } diff --git a/app/Http/Requests/StoreAssetRequest.php b/app/Http/Requests/StoreAssetRequest.php index 8f013cb218..fb7469ac88 100644 --- a/app/Http/Requests/StoreAssetRequest.php +++ b/app/Http/Requests/StoreAssetRequest.php @@ -36,14 +36,6 @@ class StoreAssetRequest extends ImageUploadRequest $this->parseLastAuditDate(); - // maybe do something like this? - //if (!is_array($this->asset_tag)) { - // $this->asset_tag = [$this->asset_tag]; - //} - //if (!is_array($this->serial)) { - // $this->serial = [$this->serial]; - //} - $this->merge([ 'asset_tag' => $this->asset_tag ?? Asset::autoincrement_asset(), 'company_id' => $idForCurrentUser,