Skip to content

Commit 69449c5

Browse files
authored
pkp#11024 Update API to include count of copyedit files uploaded in editorial activity (pkp#11046)
1 parent bed5f4e commit 69449c5

File tree

2 files changed

+77
-24
lines changed

2 files changed

+77
-24
lines changed

classes/submission/maps/Schema.php

+71-22
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
use PKP\API\v1\reviewers\suggestions\resources\ReviewerSuggestionResource;
3535
use PKP\submission\reviewRound\ReviewRound;
3636
use PKP\submission\reviewRound\ReviewRoundDAO;
37+
use PKP\submissionFile\SubmissionFile;
3738
use PKP\user\User;
3839
use PKP\userGroup\relationships\UserGroupStage;
3940
use PKP\userGroup\relationships\UserUserGroup;
@@ -65,10 +66,12 @@ class Schema extends \PKP\core\maps\Schema
6566

6667
/** @var Enumerable Decisions associated with submissions. */
6768
public Enumerable $decisions;
68-
69+
6970
/** @var Enumerable Reviewer Suggestions associated with submissions. */
7071
public Enumerable $reviewerSuggestions;
7172

73+
/** Workflow stage files associated with submissions. */
74+
public Enumerable $submissionStageFiles;
7275
/**
7376
* Get extra property names used in the submissions list
7477
*
@@ -137,7 +140,8 @@ public function map(
137140
?Enumerable $stageAssignments = null,
138141
?Enumerable $decisions = null,
139142
bool|Collection $anonymizeReviews = false,
140-
?Enumerable $reviewerSuggestions = null
143+
?Enumerable $reviewerSuggestions = null,
144+
?Enumerable $stageFiles = null
141145
): array {
142146
$this->userGroups = $userGroups;
143147
$this->genres = $genres;
@@ -146,6 +150,7 @@ public function map(
146150
$this->stageAssignments = $stageAssignments ?? $this->getStageAssignmentsBySubmissions(collect([$item]));
147151
$this->decisions = $decisions ?? Repo::decision()->getCollector()->filterBySubmissionIds([$item->getId()])->getMany()->remember();
148152
$this->reviewerSuggestions = $reviewerSuggestions ?? ReviewerSuggestion::withSubmissionIds($item->getId())->get();
153+
$this->submissionStageFiles = $stageFiles ?? $this->getStageFilesBySubmissions(collect([$item]), [SubmissionFile::SUBMISSION_FILE_COPYEDIT]);
149154

150155
return $this->mapByProperties($this->getProps(), $item, $anonymizeReviews);
151156
}
@@ -169,14 +174,15 @@ public function summarize(
169174
?Enumerable $reviewAssignments = null,
170175
?Enumerable $stageAssignments = null,
171176
bool|Collection $anonymizeReviews = false,
172-
?Enumerable $reviewerSuggestions = null
177+
?Enumerable $reviewerSuggestions = null,
178+
?Enumerable $stageFiles = null
173179
): array {
174180
$this->userGroups = $userGroups;
175181
$this->genres = $genres;
176182
$this->reviewAssignments = $reviewAssignments ?? Repo::reviewAssignment()->getCollector()->filterBySubmissionIds([$item->getId()])->getMany()->remember();
177183
$this->stageAssignments = $stageAssignments ?? $this->getStageAssignmentsBySubmissions(collect([$item]));
178184
$this->reviewerSuggestions = $reviewerSuggestions ?? ReviewerSuggestion::withSubmissionIds($item->getId())->get();
179-
185+
$this->submissionStageFiles = $stageFiles ?? $this->getStageFilesBySubmissions(collect([$item]), [SubmissionFile::SUBMISSION_FILE_COPYEDIT]);
180186
return $this->mapByProperties($this->getSummaryProps(), $item, $anonymizeReviews);
181187
}
182188

@@ -206,6 +212,7 @@ public function mapMany(
206212
$this->reviewAssignments = Repo::reviewAssignment()->getCollector()->filterBySubmissionIds($submissionIds)->getMany()->remember();
207213
$this->stageAssignments = $this->getStageAssignmentsBySubmissions($collection);
208214
$this->decisions = Repo::decision()->getCollector()->filterBySubmissionIds($submissionIds)->getMany()->remember();
215+
$this->submissionStageFiles = $this->getStageFilesBySubmissions($collection, [SubmissionFile::SUBMISSION_FILE_COPYEDIT]);
209216

210217
$associatedReviewAssignments = $this->reviewAssignments->groupBy(fn (ReviewAssignment $reviewAssignment, int $key) =>
211218
$reviewAssignment->getData('submissionId'));
@@ -216,17 +223,16 @@ public function mapMany(
216223
$decision->getData('submissionId')
217224
);
218225

219-
$associatedStageAssignments = $this->stageAssignments
220-
->groupBy(
221-
fn (StageAssignment $stageAssignment, int $key) => $stageAssignment->submissionId
222-
);
223-
224226
/** @var \Illuminate\Support\LazyCollection $associatedReviewerSuggestions */
225227
$associatedReviewerSuggestions = ReviewerSuggestion::query()
226228
->withSubmissionIds($collection->keys()->toArray())
227229
->cursor()
228230
->groupBy('submissionId');
229231

