Skip to content

Commit 04a68c0

Browse files
Check current model supports HasTeams before trying to access team information. (#1120)
* Check current model supports HasTeams before trying to access team information. This would be useful for application with multiple user providers and uses Inertia. As an example, this will fixes laravel/nova-issues#4683 Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip Signed-off-by: Mior Muhammad Zaki <[email protected]> * wip * formatting Signed-off-by: Mior Muhammad Zaki <[email protected]> Co-authored-by: Taylor Otwell <[email protected]>
1 parent 066eb4a commit 04a68c0

File tree

5 files changed

+77
-11
lines changed

5 files changed

+77
-11
lines changed

Diff for: src/Http/Middleware/ShareInertiaData.php

+13-9
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ public function handle($request, $next)
2121
{
2222
Inertia::share(array_filter([
2323
'jetstream' => function () use ($request) {
24+
$user = $request->user();
25+
2426
return [
25-
'canCreateTeams' => $request->user() &&
26-
Jetstream::hasTeamFeatures() &&
27-
Gate::forUser($request->user())->check('create', Jetstream::newTeamModel()),
27+
'canCreateTeams' => $user &&
28+
Jetstream::userHasTeamFeatures($user) &&
29+
Gate::forUser($user)->check('create', Jetstream::newTeamModel()),
2830
'canManageTwoFactorAuthentication' => Features::canManageTwoFactorAuthentication(),
2931
'canUpdatePassword' => Features::enabled(Features::updatePasswords()),
3032
'canUpdateProfileInformation' => Features::canUpdateProfileInformation(),
@@ -38,18 +40,20 @@ public function handle($request, $next)
3840
];
3941
},
4042
'user' => function () use ($request) {
41-
if (! $request->user()) {
43+
if (! $user = $request->user()) {
4244
return;
4345
}
4446

45-
if (Jetstream::hasTeamFeatures() && $request->user()) {
46-
$request->user()->currentTeam;
47+
$userHasTeamFeatures = Jetstream::userHasTeamFeatures($user);
48+
49+
if ($user && $userHasTeamFeatures) {
50+
$user->currentTeam;
4751
}
4852

49-
return array_merge($request->user()->toArray(), array_filter([
50-
'all_teams' => Jetstream::hasTeamFeatures() ? $request->user()->allTeams()->values() : null,
53+
return array_merge($user->toArray(), array_filter([
54+
'all_teams' => $userHasTeamFeatures ? $user->allTeams()->values() : null,
5155
]), [
52-
'two_factor_enabled' => ! is_null($request->user()->two_factor_secret),
56+
'two_factor_enabled' => ! is_null($user->two_factor_secret),
5357
]);
5458
},
5559
'errorBags' => function () {

Diff for: src/Jetstream.php

+14
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Laravel\Jetstream;
44

5+
use Illuminate\Database\Eloquent\Model;
56
use Illuminate\Support\Arr;
67
use Laravel\Jetstream\Contracts\AddsTeamMembers;
78
use Laravel\Jetstream\Contracts\CreatesTeams;
@@ -195,6 +196,19 @@ public static function hasTeamFeatures()
195196
return Features::hasTeamFeatures();
196197
}
197198

199+
/**
200+
* Determine if a given user model utilizes the "HasTeams" trait.
201+
*
202+
* @param \Illuminate\Database\Eloquent\Model
203+
* @return bool
204+
*/
205+
public static function userHasTeamFeatures($user)
206+
{
207+
return (array_key_exists(HasTeams::class, class_uses_recursive($user)) ||
208+
method_exists($user, 'currentTeam')) &&
209+
static::hasTeamFeatures();
210+
}
211+
198212
/**
199213
* Determine if the application is using the terms confirmation feature.
200214
*

Diff for: tests/Fixtures/Admin.php

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Laravel\Jetstream\Tests\Fixtures;
4+
5+
use Illuminate\Foundation\Auth\User as Authenticatable;
6+
use Laravel\Jetstream\HasProfilePhoto;
7+
use Laravel\Jetstream\HasTeams;
8+
use Laravel\Sanctum\HasApiTokens;
9+
10+
class Admin extends Authenticatable
11+
{
12+
use HasApiTokens, HasProfilePhoto;
13+
14+
/**
15+
* The attributes that aren't mass assignable.
16+
*
17+
* @var array
18+
*/
19+
protected $guarded = [];
20+
}

Diff for: tests/JetstreamTest.php

+18
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Laravel\Jetstream\Tests;
44

5+
use Laravel\Jetstream\Features;
56
use Laravel\Jetstream\Jetstream;
67

78
class JetstreamTest extends OrchestraTestCase
@@ -49,4 +50,21 @@ public function test_roles_can_be_json_serialized()
4950
$this->assertArrayHasKey('description', $serialized);
5051
$this->assertArrayHasKey('permissions', $serialized);
5152
}
53+
54+
public function test_has_team_feature_will_always_return_false_when_team_is_not_enabled()
55+
{
56+
$this->assertFalse(Jetstream::hasTeamFeatures());
57+
$this->assertFalse(Jetstream::userHasTeamFeatures(new Fixtures\User));
58+
$this->assertFalse(Jetstream::userHasTeamFeatures(new Fixtures\Admin));
59+
}
60+
61+
/**
62+
* @define-env defineHasTeamEnvironment
63+
*/
64+
public function test_has_team_feature_can_be_determined_when_team_is_enabled()
65+
{
66+
$this->assertTrue(Jetstream::hasTeamFeatures());
67+
$this->assertTrue(Jetstream::userHasTeamFeatures(new Fixtures\User));
68+
$this->assertFalse(Jetstream::userHasTeamFeatures(new Fixtures\Admin));
69+
}
5270
}

Diff for: tests/OrchestraTestCase.php

+12-2
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Laravel\Jetstream\Tests;
44

55
use Laravel\Fortify\FortifyServiceProvider;
6+
use Laravel\Jetstream\Features;
67
use Laravel\Jetstream\JetstreamServiceProvider;
78
use Mockery;
89
use Orchestra\Testbench\TestCase;
@@ -16,15 +17,15 @@ public function setUp(): void
1617

1718
public function tearDown(): void
1819
{
19-
Mockery::close();
20+
parent::tearDown();
2021
}
2122

2223
protected function getPackageProviders($app)
2324
{
2425
return [JetstreamServiceProvider::class, FortifyServiceProvider::class];
2526
}
2627

27-
protected function getEnvironmentSetUp($app)
28+
protected function defineEnvironment($app)
2829
{
2930
$app['migrator']->path(__DIR__.'/../database/migrations');
3031

@@ -36,4 +37,13 @@ protected function getEnvironmentSetUp($app)
3637
'prefix' => '',
3738
]);
3839
}
40+
41+
protected function defineHasTeamEnvironment($app)
42+
{
43+
$features = $app->config->get('jetstream.features', []);
44+
45+
$features[] = Features::teams(['invitations' => true]);
46+
47+
$app->config->set('jetstream.features', $features);
48+
}
3949
}

0 commit comments

Comments
 (0)