Completed
Pull Request — master (#97)
by Bart
05:38
created

UserGroups::getGlobalsService()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
ccs 2
cts 2
cp 1
cc 1
eloc 2
nc 1
nop 0
crap 1
1
<?php
2
3
namespace NerdsAndCompany\Schematic\Services;
4
5
use Craft\Craft;
6
use Craft\UserGroupModel;
7
8
/**
9
 * Schematic User Groups Service.
10
 *
11
 * Sync Craft Setups.
12
 *
13
 * @author    Nerds & Company
14
 * @copyright Copyright (c) 2015-2017, Nerds & Company
15
 * @license   MIT
16
 *
17
 * @link      http://www.nerds.company
18
 */
19
class UserGroups extends Base
20
{
21
    /** @var string[] */
22
    private $mappedPermissions = [];
23
24
    //==============================================================================================================
25
    //================================================  EXPORT  ====================================================
26
    //==============================================================================================================
27
28
    /**
29
     * Export user groups.
30
     *
31
     * @param UserGroupModel[] $groups
32
     *
33
     * @return array
34
     */
35 4
    public function export(array $groups = [])
36
    {
37 4
        Craft::log(Craft::t('Exporting User Groups'));
38
39 4
        $groupDefinitions = [];
40
41 4
        $this->mappedPermissions = $this->getAllMappedPermissions();
42
43 4
        foreach ($groups as $group) {
44 3
            $groupDefinitions[$group->handle] = $this->getGroupDefinition($group);
45 3
        }
46
47 3
        return $groupDefinitions;
48
    }
49
50
    /**
51
     * Get group definition.
52
     *
53
     * @param UserGroupModel $group
54
     *
55
     * @return array
56
     */
57 3
    private function getGroupDefinition(UserGroupModel $group)
58
    {
59
        return [
60 3
            'name' => $group->name,
61 3
            'permissions' => $this->getGroupPermissionDefinitions($group),
62 2
        ];
63
    }
64
65
    /**
66
     * Get group permissions.
67
     *
68
     * @param $group
69
     *
70
     * @return array|string
71
     */
72 3
    private function getGroupPermissionDefinitions($group)
73
    {
74 3
        $permissionDefinitions = [];
75 3
        $groupPermissions = Craft::app()->userPermissions->getPermissionsByGroupId($group->id);
76
77 3
        foreach ($groupPermissions as $permission) {
78 1
            if (array_key_exists($permission, $this->mappedPermissions)) {
79 1
                $permission = $this->mappedPermissions[$permission];
80 1
                $permissionDefinitions[] = Craft::app()->schematic_sources->getSource(false, $permission, 'id', 'handle');
81
            }
82 2
        }
83 2
        sort($permissionDefinitions);
84
85 2
        return $permissionDefinitions;
86
    }
87
88
    /**
89
     * Get a mapping of all permissions from lowercase to camelcase
90
     * savePermissions only accepts camelcase.
91
     *
92
     * @return array
93
     */
94 4
    private function getAllMappedPermissions()
95
    {
96 4
        $mappedPermissions = [];
97 4
        foreach (Craft::app()->userPermissions->getAllPermissions() as $permissions) {
98 4
            $mappedPermissions = array_merge($mappedPermissions, $this->getMappedPermissions($permissions));
99 4
        }
100
101 4
        return $mappedPermissions;
102
    }
103
104
    /**
105
     * @param array $permissions
106
     *
107
     * @return array
108
     */
109 4
    private function getMappedPermissions(array $permissions)
110
    {
111 4
        $mappedPermissions = [];
112 4
        foreach ($permissions as $permission => $options) {
113 4
            $mappedPermissions[strtolower($permission)] = $permission;
114 4
            if (array_key_exists('nested', $options)) {
115 4
                $mappedPermissions = array_merge($mappedPermissions, $this->getMappedPermissions($options['nested']));
116 4
            }
117 4
        }
118
119 4
        return $mappedPermissions;
120
    }
121
122
    //==============================================================================================================
123
    //================================================  IMPORT  ====================================================
124
    //==============================================================================================================
125
126
    /**
127
     * Import usergroups.
128
     *
129
     * @param array $groupDefinitions
130
     * @param bool  $force            if set to true items not in the import will be deleted
131
     *
132
     * @return Result
133
     */
134 9
    public function import(array $groupDefinitions, $force = false)
135
    {
136 9
        Craft::log(Craft::t('Importing User Groups'));
137
138 9
        $userGroups = Craft::app()->userGroups->getAllGroups('handle');
139
140 9
        foreach ($groupDefinitions as $groupHandle => $groupDefinition) {
141 6
            $group = array_key_exists($groupHandle, $userGroups) ? $userGroups[$groupHandle] : new UserGroupModel();
142
143 6
            unset($userGroups[$groupHandle]);
144
145 6
            $group->name = $groupDefinition['name'];
146 6
            $group->handle = $groupHandle;
147
148 6
            if (!Craft::app()->userGroups->saveGroup($group)) {
149 2
                $this->addErrors($group->getAllErrors());
150
151 2
                continue;
152
            }
153
154 4
            $permissions = $this->getPermissions($groupDefinition['permissions']);
155
156 2
            Craft::app()->userPermissions->saveGroupPermissions($group->id, $permissions);
157 7
        }
158
159 7
        if ($force) {
160 2
            foreach ($userGroups as $group) {
161 2
                Craft::app()->userGroups->deleteGroupById($group->id);
162 2
            }
163 2
        }
164
165 7
        return $this->getResultModel();
166
    }
167
168
    /**
169
     * Get permissions.
170
     *
171
     * @param array $permissionDefinitions
172
     *
173
     * @return array
174
     */
175 4
    private function getPermissions(array $permissionDefinitions)
176
    {
177 4
        $permissions = [];
178 4
        foreach ($permissionDefinitions as $permissionDefinition) {
179 2
            $permissions[] = Craft::app()->schematic_sources->getSource(false, $permissionDefinition, 'handle', 'id');
180 2
        }
181
182 2
        return $permissions;
183
    }
184
185
    //==============================================================================================================
186
    //===============================================  HELPERS  ====================================================
187
    //==============================================================================================================
188
189
    /**
190
     * @param BaseElementModel[] $mapping    AssetSources or Sections
191
     * @param string             $permission
192
     * @param bool               $export     is it an export or import
193
     *
194
     * @return string mapped permission
195
     */
196
    private function mapPermissionSource(array $mapping, $permission, $export)
0 ignored issues
show
Unused Code introduced by
This method is not used, and could be removed.
Loading history...
197
    {
198
        if (strpos($permission, ':') > -1) {
199
            /** @var BaseElementModel $source */
200
            $source = false;
201
            list($permissionName, $sourceId) = explode(':', $permission);
202
203
            if (isset($mapping[$sourceId])) {
204
                $source = $mapping[$sourceId];
205
            }
206
207
            if ($source) {
208
                $permission = $permissionName.':'.($export ? $source->handle : $source->id);
209
            }
210
        }
211
212
        return $permission;
213
    }
214
}
215