lean-api/src/EntityDescriptor.php
2026-05-21 14:58:21 +00:00

104 lines
4.1 KiB
PHP

<?php
namespace Lean\Api;
use Lean\Api\Attribute\EntityField;
use Lean\Factory\HttpFactory;
use Notes\ObjectReflection;
use Notes\Route\Attribute\Method\Route;
use Ulmus\Attribute\Obj\Table;
use Ulmus\Attribute\Property\ArrayOf;
use Ulmus\Attribute\Property\Field;
use Ulmus\SearchRequest\Attribute\SearchParameter;
use Ulmus\SearchRequest\Attribute\SearchRequestParameter;
class EntityDescriptor
{
use DescriptorTrait;
public function __construct() {}
public function getEntities(...$entities) : array
{
$list = [];
foreach($entities as $entity) {
$fields = [];
$entityName = is_object($entity) ? $entity::class : $entity;
$reflector = new ObjectReflection($entityName);
$table = $reflector->reflectClass()->getAttribute(Table::class);
foreach ($reflector->reflectProperties() as $property) {
$entityField = $property->getAttribute(EntityField::class);
$field = $property->getAttribute(Field::class);
if ($field) {
$arrayOf = $property->getAttribute(ArrayOf::class);
$types = $property->getTypes();
if ($property->value ?? false) {
$default = $property->value instanceof \BackedEnum ? $property->value->value : $property->value;
}
else {
$default = $field->object->attributes['default'] ?? null;
}
$fields[] = [
'name' => $property->name,
'description' => $entityField->object->description ?? "",
'fieldName' => $field->object->name ?: $property->name,
'tag' => $field->tag,
'type' => $field->object->type ?? implode(' | ', array_map(fn($e) => $e->type, $types)),
'allowNulls' => $property->allowsNull(),
'length' => $field->object->length ?? null,
'readonly' => $field->object->readonly,
'default' => $default,
'arrayOf' => $arrayOf ?? null,
];
}
}
$searchFields = [];
$searchRequestReflector = new ObjectReflection($entityName::searchRequest()::class);
$searchRequestParameter = $searchRequestReflector->reflectClass()->getAttribute(SearchRequestParameter::class);
foreach($searchRequestReflector->reflectProperties() as $property) {
$field = $property->getAttribute(SearchParameter::class);
if ($field) {
$possibleValues = null;
$types = $property->getTypes();
foreach($types as $type) {
if (! $type->builtIn && enum_exists($type->type)) {
$possibleValues = implode(', ', array_map(fn($e) => $e->value, $type->type::cases()));
}
}
$searchFields[] = [
'name' => $property->name,
'description' => $field->object->description,
'parameter' => $field->object->parameter ? implode(', ', $field->object->getParameters()) : $property->name,
'tag' => $field->tag,
'type' => implode(' | ', array_map(fn($e) => $e->type, $types)),
'allowNulls' => $property->allowsNull(),
'possibleValues' => $possibleValues,
'default' => $this->displayValue($property->value ?? "")
];
}
}
$list[$entity] = [
'className' => $reflector->reflectClass()->getClassName(),
'description' => $table->object->description ?? null,
'fields' => $fields,
'searchRequestDescription' => $searchRequestParameter->object->description ?? "",
'searchRequestFields' => $searchFields,
];
}
return $list;
}
}