33namespace Wikibase \Repo \RestApi \UseCases \AddItemStatement ;
44
55use Wikibase \DataModel \Statement \Statement ;
6+ use Wikibase \Repo \RestApi \UseCases \ErrorResponse ;
7+ use Wikibase \Repo \RestApi \UseCases \UseCaseException ;
68use Wikibase \Repo \RestApi \Validation \EditMetadataValidator ;
79use Wikibase \Repo \RestApi \Validation \ItemIdValidator ;
810use Wikibase \Repo \RestApi \Validation \StatementValidator ;
9- use Wikibase \Repo \RestApi \Validation \ValidationError ;
1011
1112/**
1213 * @license GPL-2.0-or-later
@@ -27,15 +28,96 @@ public function __construct(
2728 $ this ->editMetadataValidator = $ editMetadataValidator ;
2829 }
2930
30- public function validate ( AddItemStatementRequest $ request ): ?ValidationError {
31- return $ this ->itemIdValidator ->validate ( $ request ->getItemId () ) ?:
32- $ this ->statementValidator ->validate ( $ request ->getStatement () ) ?:
33- $ this ->editMetadataValidator ->validateComment ( $ request ->getComment () ) ?:
34- $ this ->editMetadataValidator ->validateEditTags ( $ request ->getEditTags () );
31+ /**
32+ * @throws UseCaseException
33+ */
34+ public function assertValidRequest ( AddItemStatementRequest $ request ): void {
35+ $ this ->validateItemId ( $ request ->getItemId () );
36+ $ this ->validateStatement ( $ request ->getStatement () );
37+ $ this ->validateEditTags ( $ request ->getEditTags () );
38+ $ this ->validateComment ( $ request ->getComment () );
3539 }
3640
3741 public function getValidatedStatement (): ?Statement {
3842 return $ this ->statementValidator ->getValidatedStatement ();
3943 }
4044
45+ /**
46+ * @throws UseCaseException
47+ */
48+ private function validateItemId ( ?string $ itemId ): void {
49+ if ( !isset ( $ itemId ) ) {
50+ return ;
51+ }
52+
53+ $ validationError = $ this ->itemIdValidator ->validate ( $ itemId );
54+
55+ if ( $ validationError ) {
56+ throw new UseCaseException (
57+ ErrorResponse::INVALID_ITEM_ID ,
58+ 'Not a valid item ID: ' . $ validationError ->getContext ()[ItemIdValidator::CONTEXT_VALUE ]
59+ );
60+ }
61+ }
62+
63+ /**
64+ * @throws UseCaseException
65+ */
66+ private function validateStatement ( array $ statement ): void {
67+ $ validationError = $ this ->statementValidator ->validate ( $ statement );
68+
69+ if ( $ validationError ) {
70+ switch ( $ validationError ->getCode () ) {
71+ case StatementValidator::CODE_INVALID_FIELD :
72+ throw new UseCaseException (
73+ ErrorResponse::STATEMENT_DATA_INVALID_FIELD ,
74+ "Invalid input for ' {$ validationError ->getContext ()[StatementValidator::CONTEXT_FIELD_NAME ]}' " ,
75+ [
76+ 'path ' => $ validationError ->getContext ()[StatementValidator::CONTEXT_FIELD_NAME ],
77+ 'value ' => $ validationError ->getContext ()[StatementValidator::CONTEXT_FIELD_VALUE ],
78+ ]
79+ );
80+ case StatementValidator::CODE_MISSING_FIELD :
81+ throw new UseCaseException (
82+ ErrorResponse::STATEMENT_DATA_MISSING_FIELD ,
83+ 'Mandatory field missing in the statement data: ' .
84+ $ validationError ->getContext ()[StatementValidator::CONTEXT_FIELD_NAME ],
85+ [ 'path ' => $ validationError ->getContext ()[StatementValidator::CONTEXT_FIELD_NAME ] ]
86+ );
87+ }
88+ }
89+ }
90+
91+ /**
92+ * @throws UseCaseException
93+ */
94+ private function validateEditTags ( array $ editTags ): void {
95+ $ validationError = $ this ->editMetadataValidator ->validateEditTags ( $ editTags );
96+
97+ if ( $ validationError ) {
98+ throw new UseCaseException (
99+ ErrorResponse::INVALID_EDIT_TAG ,
100+ "Invalid MediaWiki tag: {$ validationError ->getContext ()[EditMetadataValidator::CONTEXT_TAG_VALUE ]}"
101+ );
102+ }
103+ }
104+
105+ /**
106+ * @throws UseCaseException
107+ */
108+ private function validateComment ( ?string $ comment ): void {
109+ if ( !isset ( $ comment ) ) {
110+ return ;
111+ }
112+
113+ $ validationError = $ this ->editMetadataValidator ->validateComment ( $ comment );
114+
115+ if ( $ validationError ) {
116+ $ commentMaxLength = $ validationError ->getContext ()[EditMetadataValidator::CONTEXT_COMMENT_MAX_LENGTH ];
117+ throw new UseCaseException (
118+ ErrorResponse::COMMENT_TOO_LONG ,
119+ "Comment must not be longer than $ commentMaxLength characters. " ,
120+ );
121+ }
122+ }
41123}
0 commit comments