Esempio n. 1
0
 /**
  * @param FREST\Resource $resource
  * @return array
  * @throws FREST\Exception
  */
 private function generateCreateSpecs($resource)
 {
     $createSpecs = array();
     $createSettings = $resource->getCreateSettings();
     if (isset($this->resourceID)) {
         /** @var Setting\Field $idFieldSetting */
         $idFieldName = $this->resource->getIDField($idFieldSetting);
         $idAlias = $this->resource->getAliasForField($idFieldName);
         $idCreateSpec = new Spec\Create($idAlias, $idFieldName, $this->resourceID, $idFieldSetting->getVariableType());
         $createSpecs[$idAlias] = $idCreateSpec;
     }
     /** @var Setting\Create $createSetting */
     foreach ($createSettings as $createSetting) {
         $alias = $createSetting->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 = $createSetting->getConditionFunction();
             if (isset($conditionFunction)) {
                 if (!method_exists($resource, $conditionFunction)) {
                     throw new FREST\Exception(FREST\Exception::ConditionFunctionMissing, "Function name: '{$conditionFunction}', resource: '{$this->resource->getName()}'");
                 }
                 $isValueValid = $resource->{$conditionFunction}($castedValue);
                 if (!$isValueValid) {
                     throw new FREST\Exception(FREST\Exception::InvalidFieldValue, "Field: '{$alias}'");
                 }
             }
             // Filter Func
             $filterFunction = $createSetting->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);
             }
             $createSpec = new Spec\Create($alias, $field, $castedValue, $variableType);
             $createSpecs[$alias] = $createSpec;
         } else {
             if ($createSetting->getRequired()) {
                 // get list of all parameters required but not set
                 $missingParameters = array();
                 /** @var Setting\Create $aCreateSetting */
                 foreach ($createSettings as $aCreateSetting) {
                     $alias = $aCreateSetting->getAlias();
                     if (!isset($this->parameters[$alias]) && $aCreateSetting->getRequired()) {
                         $missingParameters[] = $alias;
                     }
                 }
                 $missingParametersString = implode(', ', $missingParameters);
                 throw new FREST\Exception(FREST\Exception::MissingRequiredParams, "Missing parameters: {$missingParametersString}");
             }
         }
     }
     if (count($createSpecs) > 0) {
         return $createSpecs;
     }
     return NULL;
 }