Skip to content

Commit

Permalink
added operation transformers api
Browse files Browse the repository at this point in the history
  • Loading branch information
romalytvynenko committed Jan 31, 2025
1 parent 820d1dd commit 318ae2b
Show file tree
Hide file tree
Showing 12 changed files with 74 additions and 283 deletions.
6 changes: 5 additions & 1 deletion src/Configuration/OperationTransformers.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

namespace Dedoc\Scramble\Configuration;

use Dedoc\Scramble\Support\OperationExtensions\DeprecationExtension;
use Dedoc\Scramble\Support\OperationExtensions\ErrorResponsesExtension;
use Dedoc\Scramble\Support\OperationExtensions\RequestBodyExtension;
use Dedoc\Scramble\Support\OperationExtensions\RequestEssentialsExtension;
use Dedoc\Scramble\Support\OperationExtensions\ResponseExtension;
Expand Down Expand Up @@ -47,13 +49,15 @@ public function all(): array
$base = $this->transformers ?: [
RequestEssentialsExtension::class,
RequestBodyExtension::class,
ErrorResponsesExtension::class,
ResponseExtension::class,
DeprecationExtension::class,
];

return array_values(array_unique([
...$this->prepends,
...$base,
...$this->appends,
]));
], SORT_REGULAR));
}
}
20 changes: 0 additions & 20 deletions src/Contexts/OperationTransformerContext.php

This file was deleted.

4 changes: 2 additions & 2 deletions src/Contracts/OperationTransformer.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@

namespace Dedoc\Scramble\Contracts;

use Dedoc\Scramble\Contexts\OperationTransformerContext;
use Dedoc\Scramble\Support\Generator\Operation;
use Dedoc\Scramble\Support\RouteInfo;

interface OperationTransformer
{
public function handle(Operation $operation, OperationTransformerContext $context);
public function handle(Operation $operation, RouteInfo $routeInfo);
}
3 changes: 2 additions & 1 deletion src/Extensions/OperationExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,14 @@

namespace Dedoc\Scramble\Extensions;

use Dedoc\Scramble\Contracts\OperationTransformer;
use Dedoc\Scramble\GeneratorConfig;
use Dedoc\Scramble\Infer;
use Dedoc\Scramble\Support\Generator\Operation;
use Dedoc\Scramble\Support\Generator\TypeTransformer;
use Dedoc\Scramble\Support\RouteInfo;

