Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
"phpstan/extension-installer": "^1.3",
"phpstan/phpstan": "^1.10",
"phpstan/phpstan-beberlei-assert": "^1.1",
"thecodingmachine/phpstan-strict-rules": "^1.0"
"thecodingmachine/phpstan-strict-rules": "^1.0",
"rector/rector": "^1.0"
},
"autoload": {
"psr-4": {
Expand All @@ -41,6 +42,9 @@
"lint": [
"PHP_CS_FIXER_IGNORE_ENV=1 php-cs-fixer fix --diff --ansi --dry-run"
],
"lint:fix": [
"php-cs-fixer fix --diff --ansi --using-cache=no"
],
"phpstan": [
"php -d memory_limit=-1 vendor/bin/phpstan analyse -n --ansi --no-progress"
],
Expand All @@ -49,6 +53,7 @@
],
"qc": [
"@lint",
"@lint-fix",
"@phpstan",
"@test"
]
Expand Down
61 changes: 60 additions & 1 deletion composer.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 4 additions & 1 deletion phpunit.xml.dist
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- https://phpunit.de/manual/current/en/appendixes.configuration.html -->
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/11.1/phpunit.xsd" backupGlobals="false" colors="true" bootstrap="vendor/autoload.php" cacheDirectory=".phpunit.cache">
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/11.1/phpunit.xsd" backupGlobals="false" colors="true" bootstrap="vendor/autoload.php" cacheDirectory=".phpunit.cache"
displayDetailsOnTestsThatTriggerDeprecations="true"
displayDetailsOnTestsThatTriggerWarnings="true"
>
<coverage>
<report>
<clover outputFile="tests/_reports/logs/clover.xml"/>
Expand Down
28 changes: 28 additions & 0 deletions rector.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
<?php

declare(strict_types=1);

use Rector\Config\RectorConfig;
use Rector\Doctrine\Set\DoctrineSetList;
use Rector\Php80\Rector\Class_\AnnotationToAttributeRector;
use Rector\Php80\ValueObject\AnnotationToAttribute;
use Rector\Symfony\Set\SensiolabsSetList;
use Rector\Symfony\Set\SymfonySetList;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;

return static function (RectorConfig $rectorConfig): void {
// Paths for Rector to act upon
$rectorConfig->paths([
__DIR__ . '/src',
__DIR__ . '/tests',
]);

$rectorConfig->sets([
DoctrineSetList::ANNOTATIONS_TO_ATTRIBUTES,
SymfonySetList::ANNOTATIONS_TO_ATTRIBUTES,
SensiolabsSetList::ANNOTATIONS_TO_ATTRIBUTES,
]);
$rectorConfig->ruleWithConfiguration(AnnotationToAttributeRector::class, [
new AnnotationToAttribute(UniqueEntity::class),
]);
};
29 changes: 6 additions & 23 deletions src/Bridge/OpenApi/Model/Api.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,6 @@

class Api implements Contract\Api
{
/** @var string */
private $title;

/** @var string */
private $version;

/** @var string */
private $description;

/** @var null|string */
private $email;

/** @var Endpoint[] */
private $endpoints = [];

Expand All @@ -34,17 +22,7 @@ class Api implements Contract\Api
private $schemas = [];

/** @todo add support for security schemas */
public function __construct(
string $title,
string $version,
string $description,
?string $email = null
) {
$this->title = $title;
$this->version = $version;
$this->description = $description;
$this->email = $email;
}
public function __construct(private string $title, private string $version, private string $description, private ?string $email = null) {}

public function addEndpoint(Endpoint $endpoint): void
{
Expand Down Expand Up @@ -102,4 +80,9 @@ public function toOpenApi(): array

return $api;
}

public function getEmail(): ?string
{
return $this->email;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,31 +14,18 @@

class CreateResourceEndpoint implements Endpoint
{
/** @var ReadSchema */
private $readSchema;

/** @var CreateSchema */
private $createSchema;

/** @var string */
private $path;

/** @var Response[] */
private $responses;
private array $responses;

/**
* @param Response[] $errorResponses
*/
public function __construct(
ReadSchema $readSchema,
CreateSchema $createSchema,
string $path,
private ReadSchema $readSchema,
private CreateSchema $createSchema,
private string $path,
array $errorResponses = []
) {
$this->createSchema = $createSchema;
$this->readSchema = $readSchema;
$this->path = $path;

$this->responses = array_merge(
[
new ResourceCreatedResponse($this->readSchema),
Expand Down
26 changes: 8 additions & 18 deletions src/Bridge/OpenApi/Model/JsonApi/Endpoint/GetResourceEndpoint.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,43 +15,33 @@

class GetResourceEndpoint implements Endpoint
{
/** @var ReadSchema */
private $readSchema;

/** @var string */
private $path;

/** @var Response[] */
private $responses;
private array $responses;

/** @var ReadSchema[] */
private $includes;

/** @var null|mixed[] */
private $fields;
private array $includes;

/**
* @param ReadSchema[] $includes
* @param null|mixed[] $fields
* @param mixed[] $errorResponses
*/
public function __construct(
ReadSchema $readSchema,
string $path,
private ReadSchema $readSchema,
private string $path,
array $includes,
?array $fields,
private ?array $fields,
array $errorResponses = []
) {
Assertion::allIsInstanceOf($includes, ReadSchema::class);
$this->readSchema = $readSchema;
$this->path = $path;
$this->includes = $includes;

$this->responses = array_merge([
/** @var Response[] $mergedResponses */
$mergedResponses = array_merge([
new ResourceResponse($this->readSchema, $this->includes),
], $errorResponses);

$this->fields = $fields;
$this->responses = $mergedResponses;
}

public function getMethod(): string
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,72 +4,52 @@

namespace Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Endpoint;

use Assert\Assertion;
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Contract\Endpoint;
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Contract\Response;
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Contract\Schema;
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Response\CollectionResponse;
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Schema\Filter\Filter;
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Schema\Filter\FilterSetQueryParam;
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Schema\Query\IncludeQueryParam;
use Undabot\SymfonyJsonApi\Bridge\OpenApi\Model\JsonApi\Schema\Resource\ReadSchema;

class ResourceCollectionEndpoint implements Endpoint
{
/** @var ReadSchema */
private $schema;

/** @var string */
private $path;

/** @var Response[] */
private $responses;

/** @var mixed[] */
private $filters;

/** @var mixed[] */
private $includes;

/** @var mixed[] */
private $fields;

/** @var mixed[] */
private $sorts;

/** @var null|Schema */
private $pagination;
private array $responses;

/**
* @param mixed[] $filters
* @param mixed[] $sorts
* @param mixed[] $includes
* @param mixed[] $fields
* @param mixed[] $errorResponses
* @param Filter[] $filters
* @param array<string, ReadSchema> $includes
*/
public function __construct(
ReadSchema $schema,
string $path,
array $filters = [],
array $sorts = [],
array $includes = [],
array $fields = [],
?Schema $pagination = null,
private ReadSchema $schema,
private string $path,
private array $filters = [],
/**
* @var mixed[]
*
* @psalm-suppress UnusedProperty
*/
private array $sorts = [],
private array $includes = [],
/** @var mixed[] */
private array $fields = [],
private ?Schema $pagination = null,
array $errorResponses = []
) {
$this->schema = $schema;
$this->path = $path;
$this->includes = $includes;
Assertion::allIsInstanceOf($this->includes, ReadSchema::class);

$this->responses = array_merge(
/** @var Response[] $responses */
$responses = array_merge(
[
new CollectionResponse($this->schema, $this->includes),
],
$errorResponses
);

$this->filters = $filters;
$this->sorts = $sorts;
$this->fields = $fields;
$this->pagination = $pagination;
$this->responses = $responses;
}

public function getMethod(): string
Expand Down Expand Up @@ -101,6 +81,7 @@ public function getParams(): array
}

if (false === empty($this->filters)) {
Assertion::allIsInstanceOf($this->filters, Filter::class);
$filterSet = new FilterSetQueryParam('filter', $this->filters);
$queryParams[] = $filterSet->toOpenApi();
}
Expand All @@ -116,7 +97,6 @@ public function toOpenApi(): array
{
$responses = [];

/** @var Response $response */
foreach ($this->responses as $response) {
$responses[$response->getStatusCode()] = $response->toOpenApi();
}
Expand All @@ -130,4 +110,9 @@ public function toOpenApi(): array
'responses' => $responses,
];
}

public function getSorts(): array
{
return $this->sorts;
}
}
Loading