Skip to content

Commit c8f9af5

Browse files
committed
pkp/pkp-lib#10929 Temporary fix - implement app level SubmissionHandler::getSubmitUserGroups method
1 parent 90b5183 commit c8f9af5

File tree

2 files changed

+162
-0
lines changed

2 files changed

+162
-0
lines changed

api/v1/submissions/SubmissionController.php

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
use Illuminate\Http\Request;
2828
use Illuminate\Http\Response;
2929
use Illuminate\Support\Facades\Route;
30+
use Illuminate\Support\LazyCollection;
3031
use PKP\components\forms\publication\TitleAbstractForm;
3132
use PKP\context\Context;
3233
use PKP\db\DAORegistry;
@@ -233,4 +234,136 @@ protected function getPublicationIssueForm(Request $illuminateRequest): JsonResp
233234

234235
return response()->json($this->getLocalizedForm($issueEntryForm, $submission->getData('locale'), $locales), Response::HTTP_OK);
235236
}
237+
238+
/**
239+
* Add a new submission
240+
*/
241+
public function add(Request $illuminateRequest): JsonResponse
242+
{
243+
$request = $this->getRequest();
244+
$context = $request->getContext();
245+
$user = $request->getUser();
246+
247+
if ($context->getData('disableSubmissions')) {
248+
return response()->json([
249+
'error' => __('author.submit.notAccepting'),
250+
], Response::HTTP_FORBIDDEN);
251+
}
252+
253+
$params = $this->convertStringsToSchema(PKPSchemaService::SCHEMA_SUBMISSION, $illuminateRequest->input());
254+
255+
$readOnlyErrors = $this->getWriteDisabledErrors(PKPSchemaService::SCHEMA_SUBMISSION, $params);
256+
if (!empty($readOnlyErrors)) {
257+
return response()->json($readOnlyErrors, Response::HTTP_BAD_REQUEST);
258+
}
259+
260+
$params['contextId'] = $context->getId();
261+
262+
$errors = Repo::submission()->validate(null, $params, $context);
263+
264+
$sectionIdPropName = Application::getSectionIdPropName();
265+
if (isset($params[$sectionIdPropName])) {
266+
$sectionId = $params[$sectionIdPropName];
267+
$section = Repo::section()->get($sectionId, $context->getId());
268+
269+
if (!$section) {
270+
$errors[$sectionIdPropName] = [__('api.submission.400.sectionDoesNotExist')];
271+
} else {
272+
if ($section->getIsInactive()) {
273+
$errors[$sectionIdPropName] = [__('api.submission.400.inactiveSection')];
274+
} else {
275+
if ($section->getEditorRestricted() && !$this->isEditor()) {
276+
$errors[$sectionIdPropName] = [__('submission.sectionRestrictedToEditors')];
277+
}
278+
}
279+
}
280+
}
281+
$submitterUserGroups = UserGroup::withContextIds($context->getId())
282+
->withRoleIds([Role::ROLE_ID_MANAGER, Role::ROLE_ID_AUTHOR])
283+
->whereHas('userUserGroups', function ($query) use ($user) {
284+
$query->withUserId($user->getId());
285+
})
286+
->get();
287+
288+
289+
$userGroupIdPropName = 'userGroupId';
290+
291+
if (isset($params[$userGroupIdPropName])) {
292+
$submitAsUserGroup = $submitterUserGroups
293+
->first(function (UserGroup $userGroup) use ($params, $userGroupIdPropName) {
294+
return $userGroup->id === $params[$userGroupIdPropName];
295+
});
296+
if (!$submitAsUserGroup) {
297+
$errors[$userGroupIdPropName] = [__('api.submissions.400.invalidSubmitAs')];
298+
}
299+
} elseif ($submitterUserGroups->count()) {
300+
$submitAsUserGroup = $submitterUserGroups
301+
->sort(function (UserGroup $a, UserGroup $b) {
302+
return $a->getRoleId() === Role::ROLE_ID_AUTHOR ? 1 : -1;
303+
})
304+
->first();
305+
} else {
306+
$submitAsUserGroup = UserGroup::withContextIds($context->getId())->withRoleIds(Role::ROLE_ID_AUTHOR)->first();
307+
if (!$submitAsUserGroup) {
308+
$errors[$userGroupIdPropName] = [__('submission.wizard.notAllowed.description')];
309+
} else {
310+
Repo::userGroup()->assignUserToGroup(
311+
$user->getId(),
312+
$submitAsUserGroup->id
313+
);
314+
}
315+
}
316+
317+
if (!empty($errors)) {
318+
return response()->json($errors, Response::HTTP_BAD_REQUEST);
319+
}
320+
321+
$publicationProps = [];
322+
if (isset($params[$sectionIdPropName])) {
323+
$publicationProps[$sectionIdPropName] = $params[$sectionIdPropName];
324+
unset($params[$sectionIdPropName]);
325+
}
326+
327+
$submission = Repo::submission()->newDataObject($params);
328+
$publication = Repo::publication()->newDataObject($publicationProps);
329+
$submissionId = Repo::submission()->add($submission, $publication, $request->getContext());
330+
331+
$submission = Repo::submission()->get($submissionId);
332+
333+
// Assign submitter to submission
334+
Repo::stageAssignment()
335+
->build(
336+
$submission->getId(),
337+
$submitAsUserGroup->id,
338+
$request->getUser()->getId(),
339+
$submitAsUserGroup->recommendOnly,
340+
// Authors can always edit metadata before submitting
341+
$submission->getData('submissionProgress')
342+
? true
343+
: $submitAsUserGroup->permitMetadataEdit
344+
);
345+
346+
// Create an author record from the submitter's user account
347+
if ($submitAsUserGroup->roleId === Role::ROLE_ID_AUTHOR) {
348+
$author = Repo::author()->newAuthorFromUser($request->getUser(), $submission, $context);
349+
$author->setData('publicationId', $publication->getId());
350+
$author->setUserGroupId($submitAsUserGroup->id);
351+
$authorId = Repo::author()->add($author);
352+
Repo::publication()->edit($publication, ['primaryContactId' => $authorId]);
353+
}
354+
355+
$userGroups = UserGroup::withContextIds($submission->getData('contextId'))->cursor();
356+
357+
/** @var GenreDAO $genreDao */
358+
$genreDao = DAORegistry::getDAO('GenreDAO');
359+
$genres = $genreDao->getByContextId($submission->getData('contextId'))->toArray();
360+
361+
if (!$userGroups instanceof LazyCollection) {
362+
$userGroups = $userGroups->lazy();
363+
}
364+
365+
$userRoles = $this->getAuthorizedContextObject(Application::ASSOC_TYPE_USER_ROLES);
366+
367+
return response()->json(Repo::submission()->getSchemaMap()->map($submission, $userGroups, $genres, $userRoles), Response::HTTP_OK);
368+
}
236369
}

