1010use APP \plugins \generic \dataverse \classes \entities \Dataset ;
1111use APP \plugins \generic \dataverse \classes \components \forms \DatasetMetadataForm ;
1212use APP \plugins \generic \dataverse \classes \services \DataStatementService ;
13+ use APP \plugins \generic \dataverse \dataverseAPI \DataverseClient ;
14+ use PKP \validation \ValidatorFactory ;
1315
1416class DatasetMetadataDispatcher extends DataverseDispatcher
1517{
@@ -43,6 +45,17 @@ public function addToEditorsStep(string $hookName, array $params)
4345 $ dataset = new Dataset ();
4446 $ dataset ->setData ('subject ' , $ submission ->getData ('datasetSubject ' ));
4547 $ dataset ->setData ('license ' , $ submission ->getData ('datasetLicense ' ));
48+
49+ try {
50+ $ flattenedFields = $ this ->getFlattenedRequiredMetadataFields ();
51+ foreach ($ flattenedFields as $ field ) {
52+ $ metadataName = 'dataset ' . ucfirst ($ field ['name ' ]);
53+ $ dataset ->setData ($ field ['name ' ], $ submission ->getData ($ metadataName ));
54+ }
55+ } catch (DataverseException $ e ) {
56+ error_log ('Error getting metadata fields from submission: ' . $ e ->getMessage ());
57+ }
58+
4659 $ datasetMetadataForm = new DatasetMetadataForm ($ submissionApiUrl , 'POST ' , $ dataset , 'submission ' );
4760
4861 $ steps = $ templateMgr ->getState ('steps ' );
@@ -70,6 +83,13 @@ public function addToReviewStep(string $hookName, array $params): bool
7083 $ templateMgr = $ params [1 ];
7184 $ output = &$ params [2 ];
7285
86+ try {
87+ $ flattenedFields = $ this ->getFlattenedRequiredMetadataFields ();
88+ $ templateMgr ->assign ('requiredMetadataFields ' , $ flattenedFields );
89+ } catch (DataverseException $ e ) {
90+ error_log ('Error getting required metadata fields: ' . $ e ->getMessage ());
91+ }
92+
7393 if ($ step === 'editors ' ) {
7494 $ output .= $ templateMgr ->fetch ($ this ->plugin ->getTemplateResource ('review/datasetMetadata.tpl ' ));
7595 }
@@ -86,14 +106,84 @@ public function validateSubmissionFields(string $hookName, array $params)
86106 $ dataStatementTypes = $ publication ->getData ('dataStatementTypes ' );
87107
88108 if (
89- ! empty ($ dataStatementTypes )
90- && in_array (DataStatementService::DATA_STATEMENT_TYPE_DATAVERSE_SUBMITTED , $ dataStatementTypes )
109+ empty ($ dataStatementTypes )
110+ || ! in_array (DataStatementService::DATA_STATEMENT_TYPE_DATAVERSE_SUBMITTED , $ dataStatementTypes )
91111 ) {
92- if (!$ submission ->getData ('datasetSubject ' )) {
93- $ errors ['datasetSubject ' ] = [__ ('plugins.generic.dataverse.error.datasetSubject.required ' )];
112+ return false ;
113+ }
114+
115+ if (!$ submission ->getData ('datasetSubject ' )) {
116+ $ errors ['datasetSubject ' ] = [__ ('plugins.generic.dataverse.error.datasetSubject.required ' )];
117+ }
118+
119+ try {
120+ $ flattenedFields = $ this ->getFlattenedRequiredMetadataFields ();
121+ foreach ($ flattenedFields as $ field ) {
122+ $ metadataName = 'dataset ' . ucfirst ($ field ['name ' ]);
123+ $ value = $ submission ->getData ($ metadataName );
124+
125+ if (empty ($ value )) {
126+ $ errors [$ metadataName ] = [__ ('validator.required ' )];
127+ continue ;
128+ }
129+
130+ $ this ->validateFieldByType ($ field , $ metadataName , $ value , $ errors );
94131 }
132+ } catch (DataverseException $ e ) {
133+ error_log ('Error getting required metadata fields: ' . $ e ->getMessage ());
95134 }
96135
97136 return false ;
98137 }
138+
139+ private function validateFieldByType (array $ field , string $ metadataName , $ value , array &$ errors ): void
140+ {
141+ $ validationRules = $ this ->getValidationRules ($ field ['type ' ]);
142+
143+ if (empty ($ validationRules )) {
144+ return ;
145+ }
146+
147+ $ validator = ValidatorFactory::make (
148+ ['value ' => $ value ],
149+ ['value ' => $ validationRules ['rules ' ]]
150+ );
151+
152+ if (!$ validator ->passes ()) {
153+ $ errors [$ metadataName ] = $ validationRules ['useValidatorMessages ' ]
154+ ? $ validator ->errors ()->getMessages ()['value ' ]
155+ : [__ ($ validationRules ['errorKey ' ])];
156+ }
157+ }
158+
159+ private function getValidationRules (string $ type ): array
160+ {
161+ $ rules = [
162+ 'DATE ' => [
163+ 'rules ' => ['required ' , 'date ' , 'date_format:Y-m-d ' ],
164+ 'useValidatorMessages ' => true ,
165+ ],
166+ 'URL ' => [
167+ 'rules ' => ['required ' , 'url ' ],
168+ 'errorKey ' => 'validator.url ' ,
169+ 'useValidatorMessages ' => false ,
170+ ],
171+ 'EMAIL ' => [
172+ 'rules ' => ['required ' , 'email_or_localhost ' ],
173+ 'errorKey ' => 'validator.email ' ,
174+ 'useValidatorMessages ' => false ,
175+ ],
176+ ];
177+
178+ return $ rules [$ type ] ?? [];
179+ }
180+
181+ private function getFlattenedRequiredMetadataFields (): array
182+ {
183+ $ dataverseClient = new DataverseClient ();
184+ $ dataverseCollectionActions = $ dataverseClient ->getDataverseCollectionActions ();
185+ $ requiredMetadata = $ dataverseCollectionActions ->getRequiredMetadata ();
186+
187+ return $ dataverseCollectionActions ->getFlattenedFields ($ requiredMetadata );
188+ }
99189}
0 commit comments