Skip to content

Commit 3f79f47

Browse files
committed
Team level roles & permissions
1 parent ce6fe10 commit 3f79f47

File tree

10 files changed

+240
-66
lines changed

10 files changed

+240
-66
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2121
### Fixed
2222
### Removed --->
2323

24+
## 0.6.7 - 2021-09-11
25+
### Added
26+
- Roles & Permissions team support
27+
2428
## 0.6.6 - 2021-09-03
2529
### Changed
2630
- Default field level encryption security setting to false

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ This package will add CRM functionality to your laravel projects
2929
- Secure registration & login
3030
- Reset forgotten password
3131
- Laravel Jetstream/Spark teams support
32+
- Team level roles & permissions
3233

3334
## Installation (10-15mins)
3435

config/package.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,6 @@
1313
|
1414
*/
1515

16-
'version' => '0.6.6',
16+
'version' => '0.6.7',
1717

1818
];
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<?php
2+
3+
namespace VentureDrake\LaravelCrm\Console;
4+
5+
use Carbon\Carbon;
6+
use DB;
7+
use Illuminate\Console\Command;
8+
use Illuminate\Support\Composer;
9+
10+
class LaravelCrmPermissions extends Command
11+
{
12+
/**
13+
* The name and signature of the console command.
14+
*
15+
* @var string
16+
*/
17+
protected $signature = 'laravelcrm:permissions';
18+
19+
/**
20+
* The console command description.
21+
*
22+
* @var string
23+
*/
24+
protected $description = 'Install Laravel CRM package';
25+
26+
/**
27+
* The Composer instance.
28+
*
29+
* @var \Illuminate\Foundation\Composer
30+
*/
31+
protected $composer;
32+
33+
/**
34+
* Create a new command instance.
35+
*
36+
* @return void
37+
*/
38+
public function __construct(Composer $composer)
39+
{
40+
parent::__construct();
41+
$this->composer = $composer;
42+
}
43+
44+
/**
45+
* Execute the console command.
46+
*
47+
* @return mixed
48+
*/
49+
public function handle()
50+
{
51+
$this->info('Updating LaravelCRM Permissions...');
52+
53+
$this->comment('Clearing permissions cache');
54+
55+
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
56+
57+
foreach (DB::table('teams')->get() as $team) {
58+
foreach (DB::table('roles')
59+
->whereNull('team_id')
60+
->get() as $role) {
61+
$this->info('Inserting role '.$role->name.' for team '.$team->name);
62+
63+
DB::table('roles')->updateOrInsert([
64+
'name' => $role->name,
65+
'guard_name' => $role->guard_name,
66+
'description' => $role->description,
67+
'crm_role' => $role->crm_role,
68+
'team_id' => $team->id,
69+
], [
70+
'created_at' => Carbon::now(),
71+
'updated_at' => Carbon::now(),
72+
]);
73+
74+
if ($newRole = DB::table('roles')->where([
75+
'name' => $role->name,
76+
'guard_name' => $role->guard_name,
77+
'description' => $role->description,
78+
'crm_role' => $role->crm_role,
79+
'team_id' => $team->id,
80+
])->first()) {
81+
foreach (DB::table('permissions')
82+
->leftJoin('role_has_permissions', 'permissions.id', '=', 'role_has_permissions.permission_id')
83+
->where('role_has_permissions.role_id', $role->id)
84+
->get() as $permission) {
85+
$this->info('Inserting permission '.$permission->name.' for role '.$role->name);
86+
87+
DB::table('permissions')->updateOrInsert([
88+
'name' => $permission->name,
89+
'guard_name' => $permission->guard_name,
90+
'description' => $permission->description,
91+
'crm_permission' => $permission->crm_permission,
92+
'team_id' => $team->id,
93+
], [
94+
'created_at' => Carbon::now(),
95+
'updated_at' => Carbon::now(),
96+
]);
97+
98+
if ($newPermission = DB::table('permissions')->where([
99+
'name' => $permission->name,
100+
'guard_name' => $permission->guard_name,
101+
'description' => $permission->description,
102+
'crm_permission' => $permission->crm_permission,
103+
'team_id' => $team->id,
104+
])->first()) {
105+
DB::table('role_has_permissions')->updateOrInsert([
106+
'permission_id' => $newPermission->id,
107+
'role_id' => $newRole->id,
108+
]);
109+
}
110+
}
111+
}
112+
}
113+
}
114+
115+
$this->info('LaravelCRM Permissions Update Complete.');
116+
}
117+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
namespace VentureDrake\LaravelCrm\Http\Controllers\Jetstream;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\Routing\Controller;
7+
use Laravel\Jetstream\Jetstream;
8+
9+
class CurrentTeamController extends Controller
10+
{
11+
/**
12+
* Update the authenticated user's current team.
13+
*
14+
* @param \Illuminate\Http\Request $request
15+
* @return \Illuminate\Http\RedirectResponse
16+
*/
17+
public function update(Request $request)
18+
{
19+
$team = Jetstream::newTeamModel()->findOrFail($request->team_id);
20+
21+
if ($request->user()->switchTeam($team)) {
22+
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
23+
} else {
24+
abort(403);
25+
}
26+
27+
return redirect(config('fortify.home'), 303);
28+
}
29+
}

src/Http/Middleware/HasCrmAccess.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ public function handle($request, Closure $next)
2323
abort('403');
2424
}
2525

