Add feature flags API
[MAILPOET-2008]
This commit is contained in:
45
lib/API/JSON/v1/FeatureFlags.php
Normal file
45
lib/API/JSON/v1/FeatureFlags.php
Normal 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([]);
|
||||||
|
}
|
||||||
|
}
|
@ -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'),
|
||||||
|
@ -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);
|
||||||
|
38
lib/Features/FeatureFlagsController.php
Normal file
38
lib/Features/FeatureFlagsController.php
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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'
|
||||||
),
|
),
|
||||||
|
Reference in New Issue
Block a user