RolesSeeder   A
last analyzed

Complexity

Total Complexity 7

Size/Duplication

Total Lines 96
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 8

Test Coverage

Coverage 0%

Importance

Changes 0
Metric Value
wmc 7
lcom 1
cbo 8
dl 0
loc 96
ccs 0
cts 32
cp 0
rs 10
c 0
b 0
f 0

5 Methods

Rating   Name   Duplication   Size   Complexity  
A seed() 0 8 1
A prepareRoles() 0 14 1
A syncAdminRole() 0 8 1
A slugify() 0 4 1
A syncRoles() 0 18 3
1
<?php namespace Arcanesoft\Auth\Seeds;
2
3
use Arcanedev\Support\Database\Seeder;
4
use Arcanesoft\Auth\Models\Permission;
5
use Arcanesoft\Auth\Models\Role;
6
use Illuminate\Support\Str;
7
8
/**
9
 * Class     RolesSeeder
10
 *
11
 * @package  Arcanesoft\Auth\Seeds
12
 * @author   ARCANEDEV <[email protected]>
13
 */
14
abstract class RolesSeeder extends Seeder
15
{
16
    /* -----------------------------------------------------------------
17
     |  Main Methods
18
     | -----------------------------------------------------------------
19
     */
20
21
    /**
22
     * Seed roles.
23
     *
24
     * @param  array  $roles
25
     */
26
    public function seed(array $roles)
27
    {
28
        Role::query()->insert(
29
            $this->prepareRoles($roles)
30
        );
31
32
        $this->syncAdminRole();
33
    }
34
35
    /* -----------------------------------------------------------------
36
     |  Other Methods
37
     | -----------------------------------------------------------------
38
     */
39
40
    /**
41
     * Prepare roles to seed.
42
     *
43
     * @param  array  $roles
44
     *
45
     * @return array
46
     */
47
    protected function prepareRoles(array $roles)
48
    {
49
        $now = now();
50
51
        return array_map(function ($role) use ($now) {
52
            return array_merge($role, [
53
                'slug'         => $role['slug'] ?? $this->slugify($role['name']),
54
                'is_locked'    => $role['is_locked'] ?? true,
55
                'created_at'   => $now,
56
                'updated_at'   => $now,
57
                'activated_at' => array_get($role, 'activated_at', $now),
58
            ]);
59
        }, $roles);
60
    }
61
62
    /**
63
     * Sync the admin role with all permissions.
64
     */
65
    protected function syncAdminRole()
66
    {
67
        /** @var \Arcanesoft\Auth\Models\Role $admin */
68
        $admin = Role::admin()->first();
69
        $admin->permissions()->sync(
70
            Permission::all()->pluck('id')->toArray()
71
        );
72
    }
73
74
    /**
75
     * Slugify the value.
76
     *
77
     * @param  string  $value
78
     *
79
     * @return string
80
     */
81
    protected function slugify($value)
82
    {
83
        return Str::slug($value, config('arcanesoft.auth.roles.slug-separator', '-'));
84
    }
85
86
    /**
87
     * Sync the roles.
88
     *
89
     * @param  array  $roles
90
     */
91
    protected function syncRoles(array $roles)
92
    {
93
        /** @var \Illuminate\Database\Eloquent\Collection $permissions */
94
        $permissions = Permission::all();
95
96
        foreach ($roles as $roleSlug => $permissionSlug) {
97
            /** @var  \Arcanesoft\Auth\Models\Role  $role */
98
            if ($role = Role::query()->where('slug', $roleSlug)->first()) {
99
                $filtered = $permissions->filter(function (Permission $permission) use ($permissionSlug) {
100
                    return Str::startsWith($permission->slug, $permissionSlug);
101
                });
102
103
                $role->permissions()->sync(
104
                    $filtered->pluck('id')->toArray()
105
                );
106
            }
107
        }
108
    }
109
}
110