diff --git a/app/Http/Controllers/Api/CustomFieldsController.php b/app/Http/Controllers/Api/CustomFieldsController.php index 43100f8fa..fb0493046 100644 --- a/app/Http/Controllers/Api/CustomFieldsController.php +++ b/app/Http/Controllers/Api/CustomFieldsController.php @@ -2,11 +2,14 @@ namespace App\Http\Controllers\Api; +use App\Helpers\Helper; use App\Http\Controllers\Controller; use App\Http\Transformers\CustomFieldsTransformer; use App\Models\CustomField; use App\Models\CustomFieldset; use Illuminate\Http\Request; +use Validator; +use Illuminate\Validation\Rule; class CustomFieldsController extends Controller { @@ -27,6 +30,81 @@ class CustomFieldsController extends Controller $total = count($fields); return (new CustomFieldsTransformer)->transformCustomFields($fields, $total); } + + /** + * Shows the given field + * @author [V. Cordes] [] + * @param int $id + * @since [v4.1.10] + * @return View + */ + public function show($id) + { + $this->authorize('show', CustomField::class); + if ($field = CustomField::find($id)) { + return (new CustomFieldsTransformer)->transformCustomField($field); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/custom_fields/message.field.invalid')), 200); + } + + /** + * Update the specified field + * + * @author [V. Cordes] [] + * @since [v4.1.10] + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $this->authorize('edit', CustomField::class); + $field = CustomField::findOrFail($id); + $data = $request->all(); + + $validator = Validator::make($data, $field->validationRules()); + if ($validator->fails()) { + return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors())); + } + + $field->fill($data); + + if ($field->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $field, trans('admin/custom_fields/message.field.update.success'))); + } + + return response()->json(Helper::formatStandardApiResponse('error', null, $field->getErrors())); + } + + + /** + * Store a newly created field. + * + * @author [V. Cordes] [] + * @since [v4.1.10] + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $this->authorize('create', CustomField::class); + $field = new CustomField; + + $data = $request->all(); + $validator = Validator::make($data, $field->validationRules()); + if ($validator->fails()) { + return response()->json(Helper::formatStandardApiResponse('error', null, $validator->errors())); + } + $field->fill($data); + + if ($field->save()) { + return response()->json(Helper::formatStandardApiResponse('success', $field, trans('admin/custom_fields/message.field.create.success'))); + } + return response()->json(Helper::formatStandardApiResponse('error', null, $field->getErrors())); + + } + public function postReorder(Request $request, $id) { $fieldset = CustomFieldset::find($id); @@ -62,7 +140,7 @@ class CustomFieldsController extends Controller if ($field->fieldset->count() >0) { return response()->json(Helper::formatStandardApiResponse('error', null, 'Field is in use.')); } - + $field->delete(); return response()->json(Helper::formatStandardApiResponse('success', null, trans('admin/custom_fields/message.field.delete.success'))); diff --git a/app/Http/Transformers/CustomFieldsTransformer.php b/app/Http/Transformers/CustomFieldsTransformer.php index 4d41ce232..6e6a50a7e 100644 --- a/app/Http/Transformers/CustomFieldsTransformer.php +++ b/app/Http/Transformers/CustomFieldsTransformer.php @@ -22,6 +22,7 @@ class CustomFieldsTransformer { $array = [ + 'id' => $field->id, 'name' => e($field->name), 'db_column_name' => e($field->db_column_name()), 'format' => e($field->format), diff --git a/app/Models/CustomField.php b/app/Models/CustomField.php index 5906fed92..c744705f1 100644 --- a/app/Models/CustomField.php +++ b/app/Models/CustomField.php @@ -8,6 +8,7 @@ use App\Http\Traits\UniqueUndeletedTrait; use ForceUTF8\Encoding; use EasySlugger\Utf8Slugger; use Patchwork\Utf8; +use Illuminate\Validation\Rule; class CustomField extends Model { @@ -29,8 +30,18 @@ class CustomField extends Model "BOOLEAN" => "boolean", ]; - public $rules = [ - "name" => "required|unique:custom_fields" + /** + * The attributes that are mass assignable. + * + * @var array + */ + protected $fillable = [ + 'name', + 'element', + 'format', + 'field_values', + 'field_encrypted', + 'help_text' ]; // This is confusing, since it's actually the custom fields table that @@ -160,7 +171,7 @@ class CustomField extends Model public function getFormatAttribute($value) { foreach (self::$PredefinedFormats as $name => $pattern) { - if ($pattern === $value) { + if ($pattern === $value || $name === $value) { return $name; } } @@ -248,4 +259,26 @@ class CustomField extends Model return substr($long_slug, 0, 50) . '_' . $id; } + + /** + * Get validation rules for custom fields to use with Validator + * @author [V. Cordes] [] + * @param int $id + * @since [v4.1.10] + * @return Array + */ + public function validationRules() + { + return [ + "name" => "required|unique:custom_fields", + "element" => [ + "required", + Rule::in(['text', 'listbox']) + ], + 'format' => [ + Rule::in(array_merge(array_keys(CustomField::$PredefinedFormats), CustomField::$PredefinedFormats)) + ], + 'field_encrypted' => "nullable|boolean" + ]; + } } diff --git a/routes/api.php b/routes/api.php index c70014265..36646956c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -200,6 +200,18 @@ Route::group(['prefix' => 'v1','namespace' => 'Api'], function () { /*--- Fields API ---*/ + Route::resource('fields', 'CustomFieldsController', [ + 'names' => [ + 'index' => 'api.customfields.index', + 'show' => 'api.customfields.show', + 'store' => 'api.customfields.store', + 'update' => 'api.customfields.update', + 'destroy' => 'api.customfields.destroy' + ], + 'except' => [ 'create', 'edit' ], + 'parameters' => [ 'field' => 'field_id' ] + ]); + Route::group(['prefix' => 'fields'], function () { Route::post('fieldsets/{id}/order', [ @@ -207,13 +219,6 @@ Route::group(['prefix' => 'v1','namespace' => 'Api'], function () { 'uses' => 'CustomFieldsController@postReorder' ] ); - - Route::get('/', - [ - 'as' => 'api.customfields.index', - 'uses' => 'CustomFieldsController@index' - ] - ); }); // Fields group