Пример #1
0
 /**
  * @param FREST\Resource $resource
  * @return array
  * @throws FREST\Exception
  */
 private function generateUpdateSpecs($resource)
 {
     $updateSpecs = array();
     $updateSettings = $resource->getUpdateSettings();
     /** @var Setting\Update $updateSetting */
     foreach ($updateSettings as $updateSetting) {
         $alias = $updateSetting->getAlias();
         if (isset($this->parameters[$alias])) {
             $value = $this->parameters[$alias];
             $field = $resource->getFieldForAlias($alias);
             $fieldSetting = $resource->getFieldSettingForAlias($alias);
             $variableType = $fieldSetting->getVariableType();
             // Type checking
             $castedValue = Type\Variable::castValue($value, $variableType);
             if (!isset($castedValue)) {
                 $typeString = Type\Variable::getString($variableType);
                 throw new FREST\Exception(FREST\Exception::InvalidType, "Expecting '{$alias}' to be of type '{$typeString}' but received '{$value}'");
             }
             // Condition Func
             $conditionFunction = $updateSetting->getConditionFunction();
             if (isset($conditionFunction)) {
                 if (!method_exists($resource, $conditionFunction)) {
                     throw new FREST\Exception(FREST\Exception::ConditionFunctionMissing, "Function name: '{$conditionFunction}', resource: '{$resource->getName()}'");
                 }
                 $isValueValid = $resource->{$conditionFunction}($castedValue);
                 if (!$isValueValid) {
                     throw new FREST\Exception(FREST\Exception::InvalidFieldValue, "Field: '{$alias}'");
                 }
             }
             // Filter Func
             $filterFunction = $updateSetting->getFilterFunction();
             if (isset($filterFunction)) {
                 if (!method_exists($resource, $filterFunction)) {
                     throw new FREST\Exception(FREST\Exception::FilterFunctionMissing, "Function name: '{$filterFunction}', resource: '{$resource->getName()}'");
                 }
                 $castedValue = $resource->{$filterFunction}($castedValue);
             }
             $updateSpec = new Spec\Update($alias, $field, $castedValue, $variableType);
             $updateSpecs[$alias] = $updateSpec;
         }
     }
     return $updateSpecs;
 }