|
1
|
|
|
<?php |
|
2
|
|
|
|
|
3
|
|
|
namespace Kaliop\eZMigrationBundle\Core\Executor; |
|
4
|
|
|
|
|
5
|
|
|
use eZ\Publish\API\Repository\Values\Content\Content; |
|
6
|
|
|
use Kaliop\eZMigrationBundle\Core\Matcher\UserGroupMatcher; |
|
7
|
|
|
use Kaliop\eZMigrationBundle\API\Collection\UserGroupCollection; |
|
8
|
|
|
use Kaliop\eZMigrationBundle\Core\Matcher\RoleMatcher; |
|
9
|
|
|
use Kaliop\eZMigrationBundle\Core\Matcher\SectionMatcher; |
|
10
|
|
|
|
|
11
|
|
|
/** |
|
12
|
|
|
* Handles user-group migrations. |
|
13
|
|
|
*/ |
|
14
|
|
|
class UserGroupManager extends RepositoryExecutor |
|
15
|
|
|
{ |
|
16
|
|
|
protected $supportedStepTypes = array('user_group'); |
|
17
|
1 |
|
|
|
18
|
|
|
protected $userGroupMatcher; |
|
19
|
1 |
|
protected $roleMatcher; |
|
20
|
|
|
protected $sectionMatcher; |
|
21
|
1 |
|
|
|
22
|
1 |
|
public function __construct(UserGroupMatcher $userGroupMatcher, RoleMatcher $roleMatcher, SectionMatcher $sectionMatcher) |
|
23
|
|
|
{ |
|
24
|
|
|
$this->userGroupMatcher = $userGroupMatcher; |
|
25
|
|
|
$this->roleMatcher = $roleMatcher; |
|
26
|
1 |
|
$this->sectionMatcher = $sectionMatcher; |
|
27
|
|
|
} |
|
28
|
1 |
|
|
|
29
|
|
|
/** |
|
30
|
1 |
|
* Method to handle the create operation of the migration instructions |
|
31
|
1 |
|
*/ |
|
32
|
|
|
protected function create($step) |
|
33
|
1 |
|
{ |
|
34
|
1 |
|
$userService = $this->repository->getUserService(); |
|
35
|
1 |
|
|
|
36
|
|
|
$parentGroupId = $step->dsl['parent_group_id']; |
|
37
|
1 |
|
$parentGroupId = $this->referenceResolver->resolveReference($parentGroupId); |
|
38
|
|
|
$parentGroup = $this->userGroupMatcher->matchOneByKey($parentGroupId); |
|
39
|
1 |
|
|
|
40
|
1 |
|
$contentType = $this->repository->getContentTypeService()->loadContentTypeByIdentifier("user_group"); |
|
41
|
1 |
|
|
|
42
|
1 |
|
$userGroupCreateStruct = $userService->newUserGroupCreateStruct($this->getLanguageCode($step), $contentType); |
|
43
|
1 |
|
$userGroupCreateStruct->setField('name', $step->dsl['name']); |
|
44
|
1 |
|
|
|
45
|
|
|
if (isset($step->dsl['remote_id'])) { |
|
46
|
|
|
$userGroupCreateStruct->remoteId = $step->dsl['remote_id']; |
|
47
|
|
|
} |
|
48
|
1 |
|
|
|
49
|
1 |
|
if (isset($step->dsl['description'])) { |
|
50
|
1 |
|
$userGroupCreateStruct->setField('description', $step->dsl['description']); |
|
51
|
|
|
} |
|
52
|
|
|
|
|
53
|
|
View Code Duplication |
if (isset($step->dsl['section'])) { |
|
|
|
|
|
|
54
|
|
|
$sectionKey = $this->referenceResolver->resolveReference($step->dsl['section']); |
|
55
|
1 |
|
$section = $this->sectionMatcher->matchOneByKey($sectionKey); |
|
56
|
1 |
|
$userGroupCreateStruct->sectionId = $section->id; |
|
57
|
|
|
} |
|
58
|
|
|
|
|
59
|
|
|
$userGroup = $userService->createUserGroup($userGroupCreateStruct, $parentGroup); |
|
60
|
|
|
|
|
61
|
|
|
if (isset($step->dsl['roles'])) { |
|
62
|
|
|
$roleService = $this->repository->getRoleService(); |
|
63
|
1 |
|
// we support both Ids and Identifiers |
|
64
|
|
View Code Duplication |
foreach ($step->dsl['roles'] as $roleId) { |
|
|
|
|
|
|
65
|
1 |
|
$roleId = $this->referenceResolver->resolveReference($roleId); |
|
66
|
|
|
$role = $this->roleMatcher->matchOneByKey($roleId); |
|
67
|
|
|
$roleService->assignRoleToUserGroup($role, $userGroup); |
|
68
|
|
|
} |
|
69
|
1 |
|
} |
|
70
|
1 |
|
|
|
71
|
|
|
$this->setReferences($userGroup, $step); |
|
72
|
1 |
|
|
|
73
|
1 |
|
return $userGroup; |
|
74
|
1 |
|
} |
|
75
|
1 |
|
|
|
76
|
|
|
/** |
|
77
|
1 |
|
* Method to handle the update operation of the migration instructions |
|
78
|
|
|
* |
|
79
|
|
|
* @throws \Exception When the ID of the user group is missing from the migration definition. |
|
80
|
1 |
|
*/ |
|
81
|
|
|
protected function update($step) |
|
82
|
|
|
{ |
|
83
|
1 |
|
$userGroupCollection = $this->matchUserGroups('update', $step); |
|
84
|
|
|
|
|
85
|
1 |
|
if (count($userGroupCollection) > 1 && isset($step->dsl['references'])) { |
|
86
|
1 |
|
throw new \Exception("Can not execute Group update because multiple groups match, and a references section is specified in the dsl. References can be set when only 1 group matches"); |
|
87
|
1 |
|
} |
|
88
|
|
|
|
|
89
|
1 |
|
$userService = $this->repository->getUserService(); |
|
90
|
1 |
|
$contentService = $this->repository->getContentService(); |
|
91
|
1 |
|
|
|
92
|
|
|
foreach ($userGroupCollection as $key => $userGroup) { |
|
|
|
|
|
|
93
|
1 |
|
|
|
94
|
|
|
/** @var $updateStruct \eZ\Publish\API\Repository\Values\User\UserGroupUpdateStruct */ |
|
95
|
1 |
|
$updateStruct = $userService->newUserGroupUpdateStruct(); |
|
96
|
|
|
|
|
97
|
1 |
|
/** @var $contentUpdateStruct \eZ\Publish\API\Repository\Values\Content\ContentUpdateStruct */ |
|
98
|
1 |
|
$contentUpdateStruct = $contentService->newContentUpdateStruct(); |
|
99
|
1 |
|
|
|
100
|
|
|
if (isset($step->dsl['name'])) { |
|
101
|
|
|
$contentUpdateStruct->setField('name', $step->dsl['name']); |
|
102
|
|
|
} |
|
103
|
1 |
|
|
|
104
|
|
|
if (isset($step->dsl['remote_id'])) { |
|
105
|
|
|
$contentUpdateStruct->remoteId = $step->dsl['remote_id']; |
|
106
|
1 |
|
} |
|
107
|
1 |
|
|
|
108
|
|
|
if (isset($step->dsl['description'])) { |
|
109
|
1 |
|
$contentUpdateStruct->setField('description', $step->dsl['description']); |
|
110
|
1 |
|
} |
|
111
|
|
|
|
|
112
|
|
|
$updateStruct->contentUpdateStruct = $contentUpdateStruct; |
|
113
|
|
|
|
|
114
|
|
|
$userGroup = $userService->updateUserGroup($userGroup, $updateStruct); |
|
115
|
|
|
|
|
116
|
|
|
if (isset($step->dsl['parent_group_id'])) { |
|
117
|
1 |
|
$parentGroupId = $step->dsl['parent_group_id']; |
|
118
|
|
|
$parentGroupId = $this->referenceResolver->resolveReference($parentGroupId); |
|
119
|
1 |
|
$newParentGroup = $this->userGroupMatcher->matchOneByKey($parentGroupId); |
|
120
|
|
|
|
|
121
|
|
|
// Move group to new parent |
|
122
|
|
|
$userService->moveUserGroup($userGroup, $newParentGroup); |
|
123
|
1 |
|
} |
|
124
|
|
|
|
|
125
|
|
|
if (isset($step->dsl['section'])) { |
|
126
|
|
|
$this->setSection($userGroup, $step->dsl['section']); |
|
127
|
1 |
|
} |
|
128
|
|
|
|
|
129
|
|
|
$userGroupCollection[$key] = $userGroup; |
|
130
|
1 |
|
} |
|
131
|
1 |
|
|
|
132
|
1 |
|
$this->setReferences($userGroupCollection, $step); |
|
|
|
|
|
|
133
|
1 |
|
|
|
134
|
|
|
return $userGroupCollection; |
|
135
|
1 |
|
} |
|
136
|
|
|
|
|
137
|
1 |
|
/** |
|
138
|
1 |
|
* Method to handle the delete operation of the migration instructions |
|
139
|
1 |
|
* |
|
140
|
|
|
* @throws \Exception When there are no groups specified for deletion. |
|
141
|
1 |
|
*/ |
|
142
|
1 |
|
protected function delete($step) |
|
143
|
1 |
|
{ |
|
144
|
1 |
|
$userGroupCollection = $this->matchUserGroups('delete', $step); |
|
145
|
|
|
|
|
146
|
|
|
$userService = $this->repository->getUserService(); |
|
147
|
|
|
|
|
148
|
|
|
foreach ($userGroupCollection as $userGroup) { |
|
|
|
|
|
|
149
|
|
|
$userService->deleteUserGroup($userGroup); |
|
150
|
|
|
} |
|
151
|
|
|
|
|
152
|
|
|
return $userGroupCollection; |
|
153
|
1 |
|
} |
|
154
|
|
|
|
|
155
|
1 |
|
/** |
|
156
|
1 |
|
* @param string $action |
|
157
|
1 |
|
* @return UserGroupCollection |
|
158
|
|
|
* @throws \Exception |
|
159
|
1 |
|
*/ |
|
160
|
|
View Code Duplication |
protected function matchUserGroups($action, $step) |
|
|
|
|
|
|
161
|
1 |
|
{ |
|
162
|
1 |
|
if (!isset($step->dsl['id']) && !isset($step->dsl['group']) && !isset($step->dsl['match'])) { |
|
163
|
1 |
|
throw new \Exception("The id of a user group or a match condition is required to $action it"); |
|
164
|
1 |
|
} |
|
165
|
1 |
|
|
|
166
|
1 |
|
// Backwards compat |
|
167
|
|
|
if (isset($step->dsl['match'])) { |
|
168
|
|
|
$match = $step->dsl['match']; |
|
169
|
1 |
|
} else { |
|
170
|
|
|
if (isset($step->dsl['id'])) { |
|
171
|
1 |
|
$match = array('id' => $step->dsl['id']); |
|
172
|
1 |
|
} |
|
173
|
|
|
if (isset($step->dsl['group'])) { |
|
174
|
1 |
|
$match = array('id' => $step->dsl['group']); |
|
175
|
|
|
} |
|
176
|
|
|
} |
|
177
|
|
|
|
|
178
|
|
|
// convert the references passed in the match |
|
179
|
|
|
$match = $this->resolveReferencesRecursively($match); |
|
|
|
|
|
|
180
|
|
|
|
|
181
|
|
|
return $this->userGroupMatcher->match($match); |
|
182
|
|
|
} |
|
183
|
|
|
|
|
184
|
|
|
/** |
|
185
|
|
|
* Set references defined in the DSL for use in another step during the migrations. |
|
186
|
|
|
* |
|
187
|
|
|
* @throws \InvalidArgumentException When trying to set a reference to an unsupported attribute |
|
188
|
|
|
* @param \eZ\Publish\API\Repository\Values\User\UserGroup|UserGroupCollection $userGroup |
|
189
|
|
|
* @return boolean |
|
190
|
|
|
*/ |
|
191
|
|
View Code Duplication |
protected function setReferences($userGroup, $step) |
|
|
|
|
|
|
192
|
|
|
{ |
|
193
|
|
|
if (!array_key_exists('references', $step->dsl)) { |
|
194
|
|
|
return false; |
|
195
|
|
|
} |
|
196
|
|
|
|
|
197
|
|
|
if ($userGroup instanceof UserGroupCollection) { |
|
198
|
|
|
if (count($userGroup) > 1) { |
|
199
|
|
|
throw new \InvalidArgumentException('UserGroup Manager does not support setting references for creating/updating of multiple groups'); |
|
200
|
|
|
} |
|
201
|
|
|
$userGroup = reset($userGroup); |
|
202
|
|
|
} |
|
203
|
|
|
|
|
204
|
|
|
foreach ($step->dsl['references'] as $reference) { |
|
205
|
|
|
|
|
206
|
|
|
switch ($reference['attribute']) { |
|
207
|
|
|
case 'object_id': |
|
208
|
|
|
case 'content_id': |
|
209
|
|
|
case 'user_group_id': |
|
210
|
|
|
case 'id': |
|
211
|
|
|
$value = $userGroup->id; |
|
212
|
|
|
break; |
|
213
|
|
|
default: |
|
214
|
|
|
throw new \InvalidArgumentException('User Group Manager does not support setting references for attribute ' . $reference['attribute']); |
|
215
|
|
|
} |
|
216
|
|
|
|
|
217
|
|
|
$overwrite = false; |
|
218
|
|
|
if (isset($reference['overwrite'])) { |
|
219
|
|
|
$overwrite = $reference['overwrite']; |
|
220
|
|
|
} |
|
221
|
|
|
$this->referenceResolver->addReference($reference['identifier'], $value, $overwrite); |
|
222
|
|
|
} |
|
223
|
|
|
|
|
224
|
|
|
return true; |
|
225
|
|
|
} |
|
226
|
|
|
|
|
227
|
|
View Code Duplication |
protected function setSection(Content $content, $sectionKey) |
|
|
|
|
|
|
228
|
|
|
{ |
|
229
|
|
|
$sectionKey = $this->referenceResolver->resolveReference($sectionKey); |
|
230
|
|
|
$section = $this->sectionMatcher->matchOneByKey($sectionKey); |
|
231
|
|
|
|
|
232
|
|
|
$sectionService = $this->repository->getSectionService(); |
|
233
|
|
|
$sectionService->assignSection($content->contentInfo, $section); |
|
234
|
|
|
} |
|
235
|
|
|
} |
|
236
|
|
|
|
Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.
You can also find more detailed suggestions in the “Code” section of your repository.