mirror of
https://github.com/snipe/snipe-it.git
synced 2024-11-09 23:24:06 -08:00
Refactor custom fields handling for storage
Signed-off-by: snipe <snipe@snipe.net>
This commit is contained in:
parent
ac9df2fc08
commit
1abd669de5
|
@ -585,49 +585,8 @@ class AssetsController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
$asset = $request->handleImages($asset);
|
$asset = $request->handleImages($asset);
|
||||||
|
$asset = $asset->handleCustomFieldsForStoring($request);
|
||||||
|
|
||||||
// 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('admin')) {
|
|
||||||
|
|
||||||
// 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 ($asset->save()) {
|
||||||
if ($request->get('assigned_user')) {
|
if ($request->get('assigned_user')) {
|
||||||
|
@ -688,32 +647,7 @@ class AssetsController extends Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
$asset = $request->handleImages($asset);
|
$asset = $request->handleImages($asset);
|
||||||
$model = AssetModel::find($asset->model_id);
|
$asset = $asset->handleCustomFieldsForStoring($request);
|
||||||
|
|
||||||
// Update custom fields
|
|
||||||
$problems_updating_encrypted_custom_fields = false;
|
|
||||||
if (($model) && (isset($model->fieldset))) {
|
|
||||||
foreach ($model->fieldset->fields as $field) {
|
|
||||||
$field_val = $request->input($field->db_column, null);
|
|
||||||
|
|
||||||
if ($request->has($field->db_column)) {
|
|
||||||
if ($field->element == 'checkbox') {
|
|
||||||
if(is_array($field_val)) {
|
|
||||||
$field_val = implode(',', $field_val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ($field->field_encrypted == '1') {
|
|
||||||
if (Gate::allows('admin')) {
|
|
||||||
$field_val = Crypt::encrypt($field_val);
|
|
||||||
} else {
|
|
||||||
$problems_updating_encrypted_custom_fields = true;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$asset->{$field->db_column} = $field_val;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ($asset->save()) {
|
if ($asset->save()) {
|
||||||
|
|
|
@ -160,29 +160,7 @@ class AssetsController extends Controller
|
||||||
$asset = $request->handleImages($asset);
|
$asset = $request->handleImages($asset);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update custom fields in the database.
|
$asset = $asset->handleCustomFieldsForStoring($request);
|
||||||
// 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('admin')) {
|
|
||||||
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
|
// Validate the asset before saving
|
||||||
if ($asset->isValid() && $asset->save()) {
|
if ($asset->isValid() && $asset->save()) {
|
||||||
|
@ -370,32 +348,7 @@ class AssetsController extends Controller
|
||||||
$asset->notes = $request->input('notes');
|
$asset->notes = $request->input('notes');
|
||||||
|
|
||||||
$asset = $request->handleImages($asset);
|
$asset = $request->handleImages($asset);
|
||||||
|
$asset = $asset->handleCustomFieldsForStoring($request);
|
||||||
// Update custom fields in the database.
|
|
||||||
// Validation for these fields is handlded through the AssetRequest form request
|
|
||||||
// FIXME: No idea why this is returning a Builder error on db_column_name.
|
|
||||||
// Need to investigate and fix. Using static method for now.
|
|
||||||
$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('admin')) {
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if ($asset->save()) {
|
if ($asset->save()) {
|
||||||
return redirect()->route('hardware.show', $assetId)
|
return redirect()->route('hardware.show', $assetId)
|
||||||
|
|
|
@ -13,10 +13,12 @@ use App\Presenters\Presentable;
|
||||||
use App\Presenters\AssetPresenter;
|
use App\Presenters\AssetPresenter;
|
||||||
use Illuminate\Support\Facades\Auth;
|
use Illuminate\Support\Facades\Auth;
|
||||||
use Carbon\Carbon;
|
use Carbon\Carbon;
|
||||||
|
use Illuminate\Support\Facades\Crypt;
|
||||||
use Illuminate\Support\Facades\DB;
|
use Illuminate\Support\Facades\DB;
|
||||||
use Illuminate\Database\Eloquent\Builder;
|
use Illuminate\Database\Eloquent\Builder;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||||
|
use Illuminate\Support\Facades\Gate;
|
||||||
use Illuminate\Support\Facades\Storage;
|
use Illuminate\Support\Facades\Storage;
|
||||||
use Watson\Validating\ValidatingTrait;
|
use Watson\Validating\ValidatingTrait;
|
||||||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||||
|
@ -966,6 +968,46 @@ class Asset extends Depreciable
|
||||||
return $cost;
|
return $cost;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function handleCustomFieldsForStoring($request) : Asset
|
||||||
|
{
|
||||||
|
$model = AssetModel::find($this->model_id);
|
||||||
|
|
||||||
|
if (($model) && ($model instanceof AssetModel) && ($model->fieldset)) {
|
||||||
|
|
||||||
|
foreach ($model->fieldset->fields as $field) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check if the decrypted existing value is different from one we just submitted
|
||||||
|
* and if not, pull it out of the object since it shouldn't really be updating at all.
|
||||||
|
* If we don't do this, it will try to re-encrypt it, and the same value encrypted two
|
||||||
|
* different times will have different values, so it will *look* like it was updated
|
||||||
|
* but it wasn't.
|
||||||
|
*/
|
||||||
|
if ($request->input($field->db_column)!='') {
|
||||||
|
|
||||||
|
if ($field->field_encrypted == '1') {
|
||||||
|
if (Gate::allows('admin')) {
|
||||||
|
if (is_array($request->input($field->db_column))) {
|
||||||
|
$this->{$field->db_column} = Crypt::encrypt(implode(', ', $request->input($field->db_column)));
|
||||||
|
} else {
|
||||||
|
$this->{$field->db_column} = Crypt::encrypt($request->input($field->db_column));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
if (is_array($request->input($field->db_column))) {
|
||||||
|
$this->{$field->db_column} = implode(', ', $request->input($field->db_column));
|
||||||
|
} else {
|
||||||
|
$this->{$field->db_column} = $request->input($field->db_column);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* -----------------------------------------------
|
* -----------------------------------------------
|
||||||
* BEGIN MUTATORS
|
* BEGIN MUTATORS
|
||||||
|
|
Loading…
Reference in a new issue