abstract class OperationExtension
abstract class OperationExtension implements OperationTransformer
{
public function __construct(
protected Infer $infer,
Expand Down
9 changes: 4 additions & 5 deletions src/Generator.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,9 @@

use Dedoc\Scramble\Attributes\ExcludeAllRoutesFromDocs;
use Dedoc\Scramble\Attributes\ExcludeRouteFromDocs;
use Dedoc\Scramble\Contexts\OperationTransformerContext;
use Dedoc\Scramble\Exceptions\RouteAware;
use Dedoc\Scramble\Infer\Services\FileParser;
use Dedoc\Scramble\OpenApiVisitor\SchemaEnforceVisitor;
use Dedoc\Scramble\Reflections\ReflectionRoute;
use Dedoc\Scramble\Support\Generator\Components;
use Dedoc\Scramble\Support\Generator\InfoObject;
use Dedoc\Scramble\Support\Generator\OpenApi;
Expand Down Expand Up @@ -36,6 +34,7 @@ class Generator
public function __construct(
private OperationBuilder $operationBuilder,
private ServerFactory $serverFactory,
private FileParser $fileParser,
private Infer $infer
) {}

Expand Down Expand Up @@ -203,13 +202,13 @@ private function buildTypeTransformer(OpenApiContext $context): TypeTransformer

private function routeToOperation(OpenApi $openApi, Route $route, GeneratorConfig $config, TypeTransformer $typeTransformer)
{
$reflectionRoute = new ReflectionRoute($route, $this->infer, $typeTransformer);
$routeInfo = new RouteInfo($route, $this->infer, $typeTransformer);

if (! $reflectionRoute->isControllerAction()) {
if (! $routeInfo->isClassBased()) {
return null;
}

$operation = $this->operationBuilder->build($reflectionRoute, $openApi, $config, $typeTransformer);
$operation = $this->operationBuilder->build($routeInfo, $openApi, $config, $typeTransformer);

$this->ensureSchemaTypes($route, $operation);

Expand Down
32 changes: 0 additions & 32 deletions src/OperationTransformers/ExtensionWrapperTransformer.php

This file was deleted.

122 changes: 0 additions & 122 deletions src/Reflections/ReflectionRoute.php

This file was deleted.

44 changes: 9 additions & 35 deletions src/ScrambleServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
use Dedoc\Scramble\Support\ExceptionToResponseExtensions\HttpExceptionToResponseExtension;
use Dedoc\Scramble\Support\ExceptionToResponseExtensions\NotFoundExceptionToResponseExtension;
use Dedoc\Scramble\Support\ExceptionToResponseExtensions\ValidationExceptionToResponseExtension;
use Dedoc\Scramble\Support\Generator\Operation;
use Dedoc\Scramble\Support\Generator\TypeTransformer;
use Dedoc\Scramble\Support\IndexBuilders\IndexBuilder;
use Dedoc\Scramble\Support\InferExtensions\AbortHelpersExceptionInfer;
Expand All @@ -38,14 +39,14 @@
use Dedoc\Scramble\Support\InferExtensions\ResponseMethodReturnTypeExtension;
use Dedoc\Scramble\Support\InferExtensions\TypeTraceInfer;
use Dedoc\Scramble\Support\InferExtensions\ValidatorTypeInfer;
use Dedoc\Scramble\Support\OperationBuilder;
use Dedoc\Scramble\Support\OperationExtensions\DeprecationExtension;
use Dedoc\Scramble\Support\OperationExtensions\ErrorResponsesExtension;
use Dedoc\Scramble\Support\OperationExtensions\ParameterExtractor\AttributesParametersExtractor;
use Dedoc\Scramble\Support\OperationExtensions\ParameterExtractor\MethodCallsParametersExtractor;
use Dedoc\Scramble\Support\OperationExtensions\RequestBodyExtension;
use Dedoc\Scramble\Support\OperationExtensions\RequestEssentialsExtension;
use Dedoc\Scramble\Support\OperationExtensions\ResponseExtension;
use Dedoc\Scramble\Support\RouteInfo;
use Dedoc\Scramble\Support\ServerFactory;
use Dedoc\Scramble\Support\TypeToSchemaExtensions\AnonymousResourceCollectionTypeToSchema;
use Dedoc\Scramble\Support\TypeToSchemaExtensions\CollectionToSchema;
Expand Down Expand Up @@ -139,25 +140,6 @@ public function configurePackage(Package $package): void
);
});

$this->app->when(OperationBuilder::class)
->needs('$extensionsClasses')
->give(function () {
$extensions = array_merge(config('scramble.extensions', []), Scramble::$extensions);

$operationExtensions = array_values(array_filter(
$extensions,
fn ($e) => is_a($e, OperationExtension::class, true),
));

return array_merge([
RequestEssentialsExtension::class,
RequestBodyExtension::class,
ErrorResponsesExtension::class,
ResponseExtension::class,
DeprecationExtension::class,
], $operationExtensions);
});

$this->app->when(IndexBuildingBroker::class)
->needs('$indexBuilders')
->give(function () {
Expand Down Expand Up @@ -214,12 +196,8 @@ public function configurePackage(Package $package): void
], $exceptionToResponseExtensions),
);
});
}

public function bootingPackage()
{
Scramble::configure()
->useConfig(config('scramble'))
->withOperationTransformers(function (OperationTransformers $transformers) {
$extensions = array_merge(config('scramble.extensions', []), Scramble::$extensions);

Expand All @@ -228,18 +206,14 @@ public function bootingPackage()
fn ($e) => is_a($e, OperationExtension::class, true),
));

$operationExtensions = array_merge([
RequestEssentialsExtension::class,
RequestBodyExtension::class,
ErrorResponsesExtension::class,
ResponseExtension::class,
DeprecationExtension::class,
], $operationExtensions);

$transformers->append(array_map(function ($extension) {
return new ExtensionWrapperTransformer($extension);
}, $operationExtensions));
$transformers->append($operationExtensions);
});
}

public function bootingPackage()
{
Scramble::configure()
->useConfig(config('scramble'));

$this->app->booted(function (Application $app) {
Scramble::configure()
Expand Down
38 changes: 38 additions & 0 deletions src/Support/ContainerUtils.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
<?php

namespace Dedoc\Scramble\Support;

use Dedoc\Scramble\Support\OperationExtensions\ParameterExtractor\ParameterExtractor;
use ReflectionClass;
use ReflectionNamedType;
use ReflectionParameter;

class ContainerUtils
{
/**
* @template T of object
*
* @param class-string<T> $class
* @return T
*/
public static function makeContextable(string $class, array $contextfulBindings = [])
{
$reflectionClass = new ReflectionClass($class);

$parameters = $reflectionClass->getConstructor()?->getParameters() ?? [];

$contextfulArguments = collect($parameters)
->mapWithKeys(function (ReflectionParameter $p) use ($contextfulBindings) {
$parameterClass = $p->getType() instanceof ReflectionNamedType
? $p->getType()->getName()
: null;

return $parameterClass && isset($contextfulBindings[$parameterClass]) ? [
$p->name => $contextfulBindings[$parameterClass],
] : [];
})
->all();

return app()->make($class, $contextfulArguments);
}
}
Loading

0 comments on commit 318ae2b

Please sign in to comment.