Skip to content

Commit 78ed55f

Browse files
authored
Merge pull request #31 from launchdarkly/eb/ch24449/less-metadata
add option to reduce front-end metadata for untracked flags
2 parents d3c3932 + a2598c7 commit 78ed55f

File tree

4 files changed

+99
-8
lines changed

4 files changed

+99
-8
lines changed

src/LaunchDarkly/FeatureFlagsState.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -28,17 +28,21 @@ public function __construct($valid, $flagValues = array(), $flagMetadata = array
2828
/**
2929
* Used internally to build the state map.
3030
*/
31-
public function addFlag($flag, $detail, $withReason = false)
31+
public function addFlag($flag, $detail, $withReason = false, $detailsOnlyIfTracked = false)
3232
{
3333
$this->_flagValues[$flag->getKey()] = $detail->getValue();
3434
$meta = array();
35+
if (!$detailsOnlyIfTracked || $flag->isTrackEvents() || $flag->getDebugEventsUntilDate()) {
36+
$meta['version'] = $flag->getVersion();
37+
if ($withReason) {
38+
$meta['reason'] = $detail->getReason();
39+
}
40+
}
3541
if (!is_null($detail->getVariationIndex())) {
3642
$meta['variation'] = $detail->getVariationIndex();
3743
}
38-
$meta['version'] = $flag->getVersion();
39-
$meta['trackEvents'] = $flag->isTrackEvents();
40-
if ($withReason) {
41-
$meta['reason'] = $detail->getReason();
44+
if ($flag->isTrackEvents()) {
45+
$meta['trackEvents'] = true;
4246
}
4347
if ($flag->getDebugEventsUntilDate()) {
4448
$meta['debugEventsUntilDate'] = $flag->getDebugEventsUntilDate();

src/LaunchDarkly/LDClient.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,12 +356,13 @@ public function allFlagsState($user, $options = array())
356356
$state = new FeatureFlagsState(true);
357357
$clientOnly = isset($options['clientSideOnly']) && $options['clientSideOnly'];
358358
$withReasons = isset($options['withReasons']) && $options['withReasons'];
359+
$detailsOnlyIfTracked = isset($options['detailsOnlyForTrackedFlags']) && $options['detailsOnlyForTrackedFlags'];
359360
foreach ($flags as $key => $flag) {
360361
if ($clientOnly && !$flag->isClientSide()) {
361362
continue;
362363
}
363364
$result = $flag->evaluate($user, $preloadedRequester);
364-
$state->addFlag($flag, $result->getDetail(), $withReasons);
365+
$state->addFlag($flag, $result->getDetail(), $withReasons, $detailsOnlyIfTracked);
365366
}
366367
return $state;
367368
}

tests/FeatureFlagsStateTest.php

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,7 @@ public function testCanConvertToJson()
106106
'$flagsState' => array(
107107
'key1' => array(
108108
'variation' => 0,
109-
'version' => 100,
110-
'trackEvents' => false
109+
'version' => 100
111110
),
112111
'key2' => array(
113112
'variation' => 1,

tests/LDClientTest.php

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,93 @@ public function testAllFlagsStateCanFilterForClientSideFlags()
401401
$this->assertEquals(array('client-side-1' => 'value1', 'client-side-2' => 'value2'), $state->toValuesMap());
402402
}
403403

404+
public function testAllFlagsStateCanOmitDetailsForUntrackedFlags()
405+
{
406+
$flag1Json = array(
407+
'key' => 'flag1',
408+
'version' => 100,
409+
'deleted' => false,
410+
'on' => false,
411+
'targets' => array(),
412+
'prerequisites' => array(),
413+
'rules' => array(),
414+
'offVariation' => 0,
415+
'fallthrough' => null,
416+
'variations' => array('value1'),
417+
'salt' => '',
418+
'trackEvents' => false
419+
);
420+
$flag2Json = array(
421+
'key' => 'flag2',
422+
'version' => 200,
423+
'deleted' => false,
424+
'on' => false,
425+
'targets' => array(),
426+
'prerequisites' => array(),
427+
'rules' => array(),
428+
'offVariation' => 0,
429+
'fallthrough' => null,
430+
'variations' => array('value2'),
431+
'salt' => '',
432+
'trackEvents' => true
433+
);
434+
$flag3Json = array(
435+
'key' => 'flag3',
436+
'version' => 300,
437+
'deleted' => false,
438+
'on' => false,
439+
'targets' => array(),
440+
'prerequisites' => array(),
441+
'rules' => array(),
442+
'offVariation' => 0,
443+
'fallthrough' => null,
444+
'variations' => array('value3'),
445+
'salt' => '',
446+
'trackEvents' => false,
447+
'debugEventsUntilDate' => 1000
448+
);
449+
$flag1 = FeatureFlag::decode($flag1Json);
450+
$flag2 = FeatureFlag::decode($flag2Json);
451+
$flag3 = FeatureFlag::decode($flag3Json);
452+
453+
MockFeatureRequester::$flags = array('flag1' => $flag1, 'flag2' => $flag2, 'flag3' => $flag3);
454+
$client = new LDClient("someKey", array(
455+
'feature_requester_class' => MockFeatureRequester::class,
456+
'events' => false
457+
));
458+
459+
$builder = new LDUserBuilder(3);
460+
$user = $builder->build();
461+
$state = $client->allFlagsState($user, array('withReasons' => true, 'detailsOnlyForTrackedFlags' => true));
462+
463+
$this->assertTrue($state->isValid());
464+
$this->assertEquals(array('flag1' => 'value1', 'flag2' => 'value2', 'flag3' => 'value3'), $state->toValuesMap());
465+
$expectedState = array(
466+
'flag1' => 'value1',
467+
'flag2' => 'value2',
468+
'flag3' => 'value3',
469+
'$flagsState' => array(
470+
'flag1' => array(
471+
'variation' => 0,
472+
),
473+
'flag2' => array(
474+
'variation' => 0,
475+
'version' => 200,
476+
'reason' => array('kind' => 'OFF'),
477+
'trackEvents' => true
478+
),
479+
'flag3' => array(
480+
'variation' => 0,
481+
'version' => 300,
482+
'reason' => array('kind' => 'OFF'),
483+
'debugEventsUntilDate' => 1000
484+
)
485+
),
486+
'$valid' => true
487+
);
488+
$this->assertEquals($expectedState, $state->jsonSerialize());
489+
}
490+
404491
public function testOnlyValidFeatureRequester()
405492
{
406493
$this->setExpectedException(InvalidArgumentException::class);

0 commit comments

Comments
 (0)