You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
112 lines
3.2 KiB
112 lines
3.2 KiB
<?php
|
|
|
|
namespace App\Models\Traits;
|
|
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Database\Eloquent\SoftDeletes;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Support\Facades\Validator;
|
|
use Illuminate\Validation\ValidationException;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
trait Validatable
|
|
{
|
|
|
|
private $validationState;
|
|
|
|
public $autoValidation = true;
|
|
|
|
public function autoValidate($validate = true)
|
|
{
|
|
$this->autoValidation = $validate;
|
|
}
|
|
|
|
protected static function bootValidatable()
|
|
{
|
|
static::saving(function (Model $model) {
|
|
if (!isset($model->autoValidation) || (isset($model->autoValidation) && $model->autoValidation)) {
|
|
$model->validate();
|
|
//todo:add default values to request.
|
|
}
|
|
});
|
|
|
|
if (collect(class_uses_recursive(static::class))->contains(SoftDeletes::class)) {
|
|
|
|
static::restoring(function (Model $model) {
|
|
$model->validationState = $model->autoValidation;
|
|
$model->autoValidate(false);
|
|
});
|
|
|
|
static::restored(function (Model $model) {
|
|
$model->autoValidate($model->validationState);
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* Common Rules for prevent duplicate!
|
|
*
|
|
* @return array
|
|
*/
|
|
public abstract function rules(): array;
|
|
|
|
public function validate($fields = [], $abort = true)
|
|
{
|
|
$modelDocument = app('modelDocument');
|
|
$rules = $this->rules();
|
|
$rules = array_merge($rules, $this->createValidations());
|
|
$rules = array_merge($rules, $this->createValidations('category_data'));
|
|
|
|
|
|
$validator = Validator::make($this->toArray(), $rules);
|
|
|
|
if ($abort && $validator->fails()) {
|
|
throw new ValidationException($validator,
|
|
new JsonResponse([
|
|
"message" => "The given data was invalid.",
|
|
"errors" => $validator->errors()->getMessages()
|
|
], Response::HTTP_UNPROCESSABLE_ENTITY)
|
|
);
|
|
}
|
|
|
|
//todo:shite code
|
|
$fields = json_decode($this->attributes['fields'] ?? '');
|
|
collect($modelDocument?->fields)->filter(fn($f) => !empty($f['info']['default']))
|
|
->each(function ($field) use (&$fields) {
|
|
$fields->{$field['name']} = $fields->{$field['name']} ?? $field['info']['default'];
|
|
});
|
|
if ($this->attributes['fields'] ?? false){
|
|
$this->attributes['fields'] = json_encode($fields);
|
|
}
|
|
|
|
|
|
return $abort ? $this : true;
|
|
}
|
|
|
|
public function getLoads()
|
|
{
|
|
return [];
|
|
}
|
|
|
|
public function allowLoad()
|
|
{
|
|
$includes = request()->filled('include') ? explode(',', trim(request()->include, ',')) : [];
|
|
$getLoad = $this->getLoads();
|
|
$allow_load = [];
|
|
|
|
foreach ($includes as $include) {
|
|
$include = trim($include);
|
|
if (in_array($include, $getLoad, true)) {
|
|
array_push($allow_load, $include);
|
|
} else {
|
|
abort(Response::HTTP_BAD_REQUEST, "Requested include $include are not allowed");
|
|
}
|
|
}
|
|
|
|
$this->load($allow_load);
|
|
|
|
return $this;
|
|
}
|
|
}
|