Add feature flags API

[MAILPOET-2008]
This commit is contained in:
Jan Jakeš
2019-05-13 14:34:47 +02:00
committed by M. Shull
parent 1b091f144b
commit ab683b47de
6 changed files with 111 additions and 0 deletions

View File

@ -0,0 +1,45 @@
<?php
namespace MailPoet\API\JSON\v1;
use MailPoet\API\JSON\Endpoint as APIEndpoint;
use MailPoet\API\JSON\Error as APIError;
use MailPoet\Config\AccessControl;
use MailPoet\Features\FeatureFlagsController;
use MailPoet\Features\FeaturesController;
if (!defined('ABSPATH')) exit;
class FeatureFlags extends APIEndpoint {
/** @var FeatureFlagsController */
private $feature_flags_controller;
public $permissions = [
'global' => AccessControl::PERMISSION_MANAGE_FEATURES,
];
function __construct(FeatureFlagsController $feature_flags) {
$this->feature_flags_controller = $feature_flags;
}
function getAll() {
$feature_flags = $this->feature_flags_controller->getAll();
return $this->successResponse($feature_flags);
}
function set(array $flags) {
foreach ($flags as $name => $value) {
if (!isset(FeaturesController::$defaults[$name])) {
return $this->badRequest([
APIError::BAD_REQUEST => "Feature '$name' does not exist'",
]);
}
}
foreach ($flags as $name => $value) {
$this->feature_flags_controller->set($name, (bool)$value);
}
return $this->successResponse([]);
}
}

View File

