Skip to content

WIP - Refactor custom fields handling for storage #15044

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 2 additions & 68 deletions app/Http/Controllers/Api/AssetsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -585,49 +585,8 @@ public function store(StoreAssetRequest $request): JsonResponse
}

$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 ($request->get('assigned_user')) {
Expand Down Expand Up @@ -688,32 +647,7 @@ public function update(ImageUploadRequest $request, $id)
}

$asset = $request->handleImages($asset);
$model = AssetModel::find($asset->model_id);

// 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;
}
}
}
$asset = $asset->handleCustomFieldsForStoring($request);


if ($asset->save()) {
Expand Down
51 changes: 2 additions & 49 deletions app/Http/Controllers/Assets/AssetsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -160,29 +160,7 @@ public function store(ImageUploadRequest $request)
$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('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);
}
}
}
}
$asset = $asset->handleCustomFieldsForStoring($request);

// Validate the asset before saving
if ($asset->isValid() && $asset->save()) {
Expand Down Expand Up @@ -370,32 +348,7 @@ public function update(ImageUploadRequest $request, $assetId = null)
$asset->notes = $request->input('notes');

$asset = $request->handleImages($asset);

// 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);
}
}
}
}

$asset = $asset->handleCustomFieldsForStoring($request);

if ($asset->save()) {
return redirect()->route('hardware.show', $assetId)
Expand Down
42 changes: 42 additions & 0 deletions app/Models/Asset.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@
use App\Presenters\AssetPresenter;
use Illuminate\Support\Facades\Auth;
use Carbon\Carbon;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\DB;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Storage;
use Watson\Validating\ValidatingTrait;
use Illuminate\Database\Eloquent\Casts\Attribute;
Expand Down Expand Up @@ -966,6 +968,46 @@ public function getComponentCost(){
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
Expand Down
Loading