Some checks failed
🚀 Build & Deploy Image / Determine Build Necessity (push) Failing after 10m14s
🚀 Build & Deploy Image / Build Runtime Base Image (push) Has been skipped
🚀 Build & Deploy Image / Build Docker Image (push) Has been skipped
🚀 Build & Deploy Image / Run Tests & Quality Checks (push) Has been skipped
🚀 Build & Deploy Image / Auto-deploy to Staging (push) Has been skipped
🚀 Build & Deploy Image / Auto-deploy to Production (push) Has been skipped
Security Vulnerability Scan / Check for Dependency Changes (push) Failing after 11m25s
Security Vulnerability Scan / Composer Security Audit (push) Has been cancelled
- Remove middleware reference from Gitea Traefik labels (caused routing issues) - Optimize Gitea connection pool settings (MAX_IDLE_CONNS=30, authentication_timeout=180s) - Add explicit service reference in Traefik labels - Fix intermittent 504 timeouts by improving PostgreSQL connection handling Fixes Gitea unreachability via git.michaelschiemer.de
111 lines
3.5 KiB
PHP
111 lines
3.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Framework\Console;
|
|
|
|
use App\Framework\Attributes\Route;
|
|
use App\Framework\Core\AttributeMapper;
|
|
use App\Framework\Core\ParameterTypeValidator;
|
|
use App\Framework\Mcp\McpTool;
|
|
use App\Framework\ReflectionLegacy\WrappedReflectionClass;
|
|
use App\Framework\ReflectionLegacy\WrappedReflectionMethod;
|
|
|
|
final readonly class ConsoleCommandMapper implements AttributeMapper
|
|
{
|
|
private ParameterTypeValidator $typeValidator;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->typeValidator = new ParameterTypeValidator();
|
|
}
|
|
|
|
public function getAttributeClass(): string
|
|
{
|
|
return ConsoleCommand::class;
|
|
}
|
|
|
|
public function map(WrappedReflectionClass|WrappedReflectionMethod $reflectionTarget, object $attributeInstance): ?array
|
|
{
|
|
if (! $reflectionTarget instanceof WrappedReflectionMethod) {
|
|
return null; // ConsoleCommand can only be applied to methods
|
|
}
|
|
|
|
// Check if method has multiple attributes (multi-purpose)
|
|
$hasMultipleAttributes = $this->hasMultiplePurposeAttributes($reflectionTarget);
|
|
|
|
// If multi-purpose, validate that all parameters are builtin types
|
|
if ($hasMultipleAttributes) {
|
|
$parameters = $reflectionTarget->getParameters()->toArray();
|
|
$reflectionParameters = [];
|
|
foreach ($parameters as $param) {
|
|
$reflectionParameters[] = $param->getType();
|
|
}
|
|
|
|
if (! $this->typeValidator->hasOnlyBuiltinParameters($reflectionParameters)) {
|
|
// Skip this attribute if parameters are not all builtin
|
|
return null;
|
|
}
|
|
}
|
|
|
|
// Get other attributes for metadata
|
|
$otherAttributes = $this->getOtherPurposeAttributes($reflectionTarget);
|
|
|
|
return [
|
|
'attribute_data' => [
|
|
'name' => $attributeInstance->name,
|
|
'description' => $attributeInstance->description,
|
|
],
|
|
'class' => $reflectionTarget->getDeclaringClass(),
|
|
'method' => $reflectionTarget->getName(),
|
|
'multi_purpose' => $hasMultipleAttributes,
|
|
'other_attributes' => $otherAttributes,
|
|
];
|
|
}
|
|
|
|
/**
|
|
* Check if method has multiple purpose attributes (McpTool, ConsoleCommand, Route)
|
|
*/
|
|
private function hasMultiplePurposeAttributes(WrappedReflectionMethod $method): bool
|
|
{
|
|
$attributes = $method->getAttributes();
|
|
$purposeAttributeCount = 0;
|
|
|
|
foreach ($attributes as $attribute) {
|
|
$attributeName = $attribute->getName();
|
|
if (in_array($attributeName, [
|
|
McpTool::class,
|
|
ConsoleCommand::class,
|
|
Route::class,
|
|
], true)) {
|
|
$purposeAttributeCount++;
|
|
}
|
|
}
|
|
|
|
return $purposeAttributeCount > 1;
|
|
}
|
|
|
|
/**
|
|
* Get other purpose attributes on the same method
|
|
*
|
|
* @return array<string>
|
|
*/
|
|
private function getOtherPurposeAttributes(WrappedReflectionMethod $method): array
|
|
{
|
|
$attributes = $method->getAttributes();
|
|
$otherAttributes = [];
|
|
|
|
foreach ($attributes as $attribute) {
|
|
$attributeName = $attribute->getName();
|
|
if (in_array($attributeName, [
|
|
McpTool::class,
|
|
Route::class,
|
|
], true)) {
|
|
$otherAttributes[] = $attributeName;
|
|
}
|
|
}
|
|
|
|
return $otherAttributes;
|
|
}
|
|
}
|