diff --git a/src/Http/Command.php b/src/Http/Command.php index 849c269..c4451b8 100644 --- a/src/Http/Command.php +++ b/src/Http/Command.php @@ -20,7 +20,7 @@ public function __construct( /** @var Representation|Collection|array|null */ private readonly Representation|Collection|array|null $payload = null, private readonly ?Criteria $criteria = null, - private readonly ?ContentType $contentType = null, + private readonly ContentType $contentType = ContentType::JSON, ) {} public function getMethod(): Method @@ -28,19 +28,6 @@ public function getMethod(): Method return $this->method; } - public function getContentType(): ContentType - { - if ($this->contentType !== null) { - return $this->contentType; - } - - if (is_array($this->payload)) { - return ContentType::FORM_DATA; - } - - return ContentType::JSON; - } - public function getPath(): string { $placeholders = array_map( @@ -75,4 +62,9 @@ public function getQuery(): string return '?' . http_build_query($this->criteria->jsonSerialize()); } + + public function getContentType(): ContentType + { + return $this->contentType; + } } diff --git a/src/Http/CommandExecutor.php b/src/Http/CommandExecutor.php index b5c9b7a..dfc5b4f 100644 --- a/src/Http/CommandExecutor.php +++ b/src/Http/CommandExecutor.php @@ -20,23 +20,10 @@ public function __construct( public function executeCommand(Command $command): void { - $contentType = $command->getContentType(); - $payload = $command->getPayload(); - - $options = [ - 'headers' => [ - 'Content-Type' => $contentType->value, - ], - ]; - - switch ($contentType) { - case ContentType::JSON: - $options['body'] = $this->serializer->serialize($payload); - break; - case ContentType::FORM_DATA: - $options['form_params'] = $payload; - break; - } + $options = match ($command->getContentType()) { + ContentType::JSON => ['json' => $this->serializer->serialize($command->getPayload())], + ContentType::FORM_PARAMS => ['form_params' => $command->getPayload()], + }; $this->client->request( $command->getMethod()->value, diff --git a/src/Http/ContentType.php b/src/Http/ContentType.php index 0564133..fdb83e1 100644 --- a/src/Http/ContentType.php +++ b/src/Http/ContentType.php @@ -10,5 +10,5 @@ enum ContentType: string { case JSON = 'application/json'; - case FORM_DATA = 'application/x-www-form-urlencoded'; + case FORM_PARAMS = 'application/x-www-form-urlencoded'; } diff --git a/src/Resource/Organizations.php b/src/Resource/Organizations.php index 42519f8..03d3247 100644 --- a/src/Resource/Organizations.php +++ b/src/Resource/Organizations.php @@ -6,6 +6,7 @@ use Fschmtt\Keycloak\Collection\OrganizationCollection; use Fschmtt\Keycloak\Http\Command; +use Fschmtt\Keycloak\Http\ContentType; use Fschmtt\Keycloak\Http\Criteria; use Fschmtt\Keycloak\Http\Method; use Fschmtt\Keycloak\Http\Query; @@ -71,6 +72,7 @@ public function inviteUser(string $realm, string $id, string $email, string $fir 'firstName' => $firstName, 'lastName' => $lastName, ], + contentType: ContentType::FORM_PARAMS, ), ); } diff --git a/src/Resource/Users.php b/src/Resource/Users.php index 57496fb..bd278ac 100644 --- a/src/Resource/Users.php +++ b/src/Resource/Users.php @@ -220,7 +220,6 @@ public function executeActionsEmail(string $realm, string $userId, ?array $actio ], $actions, $criteria, - ContentType::JSON, ), ); } diff --git a/tests/Unit/Http/CommandExecutorTest.php b/tests/Unit/Http/CommandExecutorTest.php index 883ac9a..a8b274d 100644 --- a/tests/Unit/Http/CommandExecutorTest.php +++ b/tests/Unit/Http/CommandExecutorTest.php @@ -7,6 +7,7 @@ use Fschmtt\Keycloak\Http\Client; use Fschmtt\Keycloak\Http\Command; use Fschmtt\Keycloak\Http\CommandExecutor; +use Fschmtt\Keycloak\Http\ContentType; use Fschmtt\Keycloak\Http\Method; use Fschmtt\Keycloak\Json\JsonEncoder; use Fschmtt\Keycloak\Serializer\Serializer; @@ -27,10 +28,7 @@ public function testCallsClientWithoutBodyIfCommandHasNoRepresentation(): void Method::DELETE->value, '/path/to/resource', [ - 'body' => null, - 'headers' => [ - 'Content-Type' => 'application/json', - ], + 'json' => null, ], ); @@ -43,7 +41,7 @@ public function testCallsClientWithoutBodyIfCommandHasNoRepresentation(): void ); } - public function testCallsClientWithBodyIfCommandHasRepresentation(): void + public function testCallsClientWithJsonIfCommandHasRepresentation(): void { $command = new Command( '/path/to/resource', @@ -61,10 +59,7 @@ public function testCallsClientWithBodyIfCommandHasRepresentation(): void Method::PUT->value, '/path/to/resource', [ - 'body' => (new JsonEncoder())->encode($payload->jsonSerialize()), - 'headers' => [ - 'Content-Type' => 'application/json', - ], + 'json' => (new JsonEncoder())->encode($payload->jsonSerialize()), ], ); @@ -90,10 +85,7 @@ public function testCallsClientWithBodyIfCommandHasCollection(): void Method::PUT->value, '/path/to/resource', [ - 'body' => (new JsonEncoder())->encode([$representation->jsonSerialize()]), - 'headers' => [ - 'Content-Type' => 'application/json', - ], + 'json' => (new JsonEncoder())->encode([$representation->jsonSerialize()]), ], ); @@ -101,13 +93,14 @@ public function testCallsClientWithBodyIfCommandHasCollection(): void $executor->executeCommand($command); } - public function testCallsClientWithFormParamsIfCommandHasArrayPayload(): void + public function testCallsClientWithFormParamsIfCommandFormParamContentType(): void { $command = new Command( '/path/to/resource', Method::PUT, [], $payload = ['UPDATE_PASSWORD', 'VERIFY_EMAIL'], + contentType: ContentType::FORM_PARAMS, ); $client = $this->createMock(Client::class); @@ -118,9 +111,6 @@ public function testCallsClientWithFormParamsIfCommandHasArrayPayload(): void '/path/to/resource', [ 'form_params' => $payload, - 'headers' => [ - 'Content-Type' => 'application/x-www-form-urlencoded', - ], ], ); diff --git a/tests/Unit/Resource/OrganizationsTest.php b/tests/Unit/Resource/OrganizationsTest.php index 82a53a2..4d18ac8 100644 --- a/tests/Unit/Resource/OrganizationsTest.php +++ b/tests/Unit/Resource/OrganizationsTest.php @@ -7,6 +7,7 @@ use Fschmtt\Keycloak\Collection\OrganizationCollection; use Fschmtt\Keycloak\Http\Command; use Fschmtt\Keycloak\Http\CommandExecutor; +use Fschmtt\Keycloak\Http\ContentType; use Fschmtt\Keycloak\Http\Method; use Fschmtt\Keycloak\Http\Query; use Fschmtt\Keycloak\Http\QueryExecutor; @@ -148,6 +149,7 @@ public function testInviteUser(): void 'firstName' => 'first name', 'lastName' => 'last name', ], + contentType: ContentType::FORM_PARAMS, ); $commandExecutor = $this->createMock(CommandExecutor::class); diff --git a/tests/Unit/Resource/UsersTest.php b/tests/Unit/Resource/UsersTest.php index 7834d01..a5f396f 100644 --- a/tests/Unit/Resource/UsersTest.php +++ b/tests/Unit/Resource/UsersTest.php @@ -411,7 +411,6 @@ public function testExecuteActionsEmail(): void 'realm' => 'test-realm', 'userId' => 'test-user-id', ], - contentType: ContentType::JSON, ); $commandExecutor = $this->createMock(CommandExecutor::class);