RolesSeeder::prepareRoles()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 14

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 14
ccs 0
cts 10
cp 0
rs 9.7998
c 0
b 0
f 0
cc 1
nc 1
nop 1
crap 2
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