232+
$associatedSubmissionStageFiles = $this->submissionStageFiles->groupBy(
233+
fn (SubmissionFile $submissionFile, int $key) => $submissionFile->getData('submissionId')
234+
);
235+
230236
return $collection->map(
231237
fn ($item) =>
232238
$this->map(
@@ -238,7 +244,8 @@ public function mapMany(
238244
$associatedStageAssignments->get($item->getId()),
239245
$associatedDecisions->get($item->getId()),
240246
$anonymizeReviews,
241-
$associatedReviewerSuggestions->get($item->getId())
247+
$associatedReviewerSuggestions->get($item->getId()),
248+
$associatedSubmissionStageFiles->get($item->getId())
242249
)
243250
);
244251
}
@@ -259,6 +266,7 @@ public function summarizeMany(Enumerable $collection, Enumerable $userGroups, ar
259266
$this->genres = $genres;
260267
$this->reviewAssignments = Repo::reviewAssignment()->getCollector()->filterBySubmissionIds($collection->keys()->toArray())->getMany()->remember();
261268
$this->stageAssignments = $this->getStageAssignmentsBySubmissions($collection);
269+
$this->submissionStageFiles = $this->getStageFilesBySubmissions($collection, [SubmissionFile::SUBMISSION_FILE_COPYEDIT]);
262270

263271
$associatedReviewAssignments = $this->reviewAssignments->groupBy(
264272
fn (ReviewAssignment $reviewAssignment, int $key) =>
@@ -276,6 +284,10 @@ public function summarizeMany(Enumerable $collection, Enumerable $userGroups, ar
276284
->cursor()
277285
->groupBy('submissionId');
278286

287+
$associatedSubmissionStageFiles = $this->submissionStageFiles->groupBy(
288+
fn (SubmissionFile $submissionFile, int $key) => $submissionFile->getData('submissionId')
289+
);
290+
279291
return $collection->map(
280292
fn ($item) =>
281293
$this->summarize(
@@ -285,7 +297,8 @@ public function summarizeMany(Enumerable $collection, Enumerable $userGroups, ar
285297
$associatedReviewAssignments->get($item->getId()),
286298
$associatedStageAssignment->get($item->getId()),
287299
$anonymizeReviews,
288-
$associatedReviewerSuggestions->get($item->getId())
300+
$associatedReviewerSuggestions->get($item->getId()),
301+
$associatedSubmissionStageFiles->get($item->getId())
289302
)
290303
);
291304
}
@@ -298,6 +311,7 @@ public function summarizeMany(Enumerable $collection, Enumerable $userGroups, ar
298311
* @param ?Enumerable $reviewAssignments review assignments associated with a submission
299312
* @param ?Enumerable $stageAssignments stage assignments associated with a submission
300313
* @param bool|Collection<int> $anonymizeReviews List of review assignment IDs to anonymize
314+
* @param ?Enumerable<int, SubmissionFile> $stageFiles List of stage files associated with a submission
301315
*/
302316
public function mapToSubmissionsList(
303317
Submission $item,
@@ -306,15 +320,16 @@ public function mapToSubmissionsList(
306320
?Enumerable $reviewAssignments = null,
307321
?Enumerable $stageAssignments = null,
308322
?Enumerable $decisions = null,
309-
bool|Collection $anonymizeReviews = false
323+
bool|Collection $anonymizeReviews = false,
324+
?Enumerable $stageFiles = null
310325
): array {
311326
$this->userGroups = $userGroups;
312327
$this->genres = $genres;
313328
$this->reviewAssignments = $reviewAssignments ?? Repo::reviewAssignment()->getCollector()->filterBySubmissionIds([$item->getId()])->getMany()->remember();
314329
$this->stageAssignments = $stageAssignments ?? $this->getStageAssignmentsBySubmissions(collect([$item]));
315330
$this->decisions = $decisions ?? Repo::decision()->getCollector()->filterBySubmissionIds([$item->getId()])->getMany()->remember();
316331
$this->reviewerSuggestions = $reviewerSuggestions ?? ReviewerSuggestion::withSubmissionIds($item->getId())->get();
317-
332+
$this->submissionStageFiles = $stageFiles ?? $this->getStageFilesBySubmissions(collect([$item]), [SubmissionFile::SUBMISSION_FILE_COPYEDIT]);
318333
return $this->mapByProperties($this->getSubmissionsListProps(), $item, $anonymizeReviews);
319334
}
320335

@@ -345,7 +360,7 @@ public function mapManyToSubmissionsList(
345360
$this->reviewAssignments = Repo::reviewAssignment()->getCollector()->filterBySubmissionIds($submissionIds)->getMany()->remember();
346361
$this->stageAssignments = $this->getStageAssignmentsBySubmissions($collection);
347362
$this->decisions = Repo::decision()->getCollector()->filterBySubmissionIds($submissionIds)->getMany()->remember();
348-
363+
$this->submissionStageFiles = $this->getStageFilesBySubmissions($collection, [SubmissionFile::SUBMISSION_FILE_COPYEDIT]);
349364
$associatedReviewAssignments = $this->reviewAssignments->groupBy(
350365
fn (ReviewAssignment $reviewAssignment, int $key) =>
351366
$reviewAssignment->getData('submissionId')
@@ -365,6 +380,10 @@ public function mapManyToSubmissionsList(
365380
->cursor()
366381
->groupBy('submissionId');
367382

383+
$associatedSubmissionStageFiles = $this->submissionStageFiles->groupBy(
384+
fn (SubmissionFile $submissionFile, int $key) => $submissionFile->getData('submissionId')
385+
);
386+
368387
return $collection->map(
369388
fn ($item) =>
370389
$this->mapToSubmissionsList(
@@ -375,7 +394,7 @@ public function mapManyToSubmissionsList(
375394
$associatedStageAssignments->get($item->getId()),
376395
$associatedDecisions->get($item->getId()),
377396
$anonymizeReviews,
378-
$associatedReviewerSuggestions->get($item->getId())
397+
$associatedSubmissionStageFiles->get($item->getId())
379398
)
380399
);
381400
}
@@ -439,7 +458,7 @@ protected function mapByProperties(array $props, Submission $submission, bool|Co
439458
$reviewRounds = $this->getReviewRoundsFromSubmission($submission);
440459
$currentReviewRound = $reviewRounds->sortKeys()->last(); /** @var ReviewRound|null $currentReviewRound */
441460
$stages = in_array('stages', $props) ?
442-
$this->getPropertyStages($this->stageAssignments, $this->reviewAssignments, $submission, $this->decisions ?? null, $currentReviewRound) :
461+
$this->getPropertyStages($this->stageAssignments, $this->reviewAssignments, $submission, $this->submissionStageFiles, $this->decisions ?? null, $currentReviewRound) :
443462
[];
444463

445464
foreach ($props as $prop) {
@@ -518,7 +537,7 @@ protected function mapByProperties(array $props, Submission $submission, bool|Co
518537
case 'urlWorkflow':
519538
$output[$prop] = Repo::submission()->getWorkflowUrlByUserRoles($submission);
520539
break;
521-
case 'reviewerSuggestions':
540+
case 'reviewerSuggestions':
522541
$output[$prop] = $this->getPropertyReviewerSuggestions($this->reviewerSuggestions);
523542
break;
524543
default:
@@ -566,7 +585,7 @@ protected function canChangeMetadata(Enumerable $stageAssignments, Submission $s
566585

567586
return false;
568587
}
569-
588+
570589
/**
571590
* Get details about the reviewer suggestions for a submission
572591
*/
@@ -588,11 +607,11 @@ protected function getPropertyReviewerSuggestions(Enumerable $reviewerSuggestion
588607
)
589608
)->map(
590609
fn (array $suggestion): array => array_intersect_key(
591-
$suggestion,
610+
$suggestion,
592611
array_flip($reviewerSuggestionProps)
593612
)
594613
)->toArray();
595-
614+
596615
return $reviewerSuggestions;
597616
}
598617

@@ -783,6 +802,7 @@ protected function getPropertyParticipants(Submission $submission): array
783802
* `currentUserAssignedRoles` array the roles of the current user in the submission per stage, user may be unassigned but have global manager role
784803
* `currentUserCanRecommendOnly` whether the current user is an editor with the recommend only flag
785804
* `currentUserRecommendation` object includes the recommendation decision of the current user
805+
* `uploadedFilesCount` int || null the count of files upload to the stage. A null value indicates that the count was not included
786806
* {
787807
* `decision` => recommendation decision,
788808
* `label` => decision label
@@ -798,7 +818,7 @@ protected function getPropertyParticipants(Submission $submission): array
798818
* }
799819
* ]
800820
*/
801-
protected function getPropertyStages(Enumerable $stageAssignments, Enumerable $reviewAssignments, Submission $submission, ?Enumerable $decisions, ?ReviewRound $currentReviewRound): array
821+
protected function getPropertyStages(Enumerable $stageAssignments, Enumerable $reviewAssignments, Submission $submission, Enumerable $stageFiles, ?Enumerable $decisions, ?ReviewRound $currentReviewRound): array
802822
{
803823
$request = Application::get()->getRequest();
804824
$currentUser = $request->getUser();
@@ -817,6 +837,14 @@ protected function getPropertyStages(Enumerable $stageAssignments, Enumerable $r
817837
'editorAssigned' => false,
818838
'currentUserAssignedRoles' => [],
819839
];
840+
841+
if ($stageId === WORKFLOW_STAGE_ID_EDITING) {
842+
$stages[$stageId]['uploadedFilesCount'] = $stageFiles->filter(fn(SubmissionFile $file) => $file->getData('fileStage') == SubmissionFile::SUBMISSION_FILE_COPYEDIT)->count();
843+
} else {
844+
// A `null` value is used to indicate that no count data is available.
845+
// This is also done to ensure that all stage objects has the same properties
846+
$stages[$stageId]['uploadedFilesCount'] = null;
847+
}
820848
}
821849

822850
$isAssignedInAnyRole = false; // Determine if the current user is assigned to the submission in any role
@@ -892,7 +920,7 @@ protected function getPropertyStages(Enumerable $stageAssignments, Enumerable $r
892920
// if the current user is not assigned in any non-revoked role but has a global role as a manager or admin, consider it in the submission
893921
if (!$isAssignedInAnyRole) {
894922
$hasCurrentUserReviewAssignment = $this->reviewAssignments->contains(
895-
fn (ReviewAssignment $reviewAssignment) =>
923+
fn (ReviewAssignment $reviewAssignment) =>
896924
$reviewAssignment->getReviewerId() === $currentUser->getId() &&
897925
!$reviewAssignment->getDeclined() &&
898926
!$reviewAssignment->getCancelled()
@@ -1143,4 +1171,25 @@ protected function checkDecisionPermissions(int $stageId, Submission $submission
11431171
'isOnlyRecommending' => $isOnlyRecommending
11441172
];
11451173
}
1174+
1175+
/**
1176+
*
1177+
* @param Enumerable<Submission> $submissions
1178+
* @param array $stageIds The IDs of the stages to limit results to
1179+
*
1180+
* @return LazyCollection<SubmissionFile> The collection of files associated with submissions
1181+
*/
1182+
protected function getStageFilesBySubmissions(Enumerable $submissions, array $stageIds): LazyCollection
1183+
{
1184+
$submissionIds = [];
1185+
$submissions->each(function (Submission $submission) use (&$submissionIds) {
1186+
$submissionIds[] = $submission->getId();
1187+
});
1188+
1189+
return Repo::submissionFile()
1190+
->getCollector()
1191+
->filterBySubmissionIds($submissionIds)
1192+
->filterByFileStages($stageIds)
1193+
->getMany();
1194+
}
11461195
}

schemas/submission.json

+6-2
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@
312312
"type": "object",
313313
"properties": {
314314
"decision": {
315-
"type": "int"
315+
"type": "integer"
316316
},
317317
"label": {
318318
"type": "string"
@@ -323,12 +323,16 @@
323323
"type": "array",
324324
"properties": {
325325
"decision": {
326-
"type": "int"
326+
"type": "integer"
327327
},
328328
"label": {
329329
"type": "string"
330330
}
331331
}
332+
},
333+
"uploadedFilesCount": {
334+
"type": "integer",
335+
"validation": ["nullable"]
332336
}
333337
}
334338
}

0 commit comments

Comments
 (0)