e1696f8f by Joshua Tundag

Initial commit

0 parents
# BTFlags
Flag Manager for Baytech Sites.
## Define Flag Directory in your constants.php file
```
define('DEFAULT_PPG', '14');
```
## Initialize Flag Manager
```
$flagManager = new \BTFlags\FlagManager();
```
### Data Structure
```
$requestData = array(
'name' => null|string,
'is_encrypyed' => true|false,
'is_filtered' => true|false,
'encrypted_name' => null|string,
'has_default' => true|false,
'default' => null|string,
'accepted_values' => array(
'value' => null|string,
'encrypted_value' => null|string,
),
);
```
## CRUD
```
// Create a Flag
$created = $flagManager->create($requestData);
// Delete a Flag
$deleted = $flagManager->delete($requestData);
// Update a Flag
$updated = $flagManager->update($requestData);
// Get all Flags
$flags = $flagManager->all();
```
\ No newline at end of file
{
"name": "btrepo/flags",
"description": "Flag Manager for Baytech Sites.",
"version": "1.0.3",
"type": "package",
"autoload": {
"psr-0": {
"BTFlags": "src/"
},
"psr-4": {
"BTFlags\\": "src/"
}
},
"authors": [
{
"name": "Joshua",
"email": "josh@baytech.ph"
}
]
}
<?php
namespace BTFlags;
class FlagManager {
private $flagsFile;
private $errors;
public function __construct(){
$this->errors = [];
$this->flagsFile = FLAGS_DIR . DIRECTORY_SEPARATOR . 'flags.json';
}
private function checkDir(){
if(!defined("FLAGS_DIR")) throw new \Exception("constant FLAGS_DIR is undefined. Make sure to add it in your constants.php file.");
}
public function create($flagData){
$this->checkDir();
$created = true;
$flags = $this->all();
if($flags && count(array_filter($flags, function($flag) use ($flagData){
return $flag['name'] == $flagData['name'] || $flag['encrypted_name'] == $flagData['encrypted_name'];
}))){
$this->errors[] = 'Flag already exists.';
return false;
}
try {
$flags[] = $flagData;
file_put_contents($this->flagsFile, json_encode($flags));
} catch(\Exception $e){
$created = false;
$this->errors[] = 'Creating a flag failed. Please try again.';
}
return $created;
}
public function delete($flagData){
$this->checkDir();
$deleted = true;
$flags = $this->all();
if($flags && !count(array_filter($flags, function($flag) use ($flagData){
return $flag['name'] == $flagData['name'] || $flag['encrypted_name'] == $flagData['encrypted_name'];
}))){
$this->errors[] = 'Unable to find flag: ' . $flagData['name'];
return false;
}
$filteredFlags = array_filter($flags, function($flag) use ($flagData){
return $flag['name'] != $flagData['name'] || $flag['encrypted_name'] != $flagData['encrypted_name'];
});
try {
file_put_contents($this->flagsFile, json_encode($filteredFlags));
} catch(\Exception $e){
$deleted = false;
$this->errors[] = 'Deleting the flag failed. Please try again.';
}
return $deleted;
}
public function update($flagData){
$this->checkDir();
$updated = true;
$flags = $this->all();
if($flags && !count(array_filter($flags, function($flag) use ($flagData){
return $flag['name'] == $flagData['old_name'] && $flag['encrypted_name'] == $flagData['old_encrypted_name'];
}))){
$this->errors[] = 'Unable to find flag: ' . $flagData['old_name'];
return false;
}
$filteredFlags = array_filter($flags, function($flag) use ($flagData){
return $flag['name'] == $flagData['old_name'] && $flag['encrypted_name'] == $flagData['old_encrypted_name'];
});
if(!isset(array_keys($filteredFlags)[0])) return false;
unset($flagData['old_name']);
unset($flagData['old_encrypted_name']);
try {
$flags[array_keys($filteredFlags)[0]] = $flagData;
file_put_contents($this->flagsFile, json_encode($flags));
} catch(\Exception $e){
$updated = false;
$this->errors[] = 'Updating the flag failed. Please try again.';
}
return $updated;
}
public function getAllForTable($tableOptions){
$this->checkDir();
$flags = $this->all();
if(!$flags) return [];
foreach($flags as $index => $flag){
$flags[$index]['combined_values'] = !$flags[$index]['is_filtered'] ? 'Anything' : '';
if(!$flags[$index]['is_filtered']) continue;
foreach($flag['accepted_values'] as $acceptedValue){
if(is_null($acceptedValue['value']) || !trim($acceptedValue['value'])) continue;
$flags[$index]['combined_values'] .= $acceptedValue['value'] . ' -> ' . $acceptedValue['encrypted_value'] . '<br>';
}
}
$flags = $this->filterFlags($flags, $tableOptions);
return array_slice($flags, (($tableOptions['page'] - 1) * $tableOptions['perPage']), $tableOptions['perPage']);
}
private function filterFlags($flags, $tableOptions){
$this->checkDir();
if(!empty($tableOptions['filter'])){
$filter = $tableOptions['filter'];
$flags = array_filter($flags, function($flag) use ($filter) {
return trim($flag['name']) == trim($filter) || trim($flag['encrypted_name']) == trim($filter);
});
}
return $flags;
}
public function getAllCountForTable($tableOptions){
$this->checkDir();
$flags = $this->all();
if(!$flags) return 0;
$flags = $this->filterFlags($flags, $tableOptions);
return count($flags);
}
public function all(){
$this->checkDir();
$flags = [];
$retrieved = true;
try {
$flags = json_decode(@file_get_contents($this->flagsFile), true);
} catch(\Exception $e){
$retrieved = false;
$this->errors[] = 'Cannot retrieve flags. Please try again';
}
return $retrieved ? $flags : false;
}
public function errors(){
return $this->errors;
}
public function register(){
$this->checkDir();
$flags = $this->all();
if(!$flags) return [];
foreach($flags as $flag){
$value = $this->checkFlag($flag, !empty($flag['default']) ? $flag['default'] : null);
setcookie($flag['encrypted_name'], $value, time() + (86400 * 30), "/");
}
}
private function filterFlag($flag, $needle, $defaultValue){
$this->checkDir();
if(!$flag['is_filtered']) return $needle;
$acceptedValues = $flag['accepted_values'];
return count(array_filter($acceptedValues, function($value) use ($needle) {
return $value['encrypted_value'] == $needle;
})) ? $needle : $defaultValue;
}
public function checkFlag($flag, $defaultValue, $driver = 'cookie'){
$this->checkDir();
$flagEncryptedName = $flag['encrypted_name'];
// Cookie Driver
if($driver == 'cookie') return !empty($_GET[$flagEncryptedName]) ? $this->filterFlag($flag, $_GET[$flagEncryptedName], $defaultValue) : (!empty($_COOKIE[$flagEncryptedName]) ? $this->filterFlag($flag, $_COOKIE[$flagEncryptedName], $defaultValue) : $defaultValue);
// Session Driver
return !empty($_GET[$flagEncryptedName]) ? $this->filterFlag($flag, $_GET[$flagEncryptedName], $defaultValue) : ($_SESSION[$flagEncryptedName] ? $this->filterFlag($flag, $_SESSION[$flagEncryptedName], $defaultValue) : $defaultValue);
}
private function filter($flag, $value, $default){
$this->checkDir();
$filters = [
'pmt' => ['rec', 'st']
];
if(isset($filters[$flag])) return (in_array($value, $filters[$flag]))? $value:$default;
return $value;
}
public function getFlag($flag, $encrypted){
$this->checkDir();
$flags = $this->all();
if(!$flags) return [];
$filteredFlags = array_values(array_filter($flags, function($f) use ($flag, $encrypted){
return ($encrypted ? $f['encrypted_name'] : $f['name']) == $flag;
}));
return count($filteredFlags) ? $filteredFlags[0] : null;
}
}
\ No newline at end of file
<?php
namespace BTFlags;
use BTFlags\FlagManager;
class Flags{
/**
* Retrieves the decrypted value of a flag
*
* @param string $flag Name of the flag.
* @param bool $encrypted True, if the passed $flag is an encrypted value.
* @param string $defaultValue Default value of a flag if the flag does not exist in the specified storage driver.
* @param string $driver Storage driver.
*
* @return string
*/
public static function get($flagName, $encrypted = false, $defaultValue, $driver = 'cookie'){
$flagManager = new FlagManager();
$flag = $flagManager->getFlag($flagName, $encrypted);
if(!$flag) return null;
$flagFromStorage = self::findFlagFromStorage($encrypted ? $flagName : $flag['encrypted_name'], $defaultValue ? $defaultValue : (isset($flag['has_default']) && $flag['has_default'] ? $flag['default'] : null), $driver);
if(!$flag['is_filtered']) return $flagFromStorage;
$filteredFlag = null;
if($flag['is_filtered']){
$filteredFlag = array_values(array_filter($flag['accepted_values'], function($value) use ($flagFromStorage, $encrypted){ return $value['encrypted_value'] == $flagFromStorage; }));
}
$filteredValue = array_values(array_filter($flag['accepted_values'], function($value) use ($flag){ return $value['encrypted_value'] == $flag['default']; }));
return $filteredFlag && isset($filteredFlag[0]) ? $filteredFlag[0]['value'] : ($flag['is_encrypted'] && isset($filteredValue[0]['value']) ? $filteredValue[0]['value'] : $flag['default']);
}
/**
* Look for the flag inside the specified storage driver.
*
* @param string $flag Name of the flag.
* @param string $defaultValue Default value of a flag if the flag does not exist in the specified storage driver.
* @param string $driver Storage driver.
*
* @return string
*/
private static function findFlagFromStorage($flag, $defaultValue, $driver){
// Cookie Driver
if($driver == 'cookie') return isset($_GET[$flag]) ? $_GET[$flag] : (isset($_COOKIE[$flag]) ? $_COOKIE[$flag] : $defaultValue);
// Session Driver
return isset($_GET[$flag]) ? $_GET[$flag] : ($_SESSION[$flag] ? $_SESSION[$flag] : $defaultValue);
}
}
\ No newline at end of file
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!