26-
if (config('laravel-crm.crm_owner') == auth()->user()->email && (! auth()->user()->hasRole('Owner') || ! auth()->user()->hasCrmAccess())) {
27-
auth()->user()->syncRoles(['Owner']);
26+
if (! config('laravel-crm.teams') && config('laravel-crm.crm_owner') == auth()->user()->email && (! auth()->user()->hasRole('Owner') || ! auth()->user()->hasCrmAccess())) {
27+
auth()->user()->assignRole(['Owner']);
2828

2929
auth()->user()->forceFill([
3030
'crm_access' => 1,

src/Http/routes.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,7 @@
503503
->middleware(['can:delete,role']);
504504
});
505505

506-
/* CRM routes (AJAX) */
506+
/* CRM (AJAX) */
507507
Route::group(['prefix' => 'crm', 'middleware' => 'auth.laravel-crm'], function () {
508508
Route::group(['prefix' => 'people', 'middleware' => 'auth.laravel-crm'], function () {
509509
Route::get('{person}/autocomplete', 'VentureDrake\LaravelCrm\Http\Controllers\PersonController@autocomplete')
@@ -524,3 +524,8 @@
524524
->middleware(['can:viewAny,VentureDrake\LaravelCrm\Models\Product']);
525525
});
526526
});
527+
528+
/* Jetstream */
529+
Route::put('/current-team', 'VentureDrake\LaravelCrm\Http\Controllers\Jetstream\CurrentTeamController@update')
530+
->name('current-team.update')
531+
->middleware(['auth', 'verified']);

src/LaravelCrmServiceProvider.php

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Illuminate\Support\Facades\Route;
1212
use Illuminate\Support\ServiceProvider;
1313
use VentureDrake\LaravelCrm\Console\LaravelCrmInstall;
14+
use VentureDrake\LaravelCrm\Console\LaravelCrmPermissions;
1415
use VentureDrake\LaravelCrm\Http\Middleware\Authenticate;
1516
use VentureDrake\LaravelCrm\Http\Middleware\HasCrmAccess;
1617
use VentureDrake\LaravelCrm\Http\Middleware\LastOnlineAt;
@@ -90,14 +91,18 @@ class_alias('App\Models\Team', 'App\Team');
9091
Phone::observe(PhoneObserver::class);
9192
Email::observe(EmailObserver::class);
9293
Setting::observe(SettingObserver::class);
93-
94-
if ((app()->version() >= 8 && class_exists('App\Models\User')) || (class_exists('App\Models\User') && ! class_exists('App\User'))) {
95-
\App\Models\Team::observe(TeamObserver::class);
94+
95+
if (class_exists('App\Models\User')) {
9696
\App\Models\User::observe(UserObserver::class);
9797
} else {
98-
\App\Team::observe(TeamObserver::class);
9998
\App\User::observe(UserObserver::class);
10099
}
100+
101+
if (class_exists('App\Models\Team')) {
102+
\App\Models\Team::observe(TeamObserver::class);
103+
} elseif (class_exists('App\Team')) {
104+
\App\Team::observe(TeamObserver::class);
105+
}
101106

102107
// Paginate on Collection
103108
if (! Collection::hasMacro('paginate')) {
@@ -175,6 +180,7 @@ function ($perPage = 30, $page = null, $options = []) {
175180
// Registering package commands.
176181
$this->commands([
177182
LaravelCrmInstall::class,
183+
LaravelCrmPermissions::class,
178184
]);
179185

180186
// Register the model factories

src/Observers/TeamObserver.php

Lines changed: 68 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,8 @@
33
namespace VentureDrake\LaravelCrm\Observers;
44

55
use App\Team;
6+
use Carbon\Carbon;
67
use DB;
7-
use Spatie\Permission\Models\Permission;
8-
use Spatie\Permission\Models\Role;
98

109
class TeamObserver
1110
{
@@ -29,64 +28,77 @@ public function creating(Team $team)
2928
public function created(Team $team)
3029
{
3130
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
32-
33-
foreach (DB::table('permissions')
34-
->whereNull('team_id')
35-
->get() as $permission) {
36-
DB::table('permissions')->insert([
37-
'name' => $permission->name,
38-
'guard_name' => $permission->guard_name,
39-
'description' => $permission->description,
40-
'crm_permission' => $permission->crm_permission,
31+
32+
// Get the roles
33+
foreach (DB::table('roles')
34+
->whereNull('team_id')
35+
->get() as $role) {
36+
DB::table('roles')->updateOrInsert([
37+
'name' => $role->name,
38+
'guard_name' => $role->guard_name,
39+
'description' => $role->description,
40+
'crm_role' => $role->crm_role,
4141
'team_id' => $team->id,
42+
], [
43+
'created_at' => Carbon::now(),
44+
'updated_at' => Carbon::now(),
4245
]);
43-
}
44-
45-
$role = Role::create(['name' => 'Owner', 'crm_role' => 1])
46-
->givePermissionTo(Permission::all());
47-
48-
$role = Role::create(['name' => 'Admin', 'crm_role' => 1])
49-
->givePermissionTo(Permission::all());
46+
47+
if ($newRole = DB::table('roles')->where([
48+
'name' => $role->name,
49+
'guard_name' => $role->guard_name,
50+
'description' => $role->description,
51+
'crm_role' => $role->crm_role,
52+
'team_id' => $team->id,
53+
])->first()) {
54+
if ($role->name == 'Owner') {
55+
if ((app()->version() >= 8 && class_exists('App\Models\User')) || (class_exists('App\Models\User') && ! class_exists('App\User'))) {
56+
DB::table('model_has_roles')->updateOrInsert([
57+
'role_id' => $newRole->id,
58+
'model_type' => 'App\Models\User',
59+
'model_id' => auth()->user()->id,
60+
]);
61+
} else {
62+
DB::table('model_has_roles')->updateOrInsert([
63+
'role_id' => $newRole->id,
64+
'model_type' => 'App\User',
65+
'model_id' => auth()->user()->id,
66+
]);
67+
}
68+
}
69+
70+
foreach (DB::table('permissions')
71+
->leftJoin('role_has_permissions', 'permissions.id', '=', 'role_has_permissions.permission_id')
72+
->where('role_has_permissions.role_id', $role->id)
73+
->get() as $permission) {
74+
DB::table('permissions')->updateOrInsert([
75+
'name' => $permission->name,
76+
'guard_name' => $permission->guard_name,
77+
'description' => $permission->description,
78+
'crm_permission' => $permission->crm_permission,
79+
'team_id' => $team->id,
80+
], [
81+
'created_at' => Carbon::now(),
82+
'updated_at' => Carbon::now(),
83+
]);
5084

51-
$role = Role::create(['name' => 'Manager', 'crm_role' => 1])
52-
->givePermissionTo([
53-
'create crm leads',
54-
'view crm leads',
55-
'edit crm leads',
56-
'delete crm leads',
57-
'create crm deals',
58-
'view crm deals',
59-
'edit crm deals',
60-
'delete crm deals',
61-
'create crm people',
62-
'view crm people',
63-
'edit crm people',
64-
'delete crm people',
65-
'create crm organisations',
66-
'view crm organisations',
67-
'edit crm organisations',
68-
'delete crm organisations',
69-
]);
85+
if ($newPermission = DB::table('permissions')->where([
86+
'name' => $permission->name,
87+
'guard_name' => $permission->guard_name,
88+
'description' => $permission->description,
89+
'crm_permission' => $permission->crm_permission,
90+
'team_id' => $team->id,
91+
])->first()) {
92+
DB::table('role_has_permissions')->updateOrInsert([
93+
'permission_id' => $newPermission->id,
94+
'role_id' => $newRole->id,
95+
]);
96+
}
97+
}
98+
}
99+
}
70100

71-
$role = Role::create(['name' => 'Employee', 'crm_role' => 1])
72-
->givePermissionTo([
73-
'create crm leads',
74-
'view crm leads',
75-
'edit crm leads',
76-
'delete crm leads',
77-
'create crm deals',
78-
'view crm deals',
79-
'edit crm deals',
80-
'delete crm deals',
81-
'create crm people',
82-
'view crm people',
83-
'edit crm people',
84-
'delete crm people',
85-
'create crm organisations',
86-
'view crm organisations',
87-
'edit crm organisations',
88-
'delete crm organisations',
89-
]);
101+
auth()->user()->assignRole(['Owner']);
90102
}
91103

92104
/**

0 commit comments

Comments
 (0)