*/
class Mage_Api2_Model_Config extends Varien_Simplexml_Config
{
/**
* Node name of resource groups
*/
const NODE_RESOURCE_GROUPS = 'resource_groups';
/**
* Id for config cache
*/
const CACHE_ID = 'config_api2';
/**
* Tag name for config cache
*/
const CACHE_TAG = 'CONFIG_API2';
/**
* Is resources added to group
*
* @var boolean
*/
protected $_resourcesGrouped = false;
/**
* Constructor
* Initializes XML for this configuration
* Local cache configuration
*
* @param string|Varien_Simplexml_Element|null $sourceData
*/
public function __construct($sourceData = null)
{
parent::__construct($sourceData);
$canUserCache = Mage::app()->useCache('config');
if ($canUserCache) {
$this->setCacheId(self::CACHE_ID)
->setCacheTags(array(self::CACHE_TAG))
->setCacheChecksum(null)
->setCache(Mage::app()->getCache());
if ($this->loadCache()) {
return;
}
}
// Load data of config files api2.xml
$config = Mage::getConfig()->loadModulesConfiguration('api2.xml');
$this->setXml($config->getNode('api2'));
if ($canUserCache) {
$this->saveCache();
}
}
/**
* Fetch all routes of the given api type from config files api2.xml
*
* @param string $apiType
* @throws Mage_Api2_Exception
* @return array
*/
public function getRoutes($apiType)
{
/** @var $helper Mage_Api2_Helper_Data */
$helper = Mage::helper('api2');
if (!$helper->isApiTypeSupported($apiType)) {
throw new Mage_Api2_Exception(sprintf('API type "%s" is not supported', $apiType),
Mage_Api2_Model_Server::HTTP_BAD_REQUEST);
}
$routes = array();
foreach ($this->getResources() as $resourceKey => $resource) {
if (!$resource->routes) {
continue;
}
/** @var $routes Varien_Simplexml_Element */
foreach ($resource->routes->children() as $route) {
$arguments = array(
Mage_Api2_Model_Route_Abstract::PARAM_ROUTE => (string)$route->route,
Mage_Api2_Model_Route_Abstract::PARAM_DEFAULTS => array(
'model' => (string)$resource->model,
'type' => (string)$resourceKey,
'action_type' => (string)$route->action_type
)
);
$routes[] = Mage::getModel('api2/route_' . $apiType, $arguments);
}
}
return $routes;
}
/**
* Retrieve all resources from config files api2.xml
*
* @return Varien_Simplexml_Element
*/
public function getResources()
{
return $this->getNode('resources')->children();
}
/**
* Retrieve all resources types
*
* @return array
*/
public function getResourcesTypes()
{
$list = array();
foreach ($this->getResources() as $resourceType => $resourceCfg) {
$list[] = (string) $resourceType;
}
return $list;
}
/**
* Retrieve all resource groups from config files api2.xml
*
* @return Varien_Simplexml_Element|boolean
*/
public function getResourceGroups()
{
$groups = $this->getXpath('//' . self::NODE_RESOURCE_GROUPS);
if (!$groups) {
return false;
}
/** @var $groups Varien_Simplexml_Element */
$groups = $groups[0];
if (!$this->_resourcesGrouped) {
/** @var $node Varien_Simplexml_Element */
foreach ($this->getResources() as $node) {
$result = $node->xpath('group');
if (!$result) {
continue;
}
$groupName = (string) $result[0];
if ($groupName) {
$result = $groups->xpath('.//' . $groupName);
if (!$result) {
continue;
}
/** @var $group Varien_Simplexml_Element */
$group = $result[0];
if (!isset($group->children)) {
$children = new Varien_Simplexml_Element('');
} else {
$children = $group->children;
}
$node->resource = 1;
$children->appendChild($node);
$group->appendChild($children);
}
}
}
return $groups;
}
/**
* Retrieve resource group from config files api2.xml
*
* @param string $name
* @return Mage_Core_Model_Config_Element|boolean
*/
public function getResourceGroup($name)
{
$group = $this->getResourceGroups()->xpath('.//' . $name);
if (!$group) {
return false;
}
return $group[0];
}
/**
* Retrieve resource by type (node)
*
* @param string $node
* @return Varien_Simplexml_Element|boolean
*/
public function getResource($node)
{
return $this->getNode('resources/' . $node);
}
/**
* Retrieve resource attributes
*
* @param string $node
* @return array
*/
public function getResourceAttributes($node)
{
$attributes = $this->getNode('resources/' . $node . '/attributes');
return $attributes ? $attributes->asCanonicalArray() : array();
}
/**
* Get excluded attributes of API resource
*
* @param string $resource
* @param string $userType
* @param string $operation
* @return array
*/
public function getResourceExcludedAttributes($resource, $userType, $operation)
{
$node = $this->getNode('resources/' . $resource . '/exclude_attributes/' . $userType . '/' . $operation);
$exclAttributes = array();
if ($node) {
foreach ($node->children() as $attribute => $status) {
if ((string) $status) {
$exclAttributes[] = $attribute;
}
}
}
return $exclAttributes;
}
/**
* Get forced attributes of API resource
*
* @param string $resource
* @param string $userType
* @return array
*/
public function getResourceForcedAttributes($resource, $userType)
{
$node = $this->getNode('resources/' . $resource . '/force_attributes/' . $userType);
$forcedAttributes = array();
if ($node) {
foreach ($node->children() as $attribute => $status) {
if ((string) $status) {
$forcedAttributes[] = $attribute;
}
}
}
return $forcedAttributes;
}
/**
* Get included attributes
*
* @param string $resource API resource ID
* @param string $userType API user type
* @param string $operationType Type of operation: one of Mage_Api2_Model_Resource::OPERATION_ATTRIBUTE_... constant
* @return array
*/
public function getResourceIncludedAttributes($resource, $userType, $operationType)
{
$node = $this->getNode('resources/' . $resource . '/include_attributes/' . $userType . '/' . $operationType);
$inclAttributes = array();
if ($node) {
foreach ($node->children() as $attribute => $status) {
if ((string) $status) {
$inclAttributes[] = $attribute;
}
}
}
return $inclAttributes;
}
/**
* Get entity only attributes
*
* @param string $resource API resource ID
* @param string $userType API user type
* @param string $operationType Type of operation: one of Mage_Api2_Model_Resource::OPERATION_ATTRIBUTE_... constant
* @return array
*/
public function getResourceEntityOnlyAttributes($resource, $userType, $operationType)
{
$node = $this->getNode('resources/' . $resource . '/entity_only_attributes/' . $userType . '/' .
$operationType);
$entityOnlyAttributes = array();
if ($node) {
foreach ($node->children() as $attribute => $status) {
if ((string) $status) {
$entityOnlyAttributes[] = $attribute;
}
}
}
return $entityOnlyAttributes;
}
/**
* Retrieve resource working model
*
* @param string $node
* @return string
*/
public function getResourceWorkingModel($node)
{
return (string)$this->getNode('resources/' . $node . '/working_model');
}
/**
* Get resource allowed versions sorted in reverse order
*
* @param string $node
* @return array
* @throws Exception
*/
public function getVersions($node)
{
$element = $this->getNode('resources/' . $node . '/versions');
if (!$element) {
throw new Exception(
sprintf('Resource "%s" does not have node in config.', htmlspecialchars($node))
);
}
$versions = explode(',', (string)$element);
if (count(array_filter($versions, 'is_numeric')) != count($versions)) {
throw new Exception(sprintf('Invalid resource "%s" versions in config.', htmlspecialchars($node)));
}
rsort($versions, SORT_NUMERIC);
return $versions;
}
/**
* Retrieve resource model
*
* @param string $node
* @return string
*/
public function getResourceModel($node)
{
return (string)$this->getNode('resources/' . $node . '/model');
}
/**
* Retrieve API user privileges for specified resource
*
* @param string $resource
* @param string $userType
* @return array
*/
public function getResourceUserPrivileges($resource, $userType)
{
$attributes = $this->getNode('resources/' . $resource . '/privileges/' . $userType);
return $attributes ? $attributes->asCanonicalArray() : array();
}
/**
* Retrieve resource subresources
*
* @param string $node
* @return array
*/
public function getResourceSubresources($node)
{
$subresources = $this->getNode('resources/' . $node . '/subresources');
return $subresources ? $subresources->asCanonicalArray() : array();
}
/**
* Get validation config by validator type
*
* @param string $resourceType
* @param string $validatorType
* @return array
*/
public function getValidationConfig($resourceType, $validatorType)
{
$config = $this->getNode('resources/' . $resourceType . '/validators/' . $validatorType);
return $config ? $config->asCanonicalArray() : array();
}
/**
* Get latest version of resource model. If second arg is specified - use it as a limiter
*
* @param string $resourceType Resource type
* @param int $lowerOrEqualsTo OPTIONAL If specified - return version equal or lower to
* @return int
*/
public function getResourceLastVersion($resourceType, $lowerOrEqualsTo = null)
{
$availVersions = $this->getVersions($resourceType); // already ordered in reverse order
$useVersion = reset($availVersions);
if (null !== $lowerOrEqualsTo) {
foreach ($availVersions as $availVersion) {
if ($availVersion <= $lowerOrEqualsTo) {
$useVersion = $availVersion;
break;
}
}
}
return (int)$useVersion;
}
/**
* Get route with Mage_Api2_Model_Resource::ACTION_TYPE_ENTITY type
*
* @param string $node
* @return string
*/
public function getRouteWithEntityTypeAction($node)
{
return (string)$this->getNode('resources/' . $node . '/routes/route_entity/route');
}
}