. */ declare(strict_types=1); namespace FireflyIII\Rules; use Closure; use Illuminate\Contracts\Validation\ValidationRule; use Illuminate\Support\Facades\Validator; use JsonException; /** * Class IsValidBulkClause */ class IsValidBulkClause implements ValidationRule { private string $error; private array $rules; /** * @param string $type */ public function __construct(string $type) { $this->rules = config(sprintf('bulk.%s', $type)); $this->error = (string)trans('firefly.belongs_user'); } /** * @return string */ public function message(): string { return $this->error; } /** * @param string $attribute * @param mixed $value * @param Closure $fail * * @return void */ public function validate(string $attribute, mixed $value, Closure $fail): void { $result = $this->basicValidation((string)$value); if (false === $result) { $fail($this->error); } } /** * Does basic rule based validation. * * @param string $value * * @return bool */ private function basicValidation(string $value): bool { try { $array = json_decode($value, true, 8, JSON_THROW_ON_ERROR); } catch (JsonException $e) { $this->error = (string)trans('validation.json'); return false; } $clauses = ['where', 'update']; foreach ($clauses as $clause) { if (!array_key_exists($clause, $array)) { $this->error = (string)trans(sprintf('validation.missing_%s', $clause)); return false; } /** * @var string $arrayKey * @var mixed $arrayValue */ foreach ($array[$clause] as $arrayKey => $arrayValue) { if (!array_key_exists($arrayKey, $this->rules[$clause])) { $this->error = (string)trans(sprintf('validation.invalid_%s_key', $clause)); return false; } // validate! $validator = Validator::make(['value' => $arrayValue], [ 'value' => $this->rules[$clause][$arrayKey], ]); if ($validator->fails()) { $this->error = sprintf('%s: %s: %s', $clause, $arrayKey, implode(', ', ($validator->errors()->get('value')))); return false; } } } return true; } }