pages/submission/SubmissionHandler.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
use APP\section\Section;
2828
use APP\submission\Submission;
2929
use APP\template\TemplateManager;
30+
use Illuminate\Support\Collection;
3031
use Illuminate\Support\LazyCollection;
3132
use PKP\components\forms\FormComponent;
3233
use PKP\components\forms\publication\Details;
@@ -36,7 +37,10 @@
3637
use PKP\facades\Locale;
3738
use PKP\pages\submission\PKPSubmissionHandler;
3839
use PKP\plugins\Hook;
40+
use PKP\security\Role;
3941
use PKP\submission\GenreDAO;
42+
use PKP\user\User;
43+
use PKP\userGroup\UserGroup;
4044

4145
class SubmissionHandler extends PKPSubmissionHandler
4246
{
@@ -295,4 +299,29 @@ protected function getConfirmSubmitMessage(Submission $submission, Context $cont
295299
}
296300
return __('submission.wizard.confirmSubmit', ['context' => $context->getLocalizedName()]);
297301
}
302+
303+
/**
304+
* Get the user groups that a user can submit in
305+
*/
306+
protected function getSubmitUserGroups(Context $context, User $user): Collection
307+
{
308+
$userGroups = UserGroup::query()
309+
->withContextIds([$context->getId()])
310+
->withUserIds([$user->getId()])
311+
->withRoleIds([Role::ROLE_ID_MANAGER, Role::ROLE_ID_SITE_ADMIN, Role::ROLE_ID_AUTHOR])
312+
->get();
313+
314+
// Users without a submitting role can submit as an
315+
// author role that allows self registration
316+
if ($userGroups->isEmpty()) {
317+
$defaultUserGroup = UserGroup::withContextIds([$context->getId()])
318+
->withRoleIds([Role::ROLE_ID_AUTHOR])
319+
->permitSelfRegistration(true)
320+
->first();
321+
322+
$userGroups = collect($defaultUserGroup ? [$defaultUserGroup->id => $defaultUserGroup] : []);
323+
}
324+
325+
return $userGroups;
326+
}
298327
}

0 commit comments

Comments
 (0)