Skip to content

Commit 9d713d1

Browse files
authored
[User management]: handle missing properties (#1423)
* add workspaces and date time locale to user and user update * Apply php-cs-fixer changes * fix: PHP Stan
1 parent b0dc497 commit 9d713d1

10 files changed

Lines changed: 113 additions & 25 deletions

File tree

src/Role/MappedParameter/UpdateRoleParameter.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313

1414
namespace Pimcore\Bundle\StudioBackendBundle\Role\MappedParameter;
1515

16+
use Pimcore\Bundle\StudioBackendBundle\User\Schema\UserDataObjectWorkspace;
17+
use Pimcore\Bundle\StudioBackendBundle\User\Schema\UserDocumentWorkspace;
1618
use Pimcore\Bundle\StudioBackendBundle\User\Schema\UserWorkspace;
1719
use Symfony\Component\Validator\Constraints\NotBlank;
1820

@@ -75,15 +77,15 @@ public function getAssetWorkspaces(): array
7577
}
7678

7779
/**
78-
* @return UserWorkspace[]
80+
* @return UserDataObjectWorkspace[]
7981
*/
8082
public function getDataObjectWorkspaces(): array
8183
{
8284
return $this->dataObjectWorkspaces;
8385
}
8486

8587
/**
86-
* @return UserWorkspace[]
88+
* @return UserDocumentWorkspace[]
8789
*/
8890
public function getDocumentWorkspaces(): array
8991
{

src/User/Hydrator/UserHydrator.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Pimcore\Bundle\StudioBackendBundle\User\Service\ObjectDependenciesServiceInterface;
1919
use Pimcore\Bundle\StudioBackendBundle\User\Service\UserPerspectiveServiceInterface;
2020
use Pimcore\Bundle\StudioBackendBundle\Util\Trait\PermissionSanitationTrait;
21+
use Pimcore\Model\User;
2122
use Pimcore\Model\UserInterface;
2223

2324
/**
@@ -54,6 +55,7 @@ classes: $user->getClasses(),
5455
hasImage: $user->hasImage(),
5556
keyBindings: $this->keyBindingService->hydrateKeyBindings($user->getKeyBindings()),
5657
language: $user->getLanguage(),
58+
dateTimeLocale: $user instanceof User ? $user->getDateTimeLocale() : '',
5759
lastLogin: $user->getLastLogin(),
5860
memorizeTabs: $user->getMemorizeTabs(),
5961
parentId: $user->getParentId(),

src/User/Hydrator/WorkspaceHydrator.php

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
use Pimcore\Model\User\UserRoleInterface;
2020
use Pimcore\Model\User\Workspace\AbstractWorkspace;
2121
use Pimcore\Model\UserInterface;
22+
use function is_string;
2223

2324
/**
2425
* @internal
@@ -48,9 +49,9 @@ public function hydrateDataObjectWorkspace(UserInterface|UserRoleInterface $user
4849
$workspaces[] = new UserDataObjectWorkspace(
4950
$workspace->getSave(),
5051
$workspace->getUnpublish(),
51-
$workspace->getLEdit(),
52-
$workspace->getLView(),
53-
$workspace->getLayouts(),
52+
$this->transformLocalizedValues($workspace->getLEdit()),
53+
$this->transformLocalizedValues($workspace->getLView()),
54+
$this->transformLocalizedValues($workspace->getLayouts()),
5455
...$this->hydrateBaseWorkspace($workspace)
5556
);
5657
}
@@ -91,4 +92,18 @@ private function hydrateBaseWorkspace(AbstractWorkspace $workspace): array
9192
$workspace->getProperties(),
9293
];
9394
}
95+
96+
private function transformLocalizedValues(?string $workspaceValue): ?array
97+
{
98+
if (!is_string($workspaceValue)) {
99+
return null;
100+
}
101+
102+
return array_values(
103+
array_filter(
104+
explode(',', $workspaceValue),
105+
static fn (string $v): bool => $v !== ''
106+
)
107+
);
108+
}
94109
}

src/User/MappedParameter/UpdateUserParameter.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@
1414
namespace Pimcore\Bundle\StudioBackendBundle\User\MappedParameter;
1515

1616
use Pimcore\Bundle\StudioBackendBundle\User\Schema\KeyBinding;
17+
use Pimcore\Bundle\StudioBackendBundle\User\Schema\UserDataObjectWorkspace;
18+
use Pimcore\Bundle\StudioBackendBundle\User\Schema\UserDocumentWorkspace;
1719
use Pimcore\Bundle\StudioBackendBundle\User\Schema\UserWorkspace;
1820
use Symfony\Component\Validator\Constraints\NotBlank;
1921
use Symfony\Component\Validator\Constraints\PositiveOrZero;
@@ -36,6 +38,7 @@ public function __construct(
3638
private array $keyBindings,
3739
#[NotBlank(message: 'Language is required')]
3840
private string $language,
41+
private ?string $dateTimeLocale,
3942
private bool $memorizeTabs,
4043
#[PositiveOrZero(message: 'ParentId must be a positive integer')]
4144
#[NotBlank(message: 'ParentId is required')]
@@ -111,6 +114,11 @@ public function getLanguage(): string
111114
return $this->language;
112115
}
113116

117+
public function getDateTimeLocale(): ?string
118+
{
119+
return $this->dateTimeLocale;
120+
}
121+
114122
public function isMemorizeTabs(): bool
115123
{
116124
return $this->memorizeTabs;
@@ -160,15 +168,15 @@ public function getAssetWorkspaces(): array
160168
}
161169

162170
/**
163-
* @return UserWorkspace[]
171+
* @return UserDataObjectWorkspace[]
164172
*/
165173
public function getDataObjectWorkspaces(): array
166174
{
167175
return $this->dataObjectWorkspaces;
168176
}
169177

170178
/**
171-
* @return UserWorkspace[]
179+
* @return UserDocumentWorkspace[]
172180
*/
173181
public function getDocumentWorkspaces(): array
174182
{

src/User/Schema/UpdateUser.php

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
title: 'User',
2626
description: 'User Schema to update a User.',
2727
required: [
28+
'email', 'firstname', 'lastname', 'admin',
2829
'active', 'classes', 'closeWarning', 'allowDirtyClose', 'contentLanguages', 'keyBindings',
2930
'language', 'memorizeTabs', 'parentId', 'permissions', 'roles', 'twoFactorAuthenticationRequired',
3031
'websiteTranslationLanguagesEdit', 'websiteTranslationLanguagesView', 'welcomeScreen',
@@ -61,6 +62,8 @@ public function __construct(
6162
private array $keyBindings,
6263
#[Property(description: 'Language of the User', type: 'string', example: 'de')]
6364
private string $language,
65+
#[Property(description: 'Date Time Locale for the User', type: 'string', example: '')]
66+
private string $dateTimeLocale,
6467
#[Property(description: 'Memorize Tabs', type: 'boolean', example: true)]
6568
private bool $memorizeTabs,
6669
#[Property(description: 'Parent ID', type: 'integer', example: 2)]
@@ -145,6 +148,11 @@ public function getLanguage(): string
145148
return $this->language;
146149
}
147150

151+
public function getDateTimeLocale(): string
152+
{
153+
return $this->dateTimeLocale;
154+
}
155+
148156
public function isMemorizeTabs(): bool
149157
{
150158
return $this->memorizeTabs;
@@ -199,15 +207,15 @@ public function getAssetWorkspaces(): array
199207
}
200208

201209
/**
202-
* @return UserWorkspace[]
210+
* @return UserDataObjectWorkspace[]
203211
*/
204212
public function getDataObjectWorkspaces(): array
205213
{
206214
return $this->dataObjectWorkspaces;
207215
}
208216

209217
/**
210-
* @return UserWorkspace[]
218+
* @return UserDocumentWorkspace[]
211219
*/
212220
public function getDocumentWorkspaces(): array
213221
{

src/User/Schema/User.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@
2424
title: 'User',
2525
description: 'Contains all information about a user',
2626
required: [
27-
'id', 'active', 'admin', 'classes', 'closeWarning', 'allowDirtyClose', 'contentLanguages', 'hasImage',
27+
'id', 'name', 'email', 'firstname', 'lastname', 'active', 'admin',
28+
'classes', 'closeWarning', 'allowDirtyClose', 'contentLanguages', 'hasImage',
2829
'keyBindings', 'language', 'memorizeTabs', 'parentId', 'permissions', 'roles',
2930
'twoFactorAuthentication', 'websiteTranslationLanguagesEdit', 'websiteTranslationLanguagesView',
3031
'welcomeScreen', 'assetWorkspaces', 'dataObjectWorkspaces', 'documentWorkspaces', 'objectDependencies',
@@ -69,6 +70,8 @@ public function __construct(
6970
private readonly array $keyBindings,
7071
#[Property(description: 'Language of the User', type: 'string', example: 'de')]
7172
private readonly string $language,
73+
#[Property(description: 'Locale for dateTime', type: 'string', example: '')]
74+
private readonly ?string $dateTimeLocale,
7275
#[Property(description: 'Timestamp of the last login', type: 'integer', example: '1718757677')]
7376
private readonly ?int $lastLogin,
7477
#[Property(description: 'Memorize Tabs', type: 'boolean', example: true)]
@@ -184,6 +187,11 @@ public function getLanguage(): string
184187
return $this->language;
185188
}
186189

190+
public function getDateTimeLocale(): ?string
191+
{
192+
return $this->dateTimeLocale;
193+
}
194+
187195
public function getLastLogin(): ?int
188196
{
189197
return $this->lastLogin;

src/User/Schema/UserDataObjectWorkspace.php

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ public function __construct(
2929
#[Property(description: 'Unpublish', type: 'bool', example: true)]
3030
private bool $unpublish,
3131
#[Property(description: 'Localized Edit', type: 'string', example: 'default')]
32-
private ?string $localizedEdit,
32+
private ?array $localizedEdit,
3333
#[Property(description: 'Localized View', type: 'string', example: 'default')]
34-
private ?string $localizedView,
34+
private ?array $localizedView,
3535
#[Property(description: 'Layouts', type: 'string', example: 'CAR')]
36-
private ?string $layouts,
36+
private ?array $layouts,
3737
private int $cid,
3838
private string $cpath,
3939
private bool $list,
@@ -71,17 +71,17 @@ public function isUnpublish(): bool
7171
return $this->unpublish;
7272
}
7373

74-
public function getLocalizedEdit(): ?string
74+
public function getLocalizedEdit(): ?array
7575
{
7676
return $this->localizedEdit;
7777
}
7878

79-
public function getLocalizedView(): ?string
79+
public function getLocalizedView(): ?array
8080
{
8181
return $this->localizedView;
8282
}
8383

84-
public function getLayouts(): ?string
84+
public function getLayouts(): ?array
8585
{
8686
return $this->layouts;
8787
}

src/User/Service/UpdateService.php

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,11 @@
1919
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\ParseException;
2020
use Pimcore\Bundle\StudioBackendBundle\Role\Repository\RoleRepositoryInterface;
2121
use Pimcore\Bundle\StudioBackendBundle\User\Repository\PermissionRepositoryInterface;
22+
use Pimcore\Bundle\StudioBackendBundle\User\Schema\UserDataObjectWorkspace;
23+
use Pimcore\Bundle\StudioBackendBundle\User\Schema\UserDocumentWorkspace;
2224
use Pimcore\Bundle\StudioBackendBundle\User\Schema\UserWorkspace;
2325
use Pimcore\Model\Element\ElementInterface;
2426
use Pimcore\Model\User\UserRoleInterface;
25-
use Pimcore\Model\User\Workspace\AbstractWorkspace;
2627
use Pimcore\Model\User\Workspace\Asset as AssetWorkspace;
2728
use Pimcore\Model\User\Workspace\DataObject as DataObjectWorkspace;
2829
use Pimcore\Model\User\Workspace\Document as DocumentWorkspace;
@@ -152,7 +153,7 @@ public function updateAssetWorkspaces(
152153
/**
153154
* @template T of UserInterface|UserRoleInterface
154155
*
155-
* @param UserWorkspace[] $objectWorkspacesToSet
156+
* @param UserDataObjectWorkspace[] $objectWorkspacesToSet
156157
* @param T $user
157158
*
158159
* @throws ParseException
@@ -169,12 +170,14 @@ public function updateDataObjectWorkspaces(
169170
foreach ($objectWorkspacesToSet as $workspace) {
170171
$element = $this->elementServiceResolver->getElementByPath('object', $workspace->getCpath());
171172
if ($element) {
172-
$workspaces[] = $this->setWorkspaceValues(
173+
$hydrated = $this->setWorkspaceValues(
173174
$workspace,
174175
$element,
175176
new DataObjectWorkspace(),
176177
$user->getId()
177178
);
179+
180+
$workspaces[] = $this->setDataObjectWorkspaceValues($workspace, $hydrated);
178181
}
179182
}
180183

@@ -187,7 +190,7 @@ public function updateDataObjectWorkspaces(
187190
/**
188191
* @template T of UserInterface|UserRoleInterface
189192
*
190-
* @param UserWorkspace[] $documentWorkspacesToSet
193+
* @param UserDocumentWorkspace[] $documentWorkspacesToSet
191194
* @param T $user
192195
*
193196
* @throws ParseException
@@ -204,12 +207,14 @@ public function updateDocumentWorkspaces(
204207
foreach ($documentWorkspacesToSet as $workspace) {
205208
$element = $this->elementServiceResolver->getElementByPath('document', $workspace->getCpath());
206209
if ($element) {
207-
$workspaces[] = $this->setWorkspaceValues(
210+
$hydrated = $this->setWorkspaceValues(
208211
$workspace,
209212
$element,
210213
new DocumentWorkspace(),
211214
$user->getId()
212215
);
216+
217+
$workspaces[] = $this->setDocumentWorkspaceValues($workspace, $hydrated);
213218
}
214219
}
215220

@@ -256,9 +261,9 @@ private function checkForDuplicateWorkspaces(array $assetWorkspacesToSet): void
256261
private function setWorkspaceValues(
257262
UserWorkspace $params,
258263
ElementInterface $element,
259-
AbstractWorkspace $workspace,
264+
AssetWorkspace|DataObjectWorkspace|DocumentWorkspace $workspace,
260265
int $userId
261-
): AbstractWorkspace {
266+
): AssetWorkspace|DataObjectWorkspace|DocumentWorkspace {
262267
$workspace->setUserId($userId);
263268
$workspace->setCpath($element->getRealFullPath());
264269
$workspace->setCid($element->getId());
@@ -274,4 +279,39 @@ private function setWorkspaceValues(
274279

275280
return $workspace;
276281
}
282+
283+
private function setDataObjectWorkspaceValues(
284+
UserDataObjectWorkspace $params,
285+
DataObjectWorkspace $workspace
286+
): DataObjectWorkspace {
287+
$hydrated = $this->setSpecialWorkspaceValues($params, $workspace);
288+
$hydrated->setLEdit($this->transformLocalizedValues($params->getLocalizedEdit()));
289+
$hydrated->setLView($this->transformLocalizedValues($params->getLocalizedView()));
290+
$hydrated->setLayouts($this->transformLocalizedValues($params->getLayouts()));
291+
292+
return $hydrated;
293+
}
294+
295+
private function setDocumentWorkspaceValues(
296+
UserDocumentWorkspace $params,
297+
DocumentWorkspace $workspace
298+
): DocumentWorkspace {
299+
300+
return $this->setSpecialWorkspaceValues($params, $workspace);
301+
}
302+
303+
private function setSpecialWorkspaceValues(
304+
UserDocumentWorkspace|UserDataObjectWorkspace $params,
305+
DataObjectWorkspace|DocumentWorkspace $workspace
306+
): DataObjectWorkspace|DocumentWorkspace {
307+
$workspace->setUnpublish($params->isUnpublish());
308+
$workspace->setSave($params->isSave());
309+
310+
return $workspace;
311+
}
312+
313+
private function transformLocalizedValues(?array $workspaceValue): ?string
314+
{
315+
return empty($workspaceValue) ? null : implode(',', $workspaceValue);
316+
}
277317
}

src/User/Service/UpdateServiceInterface.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515

1616
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\NotFoundException;
1717
use Pimcore\Bundle\StudioBackendBundle\Exception\Api\ParseException;
18+
use Pimcore\Bundle\StudioBackendBundle\User\Schema\UserDataObjectWorkspace;
19+
use Pimcore\Bundle\StudioBackendBundle\User\Schema\UserDocumentWorkspace;
1820
use Pimcore\Bundle\StudioBackendBundle\User\Schema\UserWorkspace;
1921
use Pimcore\Model\User\UserRoleInterface;
2022
use Pimcore\Model\UserInterface;
@@ -75,7 +77,7 @@ public function updateAssetWorkspaces(
7577
/**
7678
* @template T of UserInterface|UserRoleInterface
7779
*
78-
* @param UserWorkspace[] $objectWorkspacesToSet
80+
* @param UserDataObjectWorkspace[] $objectWorkspacesToSet
7981
* @param T $user
8082
*
8183
* @throws ParseException
@@ -90,7 +92,7 @@ public function updateDataObjectWorkspaces(
9092
/**
9193
* @template T of UserInterface|UserRoleInterface
9294
*
93-
* @param UserWorkspace[] $documentWorkspacesToSet
95+
* @param UserDocumentWorkspace[] $documentWorkspacesToSet
9496
* @param T $user
9597
*
9698
* @throws ParseException

src/User/Service/UserUpdateService.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,9 @@ public function updateUserById(UpdateUserParameter $updateUserParameter, int $us
8282
$user->setKeyBindings(
8383
$this->getKeyBindingsString($updateUserParameter->getKeyBindings())
8484
);
85+
if ($user instanceof User) {
86+
$user->setDatetimeLocale($updateUserParameter->getDatetimeLocale());
87+
}
8588

8689
$user = $this->updateService->updatePermissions($updateUserParameter->getPermissions(), $user);
8790
$user = $this->updateService->updateRoles($updateUserParameter->getRoles(), $user);

0 commit comments

Comments
 (0)