Skip to content

Commit

Permalink
Merge "REST: Use term type specific path param validators"
Browse files Browse the repository at this point in the history
  • Loading branch information
jenkins-bot authored and Gerrit Code Review committed Jun 19, 2024
2 parents 88df297 + 310b2d1 commit 9a4e5e4
Show file tree
Hide file tree
Showing 28 changed files with 166 additions and 52 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php declare( strict_types=1 );

namespace Wikibase\Repo\RestApi\Application\UseCaseRequestValidation;

/**
* @license GPL-2.0-or-later
*/
interface AliasLanguageCodeRequest extends LanguageCodeRequest {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php declare( strict_types=1 );

namespace Wikibase\Repo\RestApi\Application\UseCaseRequestValidation;

/**
* @license GPL-2.0-or-later
*/
interface DescriptionLanguageCodeRequest extends LanguageCodeRequest {
}
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,17 @@ public function getPropertyIdFilter(): ?PropertyId {
}

public function getLanguageCode(): string {
return $this->getRequestField( LanguageCodeRequest::class );
if ( array_key_exists( LabelLanguageCodeRequest::class, $this->deserializedRequest ) xor
( array_key_exists( DescriptionLanguageCodeRequest::class, $this->deserializedRequest ) xor
array_key_exists( AliasLanguageCodeRequest::class, $this->deserializedRequest ) ) ) {
return $this->deserializedRequest[LabelLanguageCodeRequest::class]
?? $this->deserializedRequest[DescriptionLanguageCodeRequest::class]
?? $this->deserializedRequest[AliasLanguageCodeRequest::class];
}

throw new LogicException(
'The request must be exactly one of: LabelLanguageCodeRequest, DescriptionLanguageCodeRequest, AliasLanguageCodeRequest'
);
}

public function getItemFields(): array {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
/**
* @license GPL-2.0-or-later
*/
interface ItemAliasesInLanguageEditRequest extends ItemIdRequest, LanguageCodeRequest {
interface ItemAliasesInLanguageEditRequest extends ItemIdRequest, AliasLanguageCodeRequest {
public function getAliasesInLanguage(): array;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
/**
* @license GPL-2.0-or-later
*/
interface ItemDescriptionEditRequest extends ItemIdRequest, LanguageCodeRequest {
interface ItemDescriptionEditRequest extends ItemIdRequest, DescriptionLanguageCodeRequest {
public function getDescription(): string;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
/**
* @license GPL-2.0-or-later
*/
interface ItemLabelEditRequest extends ItemIdRequest, LanguageCodeRequest {
interface ItemLabelEditRequest extends ItemIdRequest, LabelLanguageCodeRequest {
public function getLabel(): string;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php declare( strict_types=1 );

namespace Wikibase\Repo\RestApi\Application\UseCaseRequestValidation;

/**
* @license GPL-2.0-or-later
*/
interface LabelLanguageCodeRequest extends LanguageCodeRequest {
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
/**
* @license GPL-2.0-or-later
*/
interface PropertyAliasesInLanguageEditRequest extends PropertyIdRequest, LanguageCodeRequest {
interface PropertyAliasesInLanguageEditRequest extends PropertyIdRequest, AliasLanguageCodeRequest {
public function getAliasesInLanguage(): array;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
/**
* @license GPL-2.0-or-later
*/
interface PropertyDescriptionEditRequest extends PropertyIdRequest, LanguageCodeRequest {
interface PropertyDescriptionEditRequest extends PropertyIdRequest, DescriptionLanguageCodeRequest {
public function getDescription(): string;
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
/**
* @license GPL-2.0-or-later
*/
interface PropertyLabelEditRequest extends PropertyIdRequest, LanguageCodeRequest {
interface PropertyLabelEditRequest extends PropertyIdRequest, LabelLanguageCodeRequest {
public function getLabel(): string;
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

namespace Wikibase\Repo\RestApi\Application\UseCases\GetItemAliasesInLanguage;

use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\AliasLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\ItemIdRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\UseCaseRequest;

/**
* @license GPL-2.0-or-later
*/
class GetItemAliasesInLanguageRequest implements UseCaseRequest, ItemIdRequest, LanguageCodeRequest {
class GetItemAliasesInLanguageRequest implements UseCaseRequest, ItemIdRequest, AliasLanguageCodeRequest {

private string $itemId;
private string $languageCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

namespace Wikibase\Repo\RestApi\Application\UseCases\GetItemDescription;

use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\DescriptionLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\ItemIdRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\UseCaseRequest;

/**
* @license GPL-2.0-or-later
*/
class GetItemDescriptionRequest implements UseCaseRequest, ItemIdRequest, LanguageCodeRequest {
class GetItemDescriptionRequest implements UseCaseRequest, ItemIdRequest, DescriptionLanguageCodeRequest {

private string $itemId;
private string $languageCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,13 @@
namespace Wikibase\Repo\RestApi\Application\UseCases\GetItemLabel;

use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\ItemIdRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LabelLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\UseCaseRequest;

/**
* @license GPL-2.0-or-later
*/
class GetItemLabelRequest implements UseCaseRequest, ItemIdRequest, LanguageCodeRequest {
class GetItemLabelRequest implements UseCaseRequest, ItemIdRequest, LabelLanguageCodeRequest {

private string $itemId;
private string $languageCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

namespace Wikibase\Repo\RestApi\Application\UseCases\GetPropertyAliasesInLanguage;

use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\AliasLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\PropertyIdRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\UseCaseRequest;

/**
* @license GPL-2.0-or-later
*/
class GetPropertyAliasesInLanguageRequest implements UseCaseRequest, PropertyIdRequest, LanguageCodeRequest {
class GetPropertyAliasesInLanguageRequest implements UseCaseRequest, PropertyIdRequest, AliasLanguageCodeRequest {

private string $propertyId;
private string $languageCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

namespace Wikibase\Repo\RestApi\Application\UseCases\GetPropertyDescription;

use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\DescriptionLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\PropertyIdRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\UseCaseRequest;

/**
* @license GPL-2.0-or-later
*/
class GetPropertyDescriptionRequest implements UseCaseRequest, PropertyIdRequest, LanguageCodeRequest {
class GetPropertyDescriptionRequest implements UseCaseRequest, PropertyIdRequest, DescriptionLanguageCodeRequest {

private string $propertyId;
private string $languageCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@

namespace Wikibase\Repo\RestApi\Application\UseCases\GetPropertyLabel;

use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LabelLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\PropertyIdRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\UseCaseRequest;

/**
* @license GPL-2.0-or-later
*/
class GetPropertyLabelRequest implements UseCaseRequest, PropertyIdRequest, LanguageCodeRequest {
class GetPropertyLabelRequest implements UseCaseRequest, PropertyIdRequest, LabelLanguageCodeRequest {

private string $propertyId;
private string $languageCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

namespace Wikibase\Repo\RestApi\Application\UseCases\RemoveItemDescription;

use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\DescriptionLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\EditMetadataRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\ItemIdRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\UseCaseRequest;

/**
* @license GPL-2.0-or-later
*/
class RemoveItemDescriptionRequest implements UseCaseRequest, ItemIdRequest, LanguageCodeRequest, EditMetadataRequest {
class RemoveItemDescriptionRequest implements UseCaseRequest, ItemIdRequest, DescriptionLanguageCodeRequest, EditMetadataRequest {

private string $itemId;
private string $languageCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@

use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\EditMetadataRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\ItemIdRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LabelLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\UseCaseRequest;

/**
* @license GPL-2.0-or-later
*/
class RemoveItemLabelRequest implements UseCaseRequest, ItemIdRequest, LanguageCodeRequest, EditMetadataRequest {
class RemoveItemLabelRequest implements UseCaseRequest, ItemIdRequest, LabelLanguageCodeRequest, EditMetadataRequest {

private string $itemId;
private string $languageCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,15 @@

namespace Wikibase\Repo\RestApi\Application\UseCases\RemovePropertyDescription;

use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\DescriptionLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\EditMetadataRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\PropertyIdRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\UseCaseRequest;

/**
* @license GPL-2.0-or-later
*/
class RemovePropertyDescriptionRequest implements UseCaseRequest, PropertyIdRequest, LanguageCodeRequest, EditMetadataRequest {
class RemovePropertyDescriptionRequest implements UseCaseRequest, PropertyIdRequest, DescriptionLanguageCodeRequest, EditMetadataRequest {

private string $propertyId;
private string $languageCode;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
namespace Wikibase\Repo\RestApi\Application\UseCases\RemovePropertyLabel;

use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\EditMetadataRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LabelLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\PropertyIdRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\UseCaseRequest;

/**
* @license GPL-2.0-or-later
*/
class RemovePropertyLabelRequest implements UseCaseRequest, PropertyIdRequest, LanguageCodeRequest, EditMetadataRequest {
class RemovePropertyLabelRequest implements UseCaseRequest, PropertyIdRequest, LabelLanguageCodeRequest, EditMetadataRequest {

private string $propertyId;
private string $languageCode;
Expand Down
13 changes: 10 additions & 3 deletions repo/rest-api/src/Infrastructure/ValidatingRequestDeserializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
namespace Wikibase\Repo\RestApi\Infrastructure;

use Psr\Container\ContainerInterface;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\AliasLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\DescriptionLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\DeserializedRequestAdapter;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\EditMetadataRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\ItemAliasesInLanguageEditRequest;
Expand All @@ -12,7 +14,7 @@
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\ItemLabelEditRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\ItemSerializationRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\ItemStatementIdRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\LabelLanguageCodeRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\PatchRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\PropertyAliasesInLanguageEditRequest;
use Wikibase\Repo\RestApi\Application\UseCaseRequestValidation\PropertyDescriptionEditRequest;
Expand Down Expand Up @@ -146,7 +148,10 @@ class ValidatingRequestDeserializer implements
public const PROPERTY_ID_REQUEST_VALIDATING_DESERIALIZER = self::PREFIX . 'PropertyIdRequestValidatingDeserializer';
public const STATEMENT_ID_REQUEST_VALIDATING_DESERIALIZER = self::PREFIX . 'StatementIdRequestValidatingDeserializer';
public const PROPERTY_ID_FILTER_REQUEST_VALIDATING_DESERIALIZER = self::PREFIX . 'PropertyIdFilterRequestValidatingDeserializer';
public const LANGUAGE_CODE_REQUEST_VALIDATING_DESERIALIZER = self::PREFIX . 'LanguageCodeRequestValidatingDeserializer';
public const LABEL_LANGUAGE_CODE_REQUEST_VALIDATING_DESERIALIZER = self::PREFIX . 'LabelLanguageCodeRequestValidatingDeserializer';
public const DESCRIPTION_LANGUAGE_CODE_REQUEST_VALIDATING_DESERIALIZER =
self::PREFIX . 'DescriptionLanguageCodeRequestValidatingDeserializer';
public const ALIAS_LANGUAGE_CODE_REQUEST_VALIDATING_DESERIALIZER = self::PREFIX . 'AliasLanguageCodeRequestValidatingDeserializer';
public const SITE_ID_REQUEST_VALIDATING_DESERIALIZER = self::PREFIX . 'SiteIdRequestValidatingDeserializer';
public const ITEM_FIELDS_REQUEST_VALIDATING_DESERIALIZER = self::PREFIX . 'ItemFieldsRequestValidatingDeserializer';
public const PROPERTY_FIELDS_REQUEST_VALIDATING_DESERIALIZER = self::PREFIX . 'PropertyFieldsRequestValidatingDeserializer';
Expand Down Expand Up @@ -195,7 +200,9 @@ public function validateAndDeserialize( UseCaseRequest $request ): DeserializedR
SiteIdRequest::class => self::SITE_ID_REQUEST_VALIDATING_DESERIALIZER,
StatementIdRequest::class => self::STATEMENT_ID_REQUEST_VALIDATING_DESERIALIZER,
PropertyIdFilterRequest::class => self::PROPERTY_ID_FILTER_REQUEST_VALIDATING_DESERIALIZER,
LanguageCodeRequest::class => self::LANGUAGE_CODE_REQUEST_VALIDATING_DESERIALIZER,
LabelLanguageCodeRequest::class => self::LABEL_LANGUAGE_CODE_REQUEST_VALIDATING_DESERIALIZER,
DescriptionLanguageCodeRequest::class => self::DESCRIPTION_LANGUAGE_CODE_REQUEST_VALIDATING_DESERIALIZER,
AliasLanguageCodeRequest::class => self::ALIAS_LANGUAGE_CODE_REQUEST_VALIDATING_DESERIALIZER,
ItemFieldsRequest::class => self::ITEM_FIELDS_REQUEST_VALIDATING_DESERIALIZER,
PropertyFieldsRequest::class => self::PROPERTY_FIELDS_REQUEST_VALIDATING_DESERIALIZER,
StatementSerializationRequest::class => self::STATEMENT_SERIALIZATION_REQUEST_VALIDATING_DESERIALIZER,
Expand Down
14 changes: 10 additions & 4 deletions repo/rest-api/src/WbRestApi.ServiceWiring.php
Original file line number Diff line number Diff line change
Expand Up @@ -230,11 +230,17 @@ function ( MediaWikiServices $services ): SiteIdRequestValidatingDeserializer {
);
},

VRD::LANGUAGE_CODE_REQUEST_VALIDATING_DESERIALIZER =>
VRD::LABEL_LANGUAGE_CODE_REQUEST_VALIDATING_DESERIALIZER =>
function ( MediaWikiServices $services ): LanguageCodeRequestValidatingDeserializer {
return new LanguageCodeRequestValidatingDeserializer(
WbRestApi::getLabelLanguageCodeValidator( $services ) // TODO this will be fixed in a follow-up.
);
return new LanguageCodeRequestValidatingDeserializer( WbRestApi::getLabelLanguageCodeValidator( $services ) );
},
VRD::DESCRIPTION_LANGUAGE_CODE_REQUEST_VALIDATING_DESERIALIZER =>
function ( MediaWikiServices $services ): LanguageCodeRequestValidatingDeserializer {
return new LanguageCodeRequestValidatingDeserializer( WbRestApi::getDescriptionLanguageCodeValidator( $services ) );
},
VRD::ALIAS_LANGUAGE_CODE_REQUEST_VALIDATING_DESERIALIZER =>
function ( MediaWikiServices $services ): LanguageCodeRequestValidatingDeserializer {
return new LanguageCodeRequestValidatingDeserializer( WbRestApi::getAliasLanguageCodeValidator( $services ) );
},

VRD::ITEM_FIELDS_REQUEST_VALIDATING_DESERIALIZER => function (): MappedRequestValidatingDeserializer {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,15 @@ describe( newRequest().getRouteDescription(), () => {
);
assert.strictEqual( editMetadata.user, user.username );
} );

it( 'can add a "mul" alias', async () => {
const response = await newRequest( testItemId, 'mul', [ 'mul alias' ] )
.withHeader( 'X-Wikibase-Ci-Enable-Mul', 'true' )
.assertValidRequest()
.makeRequest();

assertValid201Response( response, [ 'mul alias' ] );
} );
} );

describe( '400 error response', () => {
Expand Down
13 changes: 7 additions & 6 deletions repo/rest-api/tests/mocha/api-testing/SetItemDescriptionTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -166,13 +166,14 @@ describe( newSetItemDescriptionRequestBuilder().getRouteDescription(), () => {
assert.include( response.body.message, invalidItemId );
} );

it( 'invalid language code', async () => {
const invalidLanguage = 'xyz';
const response = await newSetItemDescriptionRequestBuilder( testItemId, invalidLanguage, 'description' )
.assertValidRequest().makeRequest();
[ 'xyz', 'mul' ].forEach( ( invalidLanguage ) => {
it( `invalid language code: "${invalidLanguage}"`, async () => {
const response = await newSetItemDescriptionRequestBuilder( testItemId, invalidLanguage, 'description' )
.withHeader( 'X-Wikibase-Ci-Enable-Mul', 'true' ).assertValidRequest().makeRequest();

assertValidError( response, 400, 'invalid-language-code' );
assert.include( response.body.message, invalidLanguage );
assertValidError( response, 400, 'invalid-language-code' );
assert.include( response.body.message, invalidLanguage );
} );
} );

it( 'invalid description', async () => {
Expand Down
11 changes: 11 additions & 0 deletions repo/rest-api/tests/mocha/api-testing/SetItemLabelTest.js
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,17 @@ describe( newSetItemLabelRequestBuilder().getRouteDescription(), () => {
);
assert.strictEqual( editMetadata.user, user.username );
} );

it( 'can add a "mul" label', async () => {
const languageCode = 'mul';
const newLabel = `new mul label ${utils.uniq()}`;
const response = await newSetItemLabelRequestBuilder( testItemId, languageCode, newLabel )
.withHeader( 'X-Wikibase-Ci-Enable-Mul', 'true' )
.assertValidRequest()
.makeRequest();

assertValid201Response( response, newLabel );
} );
} );

it( 'idempotency check: can set the same label twice', async () => {
Expand Down
Loading

0 comments on commit 9a4e5e4

Please sign in to comment.