@ -8,6 +8,7 @@ if (!defined('ABSPATH')) exit;
class AccessControl { class AccessControl {
const PERMISSION_ACCESS_PLUGIN_ADMIN = 'mailpoet_access_plugin_admin'; const PERMISSION_ACCESS_PLUGIN_ADMIN = 'mailpoet_access_plugin_admin';
const PERMISSION_MANAGE_SETTINGS = 'mailpoet_manage_settings'; const PERMISSION_MANAGE_SETTINGS = 'mailpoet_manage_settings';
const PERMISSION_MANAGE_FEATURES = 'mailpoet_manage_features';
const PERMISSION_MANAGE_EMAILS = 'mailpoet_manage_emails'; const PERMISSION_MANAGE_EMAILS = 'mailpoet_manage_emails';
const PERMISSION_MANAGE_SUBSCRIBERS = 'mailpoet_manage_subscribers'; const PERMISSION_MANAGE_SUBSCRIBERS = 'mailpoet_manage_subscribers';
const PERMISSION_MANAGE_FORMS = 'mailpoet_manage_forms'; const PERMISSION_MANAGE_FORMS = 'mailpoet_manage_forms';
@ -30,6 +31,12 @@ class AccessControl {
'administrator' 'administrator'
) )
), ),
self::PERMISSION_MANAGE_FEATURES => WPFunctions::get()->applyFilters(
'mailpoet_permission_manage_features',
array(
'administrator'
)
),
self::PERMISSION_MANAGE_EMAILS => WPFunctions::get()->applyFilters( self::PERMISSION_MANAGE_EMAILS => WPFunctions::get()->applyFilters(
'mailpoet_permission_manage_emails', 'mailpoet_permission_manage_emails',
array( array(
@ -62,6 +69,7 @@ class AccessControl {
return array( return array(
self::PERMISSION_ACCESS_PLUGIN_ADMIN => WPFunctions::get()->__('Admin menu item', 'mailpoet'), self::PERMISSION_ACCESS_PLUGIN_ADMIN => WPFunctions::get()->__('Admin menu item', 'mailpoet'),
self::PERMISSION_MANAGE_SETTINGS => WPFunctions::get()->__('Manage settings', 'mailpoet'), self::PERMISSION_MANAGE_SETTINGS => WPFunctions::get()->__('Manage settings', 'mailpoet'),
self::PERMISSION_MANAGE_FEATURES => WPFunctions::get()->__('Manage features', 'mailpoet'),
self::PERMISSION_MANAGE_EMAILS => WPFunctions::get()->__('Manage emails', 'mailpoet'), self::PERMISSION_MANAGE_EMAILS => WPFunctions::get()->__('Manage emails', 'mailpoet'),
self::PERMISSION_MANAGE_SUBSCRIBERS => WPFunctions::get()->__('Manage subscribers', 'mailpoet'), self::PERMISSION_MANAGE_SUBSCRIBERS => WPFunctions::get()->__('Manage subscribers', 'mailpoet'),
self::PERMISSION_MANAGE_FORMS => WPFunctions::get()->__('Manage forms', 'mailpoet'), self::PERMISSION_MANAGE_FORMS => WPFunctions::get()->__('Manage forms', 'mailpoet'),

View File

@ -39,6 +39,7 @@ class ContainerConfigurator implements IContainerConfigurator {
$container->autowire(\MailPoet\API\JSON\v1\Analytics::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\Analytics::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\AutomatedLatestContent::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\AutomatedLatestContent::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\CustomFields::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\CustomFields::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\FeatureFlags::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\Forms::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\Forms::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\ImportExport::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\ImportExport::class)->setPublic(true);
$container->autowire(\MailPoet\API\JSON\v1\Mailer::class)->setPublic(true); $container->autowire(\MailPoet\API\JSON\v1\Mailer::class)->setPublic(true);

View File

@ -0,0 +1,38 @@
<?php
namespace MailPoet\Features;
use MailPoet\Models\FeatureFlag;
use function MailPoet\Util\array_column;
class FeatureFlagsController {
function set($name, $value) {
if (!isset(FeaturesController::$defaults[$name])) {
throw new \RuntimeException("Feature '$name' does not exist'");
}
$result = FeatureFlag::createOrUpdate([
'name' => $name,
'value' => $value ,
]);
if ($result->getErrors()) {
throw new \RuntimeException("Error when saving feature '$name''");
}
}
function getAll() {
$flags = FeatureFlag::findArray();
$flagsMap = array_combine(array_column($flags, 'name'), $flags);
$output = [];
foreach (FeaturesController::$defaults as $name => $default) {
$output[] = [
'name' => $name,
'value' => isset($flagsMap[$name]) ? (bool)$flagsMap[$name]['value'] : $default,
'default' => $default,
];
}
return $output;
}
}

View File

@ -9,4 +9,14 @@ if (!defined('ABSPATH')) exit;
*/ */
class FeatureFlag extends Model { class FeatureFlag extends Model {
public static $_table = MP_FEATURE_FLAGS_TABLE; public static $_table = MP_FEATURE_FLAGS_TABLE;
static function createOrUpdate($data = []) {
$keys = false;
if (isset($data['name'])) {
$keys = [
'name' => $data['name'],
];
}
return parent::_createOrUpdate($data, $keys);
}
} }

View File

@ -31,6 +31,12 @@ class AccessControlTest extends \MailPoetTest {
return array('custom_manage_settings_role'); return array('custom_manage_settings_role');
} }
); );
$wp->addFilter(
'mailpoet_permission_manage_features',
function() {
return array('custom_manage_features_role');
}
);
$wp->addFilter( $wp->addFilter(
'mailpoet_permission_manage_emails', 'mailpoet_permission_manage_emails',
function() { function() {
@ -64,6 +70,9 @@ class AccessControlTest extends \MailPoetTest {
AccessControl::PERMISSION_MANAGE_SETTINGS => array( AccessControl::PERMISSION_MANAGE_SETTINGS => array(
'custom_manage_settings_role' 'custom_manage_settings_role'
), ),
AccessControl::PERMISSION_MANAGE_FEATURES => array(
'custom_manage_features_role'
),
AccessControl::PERMISSION_MANAGE_EMAILS => array( AccessControl::PERMISSION_MANAGE_EMAILS => array(
'custom_manage_emails_role' 'custom_manage_emails_role'
), ),