Skip to content

Commit

Permalink
Merge pull request #15 from luisdalmolin/use-user-from-gate
Browse files Browse the repository at this point in the history
Use the User model passed from the gate check
  • Loading branch information
alnutile authored Jul 15, 2020
2 parents e52875f + 9295d7f commit 950b3a1
Show file tree
Hide file tree
Showing 3 changed files with 54 additions and 12 deletions.
18 changes: 12 additions & 6 deletions src/Feature.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,17 @@ public function exists($featureKey)
*
* @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;
Expand All @@ -74,11 +75,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;
}
Expand All @@ -95,11 +97,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;
}
Expand Down
14 changes: 8 additions & 6 deletions src/FeatureFlagsProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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'",
Expand All @@ -126,6 +127,7 @@ private function defineFeatureFlagGate($gate)
)
);
}

// Defaults to false in case of error.
return false;
}
Expand Down
34 changes: 34 additions & 0 deletions tests/FeatureTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,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
Expand Down

0 comments on commit 950b3a1

Please sign in to comment.