Skip to content

Commit 14be06f

Browse files
committed
Allow activating feature flags using cookies
1 parent 212d69e commit 14be06f

9 files changed

Lines changed: 101 additions & 4 deletions

File tree

ā€Žplugins/CoreConsole/FeatureFlags/CliMultiProcessSymfony.phpā€Ž

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,9 @@ public function getName(): string
1919
{
2020
return 'CliMultiProcessSymfony';
2121
}
22+
23+
public function allowsCookieOverwrite(): bool
24+
{
25+
return false;
26+
}
2227
}

ā€Žplugins/FeatureFlags/FeatureFlagInterface.phpā€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,6 @@
1212
interface FeatureFlagInterface
1313
{
1414
public function getName(): string;
15+
16+
public function allowsCookieOverwrite(): bool;
1517
}

ā€Žplugins/FeatureFlags/FeatureFlagManager.phpā€Ž

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,17 +42,15 @@ public function isFeatureActive(string $featureFlag): bool
4242
return false;
4343
}
4444

45-
$featureActive = false;
46-
4745
foreach ($this->storages as $storage) {
4846
$isActive = $storage->isFeatureActive($featureFlagObj);
4947

5048
if ($isActive !== null) {
51-
$featureActive = $isActive;
49+
return $isActive;
5250
}
5351
}
5452

55-
return $featureActive;
53+
return false;
5654
}
5755

5856
private function createFeatureFlagObjFromString(string $featureFlag): ?FeatureFlagInterface

ā€Žplugins/FeatureFlags/FeatureFlags/Example.phpā€Ž

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@ public function getName(): string
1717
{
1818
return 'Example';
1919
}
20+
21+
public function allowsCookieOverwrite(): bool
22+
{
23+
return false;
24+
}
2025
}
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
/**
4+
* Matomo - free/libre analytics platform
5+
*
6+
* @link https://matomo.org
7+
* @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
8+
*/
9+
10+
namespace Piwik\Plugins\FeatureFlags\Storage;
11+
12+
use Piwik\Plugins\FeatureFlags\FeatureFlagInterface;
13+
use Piwik\Plugins\FeatureFlags\FeatureFlagStorageInterface;
14+
15+
class CookieFeatureFlagStorage implements FeatureFlagStorageInterface
16+
{
17+
/**
18+
* @internal
19+
* @param FeatureFlagInterface $feature
20+
* @return bool|null
21+
*/
22+
public function isFeatureActive(FeatureFlagInterface $feature): ?bool
23+
{
24+
if (!$feature->allowsCookieOverwrite()) {
25+
return false;
26+
}
27+
28+
$cookieName = $this->getCookieNameForFeature($feature->getName());
29+
30+
if (!isset($_COOKIE[$cookieName])) {
31+
return null;
32+
}
33+
34+
return $_COOKIE[$cookieName] == '1';
35+
}
36+
37+
/**
38+
* @internal
39+
* @param FeatureFlagInterface $feature
40+
* @return void
41+
*/
42+
public function disableFeatureFlag(FeatureFlagInterface $feature): void
43+
{
44+
// do nothing, as cookie values should only be set in frontend
45+
}
46+
47+
/**
48+
* @internal
49+
* @param FeatureFlagInterface $feature
50+
* @return void
51+
*/
52+
public function enableFeatureFlag(FeatureFlagInterface $feature): void
53+
{
54+
// do nothing as cookie values should only be set in frontend
55+
}
56+
57+
/**
58+
* @internal
59+
* @param string $feature
60+
* @return void
61+
*/
62+
public function deleteFeatureFlag(string $featureName): void
63+
{
64+
// do nothing as cookie values should only be set in frontend
65+
}
66+
67+
private function getCookieNameForFeature(string $featureName): string
68+
{
69+
return 'feature_' . $featureName;
70+
}
71+
}

ā€Žplugins/FeatureFlags/config/config.phpā€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* The first one will be overwritten by the second one (if set).
1414
*/
1515
'featureflag.storages' => [
16+
DI::get('Piwik\Plugins\FeatureFlags\Storage\CookieFeatureFlagStorage'),
1617
DI::get('Piwik\Plugins\FeatureFlags\Storage\ConfigFeatureFlagStorage'),
1718
],
1819
/**

ā€Žplugins/FeatureFlags/tests/Integration/FeatureFlags/FakeFeatureFlag.phpā€Ž

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@ public function getName(): string
1717
{
1818
return 'NotReal';
1919
}
20+
21+
public function allowsCookieOverwrite(): bool
22+
{
23+
return false;
24+
}
2025
}

ā€Žplugins/FeatureFlags/tests/System/Commands/FeatureFlags/FakeFeatureFlag.phpā€Ž

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@ public function getName(): string
1717
{
1818
return 'SystemTest';
1919
}
20+
21+
public function allowsCookieOverwrite(): bool
22+
{
23+
return false;
24+
}
2025
}

ā€Žplugins/MultiSites/FeatureFlags/ImprovedAllWebsitesDashboard.phpā€Ž

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,9 @@ public function getName(): string
1919
{
2020
return 'ImprovedAllWebsitesDashboard';
2121
}
22+
23+
public function allowsCookieOverwrite(): bool
24+
{
25+
return true;
26+
}
2227
}

0 commit comments

Comments
Ā (0)
⚔