Completed
Pull Request — master (#114)
by Bart
08:31
created

UserGroups::import()   B

Complexity

Conditions 6
Paths 10

Size

Total Lines 33
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 20
CRAP Score 6

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 33
ccs 20
cts 20
cp 1
rs 8.439
cc 6
eloc 17
nc 10
nop 2
crap 6
1
<?php
2
3
namespace NerdsAndCompany\Schematic\Services;
4
5
use Craft;
6
use craft\base\Model;
7
use craft\models\UserGroup;
8
9
/**
10
 * Schematic User Groups Service.
11
 *
12
 * Sync Craft Setups.
13
 *
14
 * @author    Nerds & Company
15
 * @copyright Copyright (c) 2015-2018, Nerds & Company
16
 * @license   MIT
17
 *
18
 * @see      http://www.nerds.company
19
 */
20
class UserGroups extends Base
21
{
22
    /** @var string[] */
23
    private $mappedPermissions = [];
24
25
    //==============================================================================================================
26
    //================================================  EXPORT  ====================================================
27
    //==============================================================================================================
28
29
    /**
30
     * Get all section records
31
     *
32
     * @return UserGroup[]
33
     */
34
    protected function getRecords()
35 4
    {
36
        $this->mappedPermissions = $this->getAllMappedPermissions();
37 4
38
        return Craft::$app->userGroups->getAllGroups();
39 4
    }
40
41 4
    /**
42
     * {@inheritdoc}
43 4
     */
44 3
    protected function getRecordDefinition(Model $record)
45 4
    {
46
        $attributes = parent::getRecordDefinition($record);
47 4
        $attributes['permissions'] = $this->getGroupPermissionDefinitions($record);
48
        return $attributes;
49
    }
50
51
    /**
52
     * Get group permissions.
53
     *
54
     * @param $group
55
     *
56
     * @return array|string
57 3
     */
58
    private function getGroupPermissionDefinitions($group)
59
    {
60 3
        $permissionDefinitions = [];
61 3
        $groupPermissions = Craft::$app->userPermissions->getPermissionsByGroupId($group->id);
62 3
63
        foreach ($groupPermissions as $permission) {
64
            if (array_key_exists($permission, $this->mappedPermissions)) {
65
                $permission = $this->mappedPermissions[$permission];
66
                $permissionDefinitions[] = $this->getSource(false, $permission, 'id', 'handle');
0 ignored issues
show
Documentation Bug introduced by
The method getSource does not exist on object<NerdsAndCompany\S...ic\Services\UserGroups>? Since you implemented __call, maybe consider adding a @method annotation.

If you implement __call and you know which methods are available, you can improve IDE auto-completion and static analysis by adding a @method annotation to the class.

This is often the case, when __call is implemented by a parent class and only the child class knows which methods exist:

class ParentClass {
    private $data = array();

    public function __call($method, array $args) {
        if (0 === strpos($method, 'get')) {
            return $this->data[strtolower(substr($method, 3))];
        }

        throw new \LogicException(sprintf('Unsupported method: %s', $method));
    }
}

/**
 * If this class knows which fields exist, you can specify the methods here:
 *
 * @method string getName()
 */
class SomeClass extends ParentClass { }
Loading history...
67
            }
68
        }
69
        sort($permissionDefinitions);
70
71
        return $permissionDefinitions;
72 3
    }
73
74 3
    /**
75 3
     * Get a mapping of all permissions from lowercase to camelcase
76
     * savePermissions only accepts camelcase.
77 3
     *
78 1
     * @return array
79 1
     */
80 1
    private function getAllMappedPermissions()
81 1
    {
82 3
        $mappedPermissions = [];
83 3
        foreach (Craft::$app->userPermissions->getAllPermissions() as $permissions) {
84
            $mappedPermissions = array_merge($mappedPermissions, $this->getMappedPermissions($permissions));
85 3
        }
86
87
        return $mappedPermissions;
88
    }
89
90
    /**
91
     * @param array $permissions
92
     *
93
     * @return array
94 4
     */
95
    private function getMappedPermissions(array $permissions)
96 4
    {
97 4
        $mappedPermissions = [];
98 4
        foreach ($permissions as $permission => $options) {
99 4
            $mappedPermissions[strtolower($permission)] = $permission;
100
            if (array_key_exists('nested', $options)) {
101 4
                $mappedPermissions = array_merge($mappedPermissions, $this->getMappedPermissions($options['nested']));
102
            }
103
        }
104
105
        return $mappedPermissions;
106
    }
107
108
    //==============================================================================================================
109 4
    //================================================  IMPORT  ====================================================
110
    //==============================================================================================================
111 4
112 4
    /**
113 4
     * {@inheritdoc}
114 4
     */
115 4
    protected function saveRecord(Model $record, array $definition)
116 4
    {
117 4
        Schematic::warning('Importing usergroup permissions is not yet implemented');
118
        return Craft::$app->userGroups->saveGroup($record);
119 4
    }
120
121
    /**
122
     * {@inheritdoc}
123
     */
124
    protected function deleteRecord(Model $record)
125
    {
126
        return Craft::$app->userGroups->deleteGroup($record);
127
    }
128
}
129