Files
lucent-laravel/src/Core/Record/RecordValidationModule.php
T

166 lines
4.3 KiB
PHP
Raw Normal View History

2026-01-09 16:54:42 +02:00
<?php namespace Lucent\Core\Record;
2026-01-09 19:08:00 +02:00
use Illuminate\Support\Facades\Validator;
2026-01-09 16:54:42 +02:00
use Lucent\Core\Data\RecordError;
use Lucent\Core\Data\RecordField;
use Lucent\Core\Data\RecordMode;
use Lucent\Core\Schema\Data\Field;
class RecordValidationModule
{
/**
* Validates a record against a schema.
*
* @param string[] $locales
* @param Field[] $schemaFields
* @param RecordField[] $recordFields
* @return RecordError[]
*/
public static function validate(
array $locales,
array $schemaFields,
array $recordFields,
): array {
$errors = [];
foreach ($schemaFields as $schemaField) {
$res = static::validateField("main", $schemaField, $recordFields);
2026-01-09 19:08:00 +02:00
$errors[] = $res;
2026-01-09 16:54:42 +02:00
if ($schemaField->translatable) {
foreach ($locales as $locale) {
$res = static::validateField(
$locale["id"],
$schemaField,
$recordFields,
);
2026-01-09 19:08:00 +02:00
$errors[] = $res;
2026-01-09 16:54:42 +02:00
}
}
}
return collect($errors)
->filter(fn($err) => $err !== null)
->values()
->toArray();
}
/**
*
* @param Field $schemaField
* @param RecordField[] $recordFields
* @return array
*/
public static function validateField(
string $locale,
Field $schemaField,
array $recordFields,
2026-01-09 19:08:00 +02:00
): ?RecordError {
2026-01-09 16:54:42 +02:00
// General Validations
$error = static::validateRequired($locale, $schemaField, $recordFields);
2026-01-09 19:08:00 +02:00
if (!empty($error)) {
return $error;
}
2026-01-09 16:54:42 +02:00
// Type specific
2026-01-09 19:08:00 +02:00
$error = match ($schemaField->type) {
"text" => static::validateText(
$locale,
$schemaField,
$recordFields,
),
default => static::validateText(
$locale,
$schemaField,
$recordFields,
),
};
2026-01-09 16:54:42 +02:00
2026-01-09 19:08:00 +02:00
return $error;
2026-01-09 16:54:42 +02:00
}
/**
*
* @param Field $schemaField
* @param RecordField[] $recordFields
* @return ?RecordError
*/
public static function validateRequired(
string $locale,
Field $schemaField,
array $recordFields,
): ?RecordError {
if ($schemaField->required === false) {
return null;
}
2026-01-09 19:08:00 +02:00
$recordField = static::findField($recordFields, $schemaField, $locale);
2026-01-09 16:54:42 +02:00
if (empty($recordField) || empty($recordField->value)) {
return new RecordError(
$schemaField->id,
$locale,
"This field is required",
);
}
return null;
}
2026-01-09 19:08:00 +02:00
/**
*
* @param Field $schemaField
* @param RecordField[] $recordFields
* @return ?RecordError
*/
public static function validateText(
string $locale,
Field $schemaField,
array $recordFields,
): ?RecordError {
$recordField = static::findField($recordFields, $schemaField, $locale);
if (empty($recordField)) {
// We have already checked for required fields so only validate existing
return null;
}
$rules = "";
if ($schemaField->props->min > 0) {
$rules = "min:" . $schemaField->props->min;
}
if ($schemaField->props->max > 0) {
$rules = "max:" . $schemaField->props->max;
}
if (empty($rules)) {
return null;
}
$validator = Validator::make(
["value" => $recordField->value],
[
"value" => $rules,
],
);
if ($validator->fails()) {
return new RecordError(
$schemaField->id,
$locale,
$validator->errors()->first(),
);
}
return null;
}
private static function findField(
array $recordFields,
Field $schemaField,
string $locale,
): ?RecordField {
return collect($recordFields)->first(
2026-01-10 02:09:50 +02:00
fn(RecordField $field) => $field->fieldId === $schemaField->id &&
2026-01-09 19:08:00 +02:00
$field->locale === $locale &&
$field->mode === RecordMode::DRAFT,
);
}
2026-01-09 16:54:42 +02:00
}