diff --git a/modules/radar/radar_services/plugins/services_entity/resource_controller.inc b/modules/radar/radar_services/plugins/services_entity/resource_controller.inc index 21279369e48d936a3c0012e13b287c00344b1156..2c00f6171ecc5f884e45e47da8fd52c91c6a58d9 100644 --- a/modules/radar/radar_services/plugins/services_entity/resource_controller.inc +++ b/modules/radar/radar_services/plugins/services_entity/resource_controller.inc @@ -12,11 +12,27 @@ */ class RadarServicesEntityResourceController extends ServicesEntityResourceControllerClean { - /** - * Extends ServicesResourceControllerInterface::access(). - * - * Default services access does not load by UUID. - */ + protected $apiVersion = ''; + + /** + * Set API version. + */ + public function setApiVersion($version) { + $this->apiVersion = $version; + } + + /** + * Get API version. + */ + public function getApiVersion() { + return $this->apiVersion; + } + + /** + * Extends ServicesResourceControllerInterface::access(). + * + * Default services access does not load by UUID. + */ public function access($op, $args) { if ($op == 'index') { // Access is handled per-entity by index(). @@ -177,18 +193,20 @@ class RadarServicesEntityResourceController extends ServicesEntityResourceContro // For referenced entities only return the URI. if ($id = $property->getIdentifier()) { $data[$name] = $this->get_resource_reference($property->type(), $id); - // So in common with some of our other errors the entity won't load - // here as it's a UUID. Replacing the entity controller would - // probably do it? For now fix the issue at hand. - $entity_info = entity_get_info($property->type()); - $entities = entity_uuid_load($property->type(), [$id]); - $entity_label = empty($entity_info['entity keys']['label']) ? 'label' : $entity_info['entity keys']['label']; - if (!empty($entities)) { - $entity = reset($entities); - $data[$name][$entity_label] = entity_label($property->type(), $entity); - } - else { - $data[$name][$entity_label] = ''; + if (version_compare($this->getApiVersion(), '1.2', '>=')) { + // So in common with some of our other errors the entity won't load + // here as it's a UUID. Replacing the entity controller would + // probably do it? For now fix the issue at hand. + $entity_info = entity_get_info($property->type()); + $entities = entity_uuid_load($property->type(), [$id]); + $entity_label = empty($entity_info['entity keys']['label']) ? 'label' : $entity_info['entity keys']['label']; + if (!empty($entities)) { + $entity = reset($entities); + $data[$name][$entity_label] = entity_label($property->type(), $entity); + } + else { + $data[$name][$entity_label] = ''; + } } } } diff --git a/modules/radar/radar_services/radar_services.info b/modules/radar/radar_services/radar_services.info index 6b11ae18bad17ee56560661ae80bb26499a0850e..28f50337a33cfb817983148a0644dfa949b5bbe3 100644 --- a/modules/radar/radar_services/radar_services.info +++ b/modules/radar/radar_services/radar_services.info @@ -15,6 +15,7 @@ features[ctools][] = strongarm:strongarm:1 features[features_api][] = api:2 features[services_endpoint][] = api_1_0 features[services_endpoint][] = api_1_1 +features[services_endpoint][] = api_1_2 features[user_permission][] = services_search_api search from any index features[variable][] = services_entity_resource_class features[variable][] = uuid_services_support_all_entity_types diff --git a/modules/radar/radar_services/radar_services.module b/modules/radar/radar_services/radar_services.module index 7bfa4b348d62e7af9df766910e0b7c8a4b783b8e..624370916cf02a9d0b937ba85d79c20293627219 100644 --- a/modules/radar/radar_services/radar_services.module +++ b/modules/radar/radar_services/radar_services.module @@ -29,6 +29,25 @@ function radar_services_services_resources() { 'description' => t('Language code for language preference when translation available.'), 'source' => array('param' => 'language'), ); + + // Only extending the searvices_search_api module implementation further. + // However this can't be done in the alter hook for whatever reason. + $default = services_search_api_services_resources(); + $resources['search_api_1_2'] = $default['search_api']; + $resources['search_api_1_2']['retrieve']['callback'] = '_radar_services_search_api_resource_retrieve_1_2'; + $resources['search_api_1_2']['retrieve']['file'] = array( + 'type' => 'inc', + 'module' => 'radar_services', + 'name' => 'radar_services.resources', + ); + $resources['search_api_1_2']['retrieve']['args'][] = array( + 'name' => 'language', + 'optional' => TRUE, + 'default value' => LANGUAGE_NONE, + 'type' => 'string', + 'description' => t('Language code for language preference when translation available.'), + 'source' => array('param' => 'language'), + ); return $resources; } @@ -82,7 +101,8 @@ function radar_services_services_entity_resource_info() { */ function radar_services_services_request_preprocess_alter($controller, &$args, $options) { if ($controller['callback'] != '_radar_services_search_api_resource_retrieve' - && $controller['callback'] != '_radar_services_search_api_resource_retrieve_1_1') { + && $controller['callback'] != '_radar_services_search_api_resource_retrieve_1_1' + && $controller['callback'] != '_radar_services_search_api_resource_retrieve_1_2') { return; } diff --git a/modules/radar/radar_services/radar_services.resources.inc b/modules/radar/radar_services/radar_services.resources.inc index d7091d10150047782cbea9f8a6375c44dc227d05..193154e78f98e1b8faa0fb8e7572726e3766e929 100644 --- a/modules/radar/radar_services/radar_services.resources.inc +++ b/modules/radar/radar_services/radar_services.resources.inc @@ -4,6 +4,24 @@ * Extends services_search_api.resources.inc */ +/** + * Callback function for the index service call v1.1. + * + * Adds labels to referenced entities. + * + * @see _services_search_api_resource_retrieve() + */ +function _radar_services_search_api_resource_retrieve_1_2($index, $keys = '', $filter, $sort, $limit, $offset, $fields, $language) { + $query = _radar_services_search_api_execute_query($index, $keys, $filter, $sort, $limit, $offset, $fields, $language); + $result = $query->execute(); + $output = array( + 'result' => _radar_services_search_api_process_results($result, $query, $fields, $language, '1.2'), + 'count' => $result['result count'], + 'facets' => _radar_services_search_api_process_facets($result, $query, $fields, $language), + ); + return $output; +} + /** * Callback function for the index service call v1.1. * @@ -15,7 +33,7 @@ function _radar_services_search_api_resource_retrieve_1_1($index, $keys = '', $f $query = _radar_services_search_api_execute_query($index, $keys, $filter, $sort, $limit, $offset, $fields, $language); $result = $query->execute(); $output = array( - 'result' => _radar_services_search_api_process_results($result, $query, $fields, $language), + 'result' => _radar_services_search_api_process_results($result, $query, $fields, $language, '1.1'), 'count' => $result['result count'], 'facets' => _radar_services_search_api_process_facets($result, $query, $fields, $language), ); @@ -32,7 +50,7 @@ function _radar_services_search_api_resource_retrieve_1_1($index, $keys = '', $f function _radar_services_search_api_resource_retrieve($index, $keys = '', $filter, $sort, $limit, $offset, $fields, $language) { $query = _radar_services_search_api_execute_query($index, $keys, $filter, $sort, $limit, $offset, $fields, $language); $result = $query->execute(); - return _radar_services_search_api_process_results($result, $query, $fields, $language); + return _radar_services_search_api_process_results($result, $query, $fields, $language, '1.0'); } /** @@ -75,7 +93,7 @@ function _radar_services_search_api_execute_query($index, $keys, $filter, $sort, * * @see _services_search_api_process_results() */ -function _radar_services_search_api_process_results(&$result, $query, $fields, $language) { +function _radar_services_search_api_process_results(&$result, $query, $fields, $language, $version) { if (empty($result['results']) || !is_array($result['results'])) { return FALSE; } @@ -90,7 +108,10 @@ function _radar_services_search_api_process_results(&$result, $query, $fields, $ drupal_alter('services_search_api_postprocess', $entities, $entity_type); $resourceclass = variable_get('services_entity_resource_class', 'RadarServicesEntityResourceController'); - $resource = new $resourceclass; + $resource = new $resourceclass(); + if (method_exists($resource, 'setApiVersion')) { + $resource->setApiVersion($version); + } $fields = implode(',', $fields); foreach ($entities as $entity_id => $entity) { try { diff --git a/modules/radar/radar_services/radar_services.services.inc b/modules/radar/radar_services/radar_services.services.inc index a1fc310890b17a0bd9c3f271269c0541802d1058..466d05b2dcf835ba49477a914702c6ee235377ff 100644 --- a/modules/radar/radar_services/radar_services.services.inc +++ b/modules/radar/radar_services/radar_services.services.inc @@ -210,5 +210,105 @@ function radar_services_default_services_endpoint() { $endpoint->debug = 0; $export['api_1_1'] = $endpoint; + $endpoint = new stdClass(); + $endpoint->disabled = FALSE; /* Edit this to true to make a default endpoint disabled initially */ + $endpoint->api_version = 3; + $endpoint->name = 'api_1_2'; + $endpoint->server = 'rest_server'; + $endpoint->path = 'api/1.2'; + $endpoint->authentication = array( + 'services' => 'services', + ); + $endpoint->server_settings = array(); + $endpoint->resources = array( + 'entity_file' => array( + 'alias' => 'file', + 'operations' => array( + 'retrieve' => array( + 'enabled' => '1', + ), + 'update' => array( + 'enabled' => '1', + ), + 'create' => array( + 'enabled' => '1', + ), + ), + ), + 'group_events' => array( + 'operations' => array( + 'index' => array( + 'enabled' => '1', + ), + ), + ), + 'entity_location' => array( + 'alias' => 'location', + 'operations' => array( + 'create' => array( + 'enabled' => '1', + ), + 'retrieve' => array( + 'enabled' => '1', + ), + 'update' => array( + 'enabled' => '1', + ), + ), + ), + 'entity_node' => array( + 'alias' => 'node', + 'operations' => array( + 'create' => array( + 'enabled' => '1', + ), + 'retrieve' => array( + 'enabled' => '1', + ), + 'update' => array( + 'enabled' => '1', + ), + ), + ), + 'search_api_1_2' => array( + 'alias' => 'search', + 'operations' => array( + 'retrieve' => array( + 'enabled' => '1', + ), + ), + ), + 'entity_taxonomy_term' => array( + 'alias' => 'taxonomy_term', + 'operations' => array( + 'create' => array( + 'enabled' => '1', + ), + 'retrieve' => array( + 'enabled' => '1', + ), + 'update' => array( + 'enabled' => '1', + ), + ), + ), + 'entity_user' => array( + 'alias' => 'user', + 'actions' => array( + 'login' => array( + 'enabled' => '1', + ), + 'logout' => array( + 'enabled' => '1', + ), + 'token' => array( + 'enabled' => '1', + ), + ), + ), + ); + $endpoint->debug = 0; + $export['api_1_2'] = $endpoint; + return $export; }