Skip to content

Commit d583d6b

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

File tree

6 files changed

+262
-250
lines changed

6 files changed

+262
-250
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
<?php
2+
3+
/**
4+
* @file classes/invitation/invitations/userRoleAssignment/handlers/UserRoleAssignmentInviteUIController.php
5+
*
6+
* Copyright (c) 2024 Simon Fraser University
7+
* Copyright (c) 2024 John Willinsky
8+
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
9+
*
10+
* @class UserRoleAssignmentInviteUIController
11+
*
12+
*/
13+
14+
namespace PKP\invitation\invitations\userRoleAssignment\handlers;
15+
16+
use APP\core\Application;
17+
use APP\core\Request;
18+
use APP\template\TemplateManager;
19+
use PKP\facades\Locale;
20+
use PKP\invitation\core\Invitation;
21+
use PKP\invitation\invitations\userRoleAssignment\resources\UserRoleAssignmentInviteResource;
22+
use PKP\invitation\stepTypes\SendInvitationStep;
23+
24+
class UserRoleAssignmentInviteUIController
25+
{
26+
private ?Invitation $invitation;
27+
28+
public function __construct(?Invitation $invitation)
29+
{
30+
$this->invitation = $invitation;
31+
}
32+
33+
/**
34+
* Generate UI steps for invitation
35+
* @param Request $request
36+
* @param $userId
37+
* @param string $invitationMode
38+
* @return void
39+
* @throws \Exception
40+
*/
41+
public function inviteHandle(Request $request, $userId = null, string $invitationMode = 'create'): void
42+
{
43+
$user = null;
44+
$invitation = null;
45+
$invitationPayload = [
46+
'userId' => null,
47+
'inviteeEmail' => '',
48+
'orcid' => '',
49+
'givenName' => '',
50+
'familyName' => '',
51+
'orcidValidation' => false,
52+
'disabled' => false,
53+
'userGroupsToAdd' => [
54+
[
55+
'userGroupId' => null,
56+
'dateStart' => null,
57+
'dateEnd' => null,
58+
'masthead' => null,
59+
]
60+
],
61+
'currentUserGroups' => [],
62+
'userGroupsToRemove' => [],
63+
'emailComposer' => [
64+
'body' => '',
65+
'subject' => '',
66+
]
67+
];
68+
if ($this->invitation && $invitationMode == 'create') {
69+
$invitation = $this->invitation;
70+
$payload = $invitation->getPayload()->toArray();
71+
$invitationModel = $invitation->invitationModel->toArray();
72+
$invitationMode = 'edit';
73+
$payload['email'] = $invitationModel['email'];
74+
$invitationData = (
75+
new UserRoleAssignmentInviteResource($this->invitation))
76+
->transformInvitationPayload($invitationModel['userId'], $payload, $request->getContext()
77+
);
78+
$user = $invitationData['user'];
79+
$invitationPayload = $invitationData['invitationPayload'];
80+
} elseif ($invitationMode == 'editUser') {
81+
//send invitation using edit user action in user access table
82+
$invitationData = (
83+
new UserRoleAssignmentInviteResource($this->invitation))
84+
->transformInvitationPayload($userId, [], $request->getContext()
85+
);
86+
$user = $invitationData['user'];
87+
$invitationPayload = $invitationData['invitationPayload'];
88+
}
89+
$templateMgr = TemplateManager::getManager($request);
90+
91+
$breadcrumbs = $templateMgr->getTemplateVars('breadcrumbs');
92+
$context = $request->getContext();
93+
$breadcrumbs[] = [
94+
'id' => 'contexts',
95+
'name' => __('navigation.access'),
96+
'url' => $request
97+
->getDispatcher()
98+
->url(
99+
$request,
100+
Application::ROUTE_PAGE,
101+
null,
102+
'management',
103+
'settings',
104+
['access']
105+
)
106+
];
107+
$breadcrumbs[] = [
108+
'id' => 'invitationWizard',
109+
'name' => __('invitation.wizard.pageTitle'),
110+
];
111+
$steps = new SendInvitationStep();
112+
$templateMgr->setState([
113+
'steps' => $steps->getSteps($invitation, $context, $user),
114+
'emailTemplatesApiUrl' => $request
115+
->getDispatcher()
116+
->url(
117+
$request,
118+
Application::ROUTE_API,
119+
$context->getData('urlPath'),
120+
'emailTemplates'
121+
),
122+
'primaryLocale' => $context->getData('primaryLocale'),
123+
'invitationType' => 'userRoleAssignment',
124+
'invitationPayload' => $invitationPayload,
125+
'invitationMode' => $invitationMode,
126+
'pageTitle' => $invitation || $invitationMode === 'editUser' ?
127+
(
128+
($invitationPayload['givenName'] && $invitationPayload['familyName']) ?
129+
$invitationPayload['givenName'][Locale::getLocale()] . ' '
130+
. $invitationPayload['familyName'][Locale::getLocale()] : $invitationPayload['inviteeEmail']
131+
)
132+
: __('invitation.wizard.pageTitle'),
133+
'pageTitleDescription' => $invitation || $invitationMode === 'editUser' ?
134+
__(
135+
'invitation.wizard.viewPageTitleDescription',
136+
['name' =>
137+
$invitationPayload['givenName'][Locale::getLocale()] ?
138+
$invitationPayload['givenName'][Locale::getLocale()] : $invitationPayload['inviteeEmail']]
139+
)
140+
: __('invitation.wizard.pageTitleDescription'),
141+
]);
142+
$templateMgr->assign([
143+
'pageComponent' => 'Page',
144+
'breadcrumbs' => $breadcrumbs,
145+
'pageWidth' => TemplateManager::PAGE_WIDTH_FULL,
146+
]);
147+
$templateMgr->display('/invitation/userInvitation.tpl');
148+
}
149+
}

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

