From 9295d7fa6c70d6f504eb3c5423891df3db543ee3 Mon Sep 17 00:00:00 2001 From: Luis Dalmolin Date: Wed, 15 Jul 2020 09:25:15 -0300 Subject: [PATCH] Use the User model passed from the gate check --- src/Feature.php | 18 ++++++++++++------ src/FeatureFlagsProvider.php | 14 ++++++++------ tests/FeatureTest.php | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 54 insertions(+), 12 deletions(-) diff --git a/src/Feature.php b/src/Feature.php index d153d94..c13e9db 100644 --- a/src/Feature.php +++ b/src/Feature.php @@ -26,16 +26,17 @@ public function __construct() * * @param string $featureKey * @param mixed $variant (optional) + * @param \Illuminate\Contracts\Auth\Access\Authorizable $user (optional) * @return bool */ - public function isEnabled($featureKey, $variant = null) + public function isEnabled($featureKey, $variant = null, $user = null) { if (! $variant) { $variant = $this->getConfig($featureKey); } if ($variant != self::ON and $variant != self::OFF) { - return $this->isUserEnabled($variant); + return $this->isUserEnabled($variant, $user); } return $variant == self::ON; @@ -62,11 +63,12 @@ public function getConfig($featureKey) /** * @param $feature_variant + * @param \Illuminate\Contracts\Auth\Access\Authorizable $user (optional) * @return bool */ - protected function isUserEnabled($feature_variant) + protected function isUserEnabled($feature_variant, $user = null) { - if ($user_email = $this->getUserEmail()) { + if ($user_email = $this->getUserEmail($user)) { if (empty($feature_variant['users'])) { return false; } @@ -83,11 +85,15 @@ protected function isUserEnabled($feature_variant) /** - * @param string|int $userId + * @param \Illuminate\Contracts\Auth\Access\Authorizable $user (optional) * @return string */ - public function getUserEmail() + public function getUserEmail($user) { + if ($user && $user->email) { + return $user->email; + } + if (Auth::guest()) { return false; } diff --git a/src/FeatureFlagsProvider.php b/src/FeatureFlagsProvider.php index 9eaec39..d55944f 100644 --- a/src/FeatureFlagsProvider.php +++ b/src/FeatureFlagsProvider.php @@ -2,11 +2,12 @@ namespace FriendsOfCat\LaravelFeatureFlags; -use FriendsOfCat\LaravelFeatureFlags\Console\Command\SyncFlags; -use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; -use Illuminate\Contracts\Auth\Access\Gate as GateContract; +use Exception; use Illuminate\Support\Facades\Log; use Facades\FriendsOfCat\LaravelFeatureFlags\Feature; +use Illuminate\Contracts\Auth\Access\Gate as GateContract; +use FriendsOfCat\LaravelFeatureFlags\Console\Command\SyncFlags; +use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider; /** * Class FeatureFlagsProvider @@ -115,9 +116,9 @@ private function defineFeatureFlagGate($gate) { $gate->define('feature-flag', function ($user, $flag_id) { try { - return Feature::isEnabled($flag_id); - } catch (\Exception $e) { - if (config("laravel-feature-flag.logging")) { + return Feature::isEnabled($flag_id, null, $user); + } catch (Exception $e) { + if (config('laravel-feature-flag.logging')) { Log::info( sprintf( "FeatureFlagsProvider: error with feature flag %s. '%s'", @@ -126,6 +127,7 @@ private function defineFeatureFlagGate($gate) ) ); } + // Defaults to false in case of error. return false; } diff --git a/tests/FeatureTest.php b/tests/FeatureTest.php index ba47dd4..43a8753 100644 --- a/tests/FeatureTest.php +++ b/tests/FeatureTest.php @@ -52,6 +52,40 @@ public function testIsEnabledPassingKey() $this->assertFalse((new Feature)->isEnabled('feature_4')); } + /** + * @test + * @covers ::isEnabled + */ + public function testIsEnabledPassingKeyAndUser() + { + $user = factory(FeatureFlagUser::class)->create(); + + factory(FeatureFlag::class)->create([ + 'key' => 'feature_1', + 'variants' => 'on' + ]); + + factory(FeatureFlag::class)->create([ + 'key' => 'feature_2', + 'variants' => 'off' + ]); + + factory(FeatureFlag::class)->create([ + 'key' => 'feature_3', + 'variants' => ['users' => [$user->email]], + ]); + + factory(FeatureFlag::class)->create([ + 'key' => 'feature_3', + 'variants' => ['users' => []], + ]); + + $this->assertTrue((new Feature)->isEnabled('feature_1', null, $user)); + $this->assertFalse((new Feature)->isEnabled('feature_2', null, $user)); + $this->assertTrue((new Feature)->isEnabled('feature_3', null, $user)); + $this->assertFalse((new Feature)->isEnabled('feature_4', null, $user)); + } + /** * @test * @covers ::isEnabled