/** * @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; }