Skip to content

Commit 62e9132

Browse files
committed
clean up invtation handler
1 parent 932fce7 commit 62e9132

File tree

9 files changed

+389
-254
lines changed

9 files changed

+389
-254
lines changed

classes/invitation/core/Invitation.php

+11
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
use PKP\invitation\core\enums\ValidationContext;
2929
use PKP\invitation\core\traits\HasMailable;
3030
use PKP\invitation\core\traits\ShouldValidate;
31+
use PKP\invitation\invitations\userRoleAssignment\handlers\UserRoleAssignmentInviteUIController;
3132
use PKP\invitation\models\InvitationModel;
3233
use PKP\pages\invitation\InvitationHandler;
3334
use PKP\security\Validation;
@@ -501,4 +502,14 @@ public function isPending(): bool
501502

502503
return false;
503504
}
505+
506+
/**
507+
* Defines the controller that is responsible for the handle of the create/edit
508+
* invitation views
509+
* @return InvitationUIActionRedirectController|null
510+
*/
511+
public function getInvitationUIActionRedirectController(): ?InvitationUIActionRedirectController
512+
{
513+
return new UserRoleAssignmentInviteUIController($this);
514+
}
504515
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?php
2+
3+
/**
4+
* @file classes/invitation/core/InvitationUIActionRedirectController.php
5+
*
6+
* Copyright (c) 2025 Simon Fraser University
7+
* Copyright (c) 2025 John Willinsky
8+
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
9+
*
10+
* @class InvitationUIActionRedirectController
11+
*
12+
* @brief Declares the create/edit url handlers.
13+
*/
14+
15+
namespace PKP\invitation\core;
16+
17+
use APP\core\Request;
18+
use Illuminate\Routing\Controller;
19+
20+
abstract class InvitationUIActionRedirectController extends Controller
21+
{
22+
/** @var TInvitation */
23+
protected Invitation $invitation;
24+
25+
public function __construct(Invitation $invitation)
26+
{
27+
$this->invitation = $invitation;
28+
}
29+
abstract public function createHandle(Request $request, $userId = null): void;
30+
abstract public function editHandle(Request $request): void;
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
<?php
2+
3+
/**
4+
* @file classes/invitation/invitations/userRoleAssignment/handlers/UserRoleAssignmentInviteUIController.php
5+
*
6+
* Copyright (c) 2025 Simon Fraser University
7+
* Copyright (c) 2025 John Willinsky
8+
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
9+
*
10+
* @class UserRoleAssignmentInviteUIController
11+
*
12+
* @brief Handles UI for invitation workflow
13+
*/
14+
15+
namespace PKP\invitation\invitations\userRoleAssignment\handlers;
16+
17+
use APP\core\Application;
18+
use APP\core\Request;
19+
use APP\facades\Repo;
20+
use APP\template\TemplateManager;
21+
use PKP\facades\Locale;
22+
use PKP\invitation\core\Invitation;
23+
use PKP\invitation\core\InvitationUIActionRedirectController;
24+
use PKP\invitation\invitations\userRoleAssignment\resources\UserRoleAssignmentInviteResource;
25+
use PKP\invitation\stepTypes\SendInvitationStep;
26+
27+
class UserRoleAssignmentInviteUIController extends InvitationUIActionRedirectController
28+
{
29+
protected Invitation $invitation;
30+
31+
/**
32+
* @param Invitation $invitation
33+
*/
34+
public function __construct(Invitation $invitation)
35+
{
36+
$this->invitation = $invitation;
37+
}
38+
39+
/**
40+
* Create new invitations for users
41+
* @param Request $request
42+
* @param $userId
43+
* @return void
44+
* @throws \Exception
45+
*/
46+
public function createHandle(Request $request, $userId = null): void
47+
{
48+
$invitationPayload = [
49+
'userId' => null,
50+
'inviteeEmail' => '',
51+
'orcid' => '',
52+
'givenName' => '',
53+
'familyName' => '',
54+
'orcidValidation' => false,
55+
'disabled' => false,
56+
'userGroupsToAdd' => [
57+
[
58+
'userGroupId' => null,
59+
'dateStart' => null,
60+
'dateEnd' => null,
61+
'masthead' => null,
62+
]
63+
],
64+
'currentUserGroups' => [],
65+
'userGroupsToRemove' => [],
66+
'emailComposer' => [
67+
'body' => '',
68+
'subject' => '',
69+
]
70+
];
71+
$user = null;
72+
$invitationMode = 'create';
73+
if ($userId) {
74+
//send invitation using edit user action in user access table
75+
$user = Repo::user()->get($userId, true);
76+
$invitationPayload = (
77+
new UserRoleAssignmentInviteResource($this->invitation))
78+
->transformInvitationPayload($userId, $user->getAllData(), $request->getContext()
79+
);
80+
$invitationMode = 'editUser';
81+
}
82+
$templateMgr = TemplateManager::getManager($request);
83+
$breadcrumbs = $templateMgr->getTemplateVars('breadcrumbs');
84+
$context = $request->getContext();
85+
$breadcrumbs[] = [
86+
'id' => 'contexts',
87+
'name' => __('navigation.access'),
88+
'url' => $request
89+
->getDispatcher()
90+
->url(
91+
$request,
92+
Application::ROUTE_PAGE,
93+
null,
94+
'management',
95+
'settings',
96+
['access']
97+
)
98+
];
99+
$breadcrumbs[] = [
100+
'id' => 'invitationWizard',
101+
'name' => __('invitation.wizard.pageTitle'),
102+
];
103+
$steps = new SendInvitationStep();
104+
$templateMgr->setState([
105+
'steps' => $steps->getSteps(null, $context, $user),
106+
'emailTemplatesApiUrl' => $request
107+
->getDispatcher()
108+
->url(
109+
$request,
110+
Application::ROUTE_API,
111+
$context->getData('urlPath'),
112+
'emailTemplates'
113+
),
114+
'primaryLocale' => $context->getData('primaryLocale'),
115+
'invitationType' => 'userRoleAssignment',
116+
'invitationPayload' => $invitationPayload,
117+
'invitationMode' => $invitationMode,
118+
'invitationUserData' => $userId ?
119+
(
120+
new UserRoleAssignmentInviteResource($this->invitation))
121+
->transformInvitationUserData(
122+
$user,
123+
$request->getContext()
124+
) : [],
125+
'pageTitle' => $user ? '' : __('invitation.wizard.pageTitle'),
126+
'pageTitleDescription' => $user ? '' : __('invitation.wizard.pageTitleDescription'),
127+
]);
128+
$templateMgr->assign([
129+
'pageComponent' => 'Page',
130+
'breadcrumbs' => $breadcrumbs,
131+
'pageWidth' => TemplateManager::PAGE_WIDTH_FULL,
132+
]);
133+
$templateMgr->display('/invitation/userInvitation.tpl');
134+
}
135+
136+
/**
137+
* Edit invitations
138+
* @param Request $request
139+
* @return void
140+
* @throws \Exception
141+
*/
142+
public function editHandle(Request $request): void
143+
{
144+
$payload = $this->invitation->getPayload()->toArray();
145+
$invitationModel = $this->invitation->invitationModel->toArray();
146+
$invitationMode = 'edit';
147+
$payload['email'] = $invitationModel['email'];
148+
$payloadDataToBeTransform = [];
149+
$user = $invitationModel['userId'] ? Repo::user()->get($invitationModel['userId'], true) : null;
150+
if($user){
151+
// if edit an invitation for existing user, used user data as invitation payload
152+
$payloadDataToBeTransform = $user->getAllData();
153+
$payloadDataToBeTransform['userGroupsToAdd'] = $payload['userGroupsToAdd'];
154+
}
155+
$invitationPayload = (
156+
new UserRoleAssignmentInviteResource($this->invitation))
157+
->transformInvitationPayload(
158+
$invitationModel['userId'],
159+
$invitationModel['userId'] ? $payloadDataToBeTransform : $payload,
160+
$request->getContext()
161+
);
162+
163+
$templateMgr = TemplateManager::getManager($request);
164+
$breadcrumbs = $templateMgr->getTemplateVars('breadcrumbs');
165+
$context = $request->getContext();
166+
$breadcrumbs[] = [
167+
'id' => 'contexts',
168+
'name' => __('navigation.access'),
169+
'url' => $request
170+
->getDispatcher()
171+
->url(
172+
$request,
173+
Application::ROUTE_PAGE,
174+
null,
175+
'management',
176+
'settings',
177+
['access']
178+
)
179+
];
180+
$breadcrumbs[] = [
181+
'id' => 'invitationWizard',
182+
'name' => __('invitation.wizard.pageTitle'),
183+
];
184+
$steps = new SendInvitationStep();
185+
$templateMgr->setState([
186+
'steps' => $steps->getSteps($this->invitation, $context, $user),
187+
'emailTemplatesApiUrl' => $request
188+
->getDispatcher()
189+
->url(
190+
$request,
191+
Application::ROUTE_API,
192+
$context->getData('urlPath'),
193+
'emailTemplates'
194+
),
195+
'primaryLocale' => $context->getData('primaryLocale'),
196+
'invitationType' => 'userRoleAssignment',
197+
'invitationPayload' => $invitationPayload,
198+
'invitationMode' => $invitationMode,
199+
'invitationUserData' => $invitationModel['userId'] ?
200+
(
201+
new UserRoleAssignmentInviteResource($this->invitation))
202+
->transformInvitationUserData(
203+
$user,
204+
$request->getContext()
205+
) : [],
206+
'pageTitle' =>
207+
($invitationPayload->givenName && $invitationPayload->familyName) ?
208+
$invitationPayload->givenName[Locale::getLocale()] . ' '
209+
. $invitationPayload->familyName[Locale::getLocale()] : $invitationPayload->inviteeEmail
210+
,
211+
'pageTitleDescription' =>
212+
__(
213+
'invitation.wizard.viewPageTitleDescription',
214+
['name' =>
215+
$invitationPayload->givenName[Locale::getLocale()] ?
216+
$invitationPayload->givenName[Locale::getLocale()] : $invitationPayload->inviteeEmail]
217+
),
218+
]);
219+
$templateMgr->assign([
220+
'pageComponent' => 'Page',
221+
'breadcrumbs' => $breadcrumbs,
222+
'pageWidth' => TemplateManager::PAGE_WIDTH_FULL,
223+
]);
224+
$templateMgr->display('/invitation/userInvitation.tpl');
225+
}
226+
}

classes/invitation/invitations/userRoleAssignment/resources/BaseUserRoleAssignmentInviteResource.php

+23
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
use APP\facades\Repo;
1818
use Illuminate\Http\Request;
1919
use Illuminate\Http\Resources\Json\JsonResource;
20+
use PKP\context\Context;
21+
use PKP\facades\Locale;
2022
use PKP\invitation\invitations\userRoleAssignment\payload\UserRoleAssignmentInvitePayload;
2123
use PKP\user\User;
24+
use PKP\userGroup\relationships\UserUserGroup;
2225

2326
class BaseUserRoleAssignmentInviteResource extends JsonResource
2427
{
@@ -91,4 +94,24 @@ protected function createNewUserFromPayload(UserRoleAssignmentInvitePayload $pay
9194

9295
return $newUser;
9396
}
97+
98+
protected function transformCurrentUserGroups(int $id , Context $context): array
99+
{
100+
$userGroups = [];
101+
$userUserGroups = UserUserGroup::query()
102+
->withUserId($id)
103+
->withContextId($context->getId())
104+
->get()
105+
->toArray();
106+
foreach ($userUserGroups as $key => $userUserGroup) {
107+
$userGroup = Repo::userGroup()
108+
->get($userUserGroup['userGroupId'])
109+
->toArray();
110+
$userGroups[$key] = $userUserGroup;
111+
$userGroups[$key]['masthead'] = $userUserGroup['masthead'] === 1;
112+
$userGroups[$key]['name'] = $userGroup['name'][Locale::getLocale()];
113+
$userGroups[$key]['id'] = $userGroup['userGroupId'];
114+
}
115+
return $userGroups;
116+
}
94117
}

classes/invitation/invitations/userRoleAssignment/resources/UserRoleAssignmentInviteResource.php

+53
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
namespace PKP\invitation\invitations\userRoleAssignment\resources;
1616

1717
use Illuminate\Http\Request;
18+
use PKP\context\Context;
19+
use PKP\invitation\invitations\userRoleAssignment\payload\UserRoleAssignmentInvitePayload;
1820
use PKP\user\User;
1921

2022
class UserRoleAssignmentInviteResource extends BaseUserRoleAssignmentInviteResource
@@ -65,4 +67,55 @@ public function toArray(Request $request)
6567
'newUser' => $this->transformUser($newUser),
6668
]);
6769
}
70+
71+
/**
72+
* Transform invitation payload
73+
* @param int|null $userId
74+
* @param array $payload
75+
* @param Context $context
76+
* @return UserRoleAssignmentInvitePayload
77+
*/
78+
public function transformInvitationPayload(?int $userId, array $payload, Context $context): object
79+
{
80+
$invitationPayload = UserRoleAssignmentInvitePayload::fromArray($payload)->toArray();
81+
$invitationPayload['userId'] = !$userId ? null : $userId;
82+
$invitationPayload['inviteeEmail'] = !$userId ?$invitationPayload['sendEmailAddress']:$payload['email'];
83+
$invitationPayload['userGroupsToAdd'] = !$invitationPayload['userGroupsToAdd'] ? [] :$invitationPayload['userGroupsToAdd'];
84+
$invitationPayload['currentUserGroups'] = !$userId ? [] : $this->transformCurrentUserGroups($userId,$context);
85+
86+
return (object)$invitationPayload;
87+
}
88+
89+
/**
90+
* Transform user data for invitation view
91+
* @param User $user
92+
* @param $context
93+
* @return array
94+
*/
95+
public function transformInvitationUserData(User $user, $context): array
96+
{
97+
$userData = [];
98+
$userData['country'] = $user->getCountryLocalized();
99+
$userData['biography'] = $user->getBiography(null);
100+
$userData['phone'] = $user->getPhone();
101+
$userData['mailingAddress'] = $user->getMailingAddress();
102+
$userData['signature'] = $user->getSignature(null);
103+
$userData['locales'] = $this->transformUserWorkingLanguages($context, $user->getLocales());
104+
$userData['reviewInterests'] = $user->getInterestString();
105+
$userData['homePageUrl'] = $user->getUrl();
106+
$userData['disabled'] = $user->getData('disabled');
107+
return $userData;
108+
}
109+
110+
/**
111+
* get user working languages
112+
* @param Context $context
113+
* @param array $userLocales
114+
* @return string
115+
*/
116+
private function transformUserWorkingLanguages(Context $context, array $userLocales): string
117+
{
118+
$locales = $context->getSupportedLocaleNames();
119+
return join(__('common.commaListSeparator'), array_map(fn($key) => $locales[$key], $userLocales));
120+
}
68121
}

0 commit comments

Comments
 (0)