/**
  * @test
  */
 public function arrayUnderscoreKeyToCameCaseKey()
 {
     $underscoreKey = array('do_some_thing_else' => 'test', 'something_else' => 'test', 'camel_case' => 'test');
     $excepted = array('doSomeThingElse' => 'test', 'somethingElse' => 'test', 'camelCase' => 'test');
     $this->assertEquals($excepted, RegexHelper::arrayUnderscoreKeyToCameCaseKey($underscoreKey));
 }
 /**
  * @test
  */
 public function toUnderscore()
 {
     $this->assertEquals('camel_case', RegexHelper::toUnderscore('camelCase'));
     $this->assertEquals('something_weird', RegexHelper::toUnderscore('SOMEthingWeird'));
     $this->assertEquals('this_is_not_good', RegexHelper::toUnderscore('thisIsNot_GOOD'));
 }
 /**
  * Create an array will the valid items for search and replacing with templates
  *
  * @static
  *
  * @param $type
  * @param $database
  * @param $table
  * @param $class
  * @param $namespace
  *
  * @return array
  *
  * @throws \Exception
  */
 private static function buildSearchReplaceArray($type, $database, $table, $class, $namespace)
 {
     $database = Configuration::getTrueDatabaseName($database);
     $builderConfiguration = Configuration::getOption('model_builder');
     $tableConfiguration = $builderConfiguration['relational']['databases'][$database]['tables'];
     $tableAlias = !empty($tableConfiguration[$table]['alias']) ? $tableConfiguration[$table]['alias'] : $table;
     $dataSource = DataSourceFactory::buildFromConfiguration('default');
     $parsingTokens = array();
     $stringReplaceArray = array();
     if ($type == 'full') {
         foreach (self::$templateTokens as $tokens) {
             $parsingTokens = array_merge($parsingTokens, $tokens);
         }
     } else {
         if (array_key_exists($type, self::$templateTokens)) {
             $parsingTokens = self::$templateTokens[$type];
         } else {
             throw new \Exception("Invalid type ({$type}) for building token list");
         }
     }
     $autoIncrementField = null;
     $primaryKeyArray = array();
     $tableArray = array('name' => $table, 'alias' => $tableAlias);
     $fieldsArray = array();
     $skipSaveMembersArray = !empty($tableConfiguration[$table]['skip_save_members']) ? $tableConfiguration[$table]['skip_save_members'] : array();
     $tableFieldDetails = $dataSource->getTableFieldsDetails($table, $database);
     foreach ($tableFieldDetails as $fieldDetails) {
         if ($fieldDetails['auto_increment'] === true) {
             $autoIncrementField = $fieldDetails['field'];
         }
         if ($fieldDetails['key_type'] == 'primary') {
             $primaryKeyArray[] = $fieldDetails['field'];
         }
         $memberNameParts = explode('_', RegexHelper::toUnderscore($fieldDetails['field']));
         $memberName = '';
         foreach ($memberNameParts as $part) {
             $memberName .= ucwords(strtolower($part));
         }
         $memberName = lcfirst($memberName);
         $fieldsArray[$memberName] = array('name' => $fieldDetails['field']);
         if (in_array($fieldDetails['field_type'], array('enum', 'set'))) {
             $fieldsArray[$memberName]['values'] = $dataSource->getFieldValues($table, $fieldDetails['field'], $database);
         }
     }
     //add in join fields
     if (!empty($tableConfiguration[$table]['join_fields'])) {
         foreach ($tableConfiguration[$table]['join_fields'] as $joinTable => $fields) {
             foreach ($fields as $options) {
                 $memberName = !empty($options['member_name']) ? $options['member_name'] : $options['field'];
                 $field = $options['field'];
                 $as = $options['field'];
                 if (!empty($options['as'])) {
                     $as = $options['as'];
                 } else {
                     if (!empty($options['member_name'])) {
                         $as = $options['member_name'];
                     }
                 }
                 $joinFieldData = array('name' => $field, 'join_table' => $joinTable);
                 if ($as != $options['field']) {
                     $joinFieldData['name'] .= ' AS ' . $as;
                 }
                 $fieldsArray[$memberName] = $joinFieldData;
             }
         }
     }
     foreach ($parsingTokens as $token) {
         $trueValue = null;
         switch ($token) {
             case 'namespace':
                 $trueValue = $namespace;
                 break;
             case 'class':
                 $trueValue = $class;
                 break;
             case 'database':
                 $trueValue = $database;
                 break;
             case 'primaryKeyArray':
                 $trueValue = self::arrayToPhpCodeString($primaryKeyArray);
                 break;
             case 'autoIncrementField':
                 $trueValue = $autoIncrementField;
                 break;
             case 'tableArray':
                 $trueValue = self::arrayToPhpCodeString($tableArray);
                 break;
             case 'joinsArray':
                 $joinsArray = array();
                 if (!empty($tableConfiguration[$table]['joins'])) {
                     foreach ($tableConfiguration[$table]['joins'] as $joinTable => $config) {
                         $temp['alias'] = !empty($tableConfiguration[$joinTable]['alias']) ? $tableConfiguration[$joinTable]['alias'] : $joinTable;
                         $temp['type'] = !empty($config['type']) ? $config['type'] : 'inner';
                         $temp['on'] = "`{$temp['alias']}`.`{$config['join_field']}` = `{$tableAlias}`.`{$config['field']}`";
                         if (!empty($config['database'])) {
                             $temp['database'] = $config['database'];
                         }
                         $joinsArray[$joinTable] = $temp;
                     }
                 }
                 $trueValue = self::arrayToPhpCodeString($joinsArray);
                 break;
             case 'fieldsArray':
                 $trueValue = self::arrayToPhpCodeString($fieldsArray);
                 break;
             case 'dataSourceConfiguration':
                 $trueValue = 'default';
                 break;
             case 'skipSaveMembersArray':
                 $trueValue = self::arrayToPhpCodeString($skipSaveMembersArray);
                 break;
             case 'fields':
                 $trueValue = '';
                 foreach ($fieldsArray as $member => $options) {
                     if (!empty($trueValue)) {
                         $trueValue .= "\n";
                     } else {
                         $trueValue .= "\n\n";
                     }
                     $trueValue .= "    protected \${$member};";
                 }
                 break;
             default:
                 throw new \Exception("Token passed ({$token}) is not a valid token");
                 break;
         }
         $stringReplaceArray[self::$tokenWrapper . $token . self::$tokenWrapper] = $trueValue;
     }
     return $stringReplaceArray;
 }
 /**
  * Provide general create, update, and delete rest functionality for all controllers that set the rest full model name
  *
  * @param \Symfony\Component\HttpFoundation\Request $request
  * @param null|mixed $objectId
  * @param string $dataType
  *
  * @throws \Exception
  *
  * @return mixed
  */
 public function restProcessDataAction(Request $request, $objectId = null, $dataType = 'json')
 {
     $objectName = $this->getRestFullModelName();
     $httpMethod = $request->getMethod();
     $user = new $objectName($objectId);
     $message = null;
     if ($httpMethod == 'DELETE') {
         if (!$user instanceof $objectName) {
             throw new \Exception('Unable to load record for deletion');
         }
         $user->delete();
         $status = 'success';
     } else {
         $parsedData = $this->restProcessData($request);
         $data = RegexHelper::arrayUnderscoreKeyToCameCaseKey($parsedData['contentData']);
         $user->loadByArray($data, false);
         $user->save();
         $status = 'success';
     }
     $data = array($this->getRestObjectNameSingular() => $httpMethod !== 'DELETE' ? $user->toArray() : array());
     $method = 'render' . ucfirst($dataType);
     return $this->{$method}(array('status' => $status, 'data' => $data, 'message' => $message));
 }