+35
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,36 @@ 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+
}
117+
118+
/**
119+
* get user working languages
120+
* @param Context $context
121+
* @param array $userLocales
122+
* @return string
123+
*/
124+
protected function transformWorkingLanguages(Context $context, array $userLocales): string
125+
{
126+
$locales = $context->getSupportedLocaleNames();
127+
return join(__('common.commaListSeparator'), array_map(fn($key) => $locales[$key], $userLocales));
128+
}
94129
}

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

+50
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@
1414

1515
namespace PKP\invitation\invitations\userRoleAssignment\resources;
1616

17+
use APP\facades\Repo;
1718
use Illuminate\Http\Request;
19+
use PKP\context\Context;
20+
use PKP\invitation\invitations\userRoleAssignment\payload\UserRoleAssignmentInvitePayload;
1821
use PKP\user\User;
1922

2023
class UserRoleAssignmentInviteResource extends BaseUserRoleAssignmentInviteResource
@@ -65,4 +68,51 @@ public function toArray(Request $request)
6568
'newUser' => $this->transformUser($newUser),
6669
]);
6770
}
71+
72+
/**
73+
* Transform invitation payload and user data
74+
* @param int|null $userId
75+
* @param array $payload
76+
* @param Context $context
77+
* @return array
78+
*/
79+
public function transformInvitationPayload(?int $userId, array $payload, Context $context): array
80+
{
81+
$invitationPayload = UserRoleAssignmentInvitePayload::fromArray($payload)->toArray();
82+
$user = null;
83+
if($userId){
84+
$user = Repo::user()->get($userId,true);
85+
$invitationPayload = UserRoleAssignmentInvitePayload::fromArray($user->getAllData())->toArray();
86+
}
87+
$invitationPayload['userId'] = $user ? $user->getId() : $userId;
88+
$invitationPayload['inviteeEmail'] = $user ? $user->getEmail() : $invitationPayload['sendEmailAddress'];
89+
$invitationPayload['country'] = $user ? $user->getCountryLocalized() : $invitationPayload['userCountry'];
90+
$invitationPayload['biography'] = $user?->getBiography(null);
91+
$invitationPayload['phone'] = $user?->getPhone();
92+
$invitationPayload['mailingAddress'] = $user?->getMailingAddress();
93+
$invitationPayload['signature'] = $user?->getSignature(null);
94+
$invitationPayload['locales'] = $user? $this->transformWorkingLanguages($context,$user->getLocales()) : null;
95+
$invitationPayload['reviewInterests'] = $user?->getInterestString();
96+
$invitationPayload['homePageUrl'] = $user?->getUrl();
97+
$invitationPayload['disabled'] = $user?->getData('disabled');
98+
$invitationPayload['userGroupsToAdd'] = !$payload['userGroupsToAdd'] ? [] : $invitationPayload['userGroupsToAdd'];
99+
$invitationPayload['currentUserGroups'] = !$userId ? [] : $this->transformCurrentUserGroups($userId,$context);
100+
$invitationPayload['userGroupsToRemove'] = [];
101+
$invitationPayload['emailComposer'] = [
102+
'emailBody' => $invitationPayload['emailBody'],
103+
'emailSubject' => $invitationPayload['emailSubject'],
104+
];
105+
106+
// removing security related data
107+
unset($invitationPayload["username"]);
108+
unset($invitationPayload["password"]);
109+
unset($invitationPayload["orcidAccessToken"]);
110+
unset($invitationPayload["orcidRefreshToken"]);
111+
unset($invitationPayload["passwordHashed"]);
112+
113+
return [
114+
'invitationPayload' => $invitationPayload,
115+
'user' => $user
116+
];
117+
}
68118
}

0 commit comments

Comments
 (0)