Bulk Edition, BgProcesses review. Removal of export endpoint. #290.
This commit is contained in:
parent
eb9b18565c
commit
8e22b74ea5
|
@ -272,11 +272,11 @@ class REST_Controller extends \WP_REST_Controller {
|
|||
*/
|
||||
public function get_fetch_only_param(){
|
||||
return [
|
||||
'fetch_only' => [
|
||||
'fetch_only' => array(
|
||||
'type' => 'string/array',
|
||||
'description' => __( 'Fetch only specific attribute. The specifics attributes are the same in schema.', 'tainacan' ),
|
||||
//TODO: explicar o fetch only meta.. cabe aqui?
|
||||
]
|
||||
)
|
||||
];
|
||||
}
|
||||
|
||||
|
|
|
@ -42,23 +42,33 @@ class REST_Background_Processes_Controller extends REST_Controller {
|
|||
],
|
||||
'all_users' => [
|
||||
'type' => 'bool',
|
||||
'description' => __( 'Whether to return processes from all users (if current user is admin). Default false.', 'tainacan' ),
|
||||
'description' => __( 'Whether to return processes from all users (if current user is admin).', 'tainacan' ),
|
||||
'default' => false,
|
||||
],
|
||||
'status' => [
|
||||
'type' => 'string',
|
||||
'description' => __( '"open" returns only processes currently running. "closed" returns only finished or aborted. "all" returns all. Default "all"', 'tainacan' ),
|
||||
'description' => __( '"open" returns only processes currently running. "closed" returns only finished or aborted. "all" returns all.', 'tainacan' ),
|
||||
'default' => 'all',
|
||||
'enum' => array(
|
||||
'open',
|
||||
'closed',
|
||||
'all'
|
||||
)
|
||||
],
|
||||
'perpage' => [
|
||||
'type' => 'integer',
|
||||
'description' => __( 'Number of processes to return per page. Default 10', 'tainacan' ),
|
||||
'description' => __( 'Number of processes to return per page', 'tainacan' ),
|
||||
'default' => 10,
|
||||
],
|
||||
'paged' => [
|
||||
'type' => 'integer',
|
||||
'description' => __( 'Page to retrieve. Default 1', 'tainacan' ),
|
||||
'description' => __( 'Page to retrieve', 'tainacan' ),
|
||||
'default' => 1
|
||||
],
|
||||
'recent' => [
|
||||
'type' => 'bool',
|
||||
'description' => __( 'Returns only processes created or updated recently', 'tainacan' ),
|
||||
'default' => false
|
||||
],
|
||||
],
|
||||
),
|
||||
|
@ -82,6 +92,10 @@ class REST_Background_Processes_Controller extends REST_Controller {
|
|||
'status' => [
|
||||
'type' => 'string',
|
||||
'description' => __( '"open" or "closed" ', 'tainacan' ),
|
||||
'enum' => array(
|
||||
'open',
|
||||
'closed'
|
||||
)
|
||||
]
|
||||
],
|
||||
),
|
||||
|
|
|
@ -455,9 +455,6 @@ class REST_Bulkedit_Controller extends REST_Controller {
|
|||
* @return array|void
|
||||
*/
|
||||
public function get_create_params($object_name = null) {
|
||||
$query_params['context']['default'] = 'view';
|
||||
|
||||
array_merge($query_params, parent::get_wp_query_params());
|
||||
|
||||
$query_params['title'] = array(
|
||||
'description' => __('Limits the result set to items with a specific title'),
|
||||
|
@ -477,7 +474,11 @@ class REST_Bulkedit_Controller extends REST_Controller {
|
|||
'description' => __( 'Whether to use the current query to select posts', 'tainacan' ),
|
||||
];
|
||||
|
||||
$query_params = array_merge($query_params, parent::get_meta_queries_params());
|
||||
$query_params = array_merge(
|
||||
$query_params,
|
||||
parent::get_wp_query_params(),
|
||||
parent::get_meta_queries_params()
|
||||
);
|
||||
|
||||
return $query_params;
|
||||
}
|
||||
|
|
|
@ -1,336 +0,0 @@
|
|||
<?php
|
||||
|
||||
namespace Tainacan\API\EndPoints;
|
||||
|
||||
use \Tainacan\API\REST_Controller;
|
||||
use Tainacan\Entities;
|
||||
use Tainacan\Repositories;
|
||||
use Tainacan\Entities\Entity;
|
||||
use Tainacan\Tests\TAINACAN_REST_Collections_Controller;
|
||||
|
||||
class REST_Export_Controller extends REST_Controller {
|
||||
private $item_metadata_repository;
|
||||
private $items_repository;
|
||||
private $collection_repository;
|
||||
private $metadatum_repository;
|
||||
|
||||
public function __construct() {
|
||||
$this->rest_base = 'export';
|
||||
parent::__construct();
|
||||
add_action('init', array(&$this, 'init_objects'), 11);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize objects after post_type register
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function init_objects() {
|
||||
$this->metadatum_repository = Repositories\Metadata::get_instance();
|
||||
$this->item_metadata_repository = Repositories\Item_Metadata::get_instance();
|
||||
$this->items_repository = Repositories\Items::get_instance();
|
||||
$this->collection_repository = Repositories\Collections::get_instance();
|
||||
}
|
||||
|
||||
/**
|
||||
* If POST on metadatum/collection/<collection_id>, then
|
||||
* a metadatum will be created in matched collection and all your item will receive this metadatum
|
||||
*
|
||||
* If POST on metadatum/item/<item_id>, then a value will be added in a metadatum and metadatum passed
|
||||
* id body of requisition
|
||||
*
|
||||
* Both of GETs return the metadatum of matched objects
|
||||
*
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function register_routes() {
|
||||
register_rest_route($this->namespace, '/' . $this->rest_base. '/collection/(?P<collection_id>[\d]+)',
|
||||
array(
|
||||
array(
|
||||
'methods' => \WP_REST_Server::READABLE,
|
||||
'callback' => array($this, 'get_items'),
|
||||
'permission_callback' => array($this, 'get_items_permissions_check'),
|
||||
'args' => $this->get_endpoint_args_for_item_schema(\WP_REST_Server::READABLE),
|
||||
),
|
||||
)
|
||||
);
|
||||
register_rest_route($this->namespace, '/' . $this->rest_base. '/item/(?P<item_id>[\d]+)',
|
||||
array(
|
||||
array(
|
||||
'methods' => \WP_REST_Server::READABLE,
|
||||
'callback' => array($this, 'get_item'),
|
||||
'permission_callback' => array($this, 'get_item_permissions_check'),
|
||||
'args' => $this->get_endpoint_args_for_item_schema(\WP_REST_Server::READABLE),
|
||||
),
|
||||
)
|
||||
);
|
||||
register_rest_route($this->namespace, '/' . $this->rest_base,
|
||||
array(
|
||||
array(
|
||||
'methods' => \WP_REST_Server::READABLE,
|
||||
'callback' => array($this, 'get_items'),
|
||||
'permission_callback' => array($this, 'get_items_permissions_check'),
|
||||
'args' => $this->get_wp_query_params(),
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \WP_REST_Request $request
|
||||
*
|
||||
* @return \WP_Error|\WP_REST_Response
|
||||
*/
|
||||
public function get_item( $request ) { }
|
||||
|
||||
/**
|
||||
* @param \WP_REST_Request $request
|
||||
*
|
||||
* @return bool|\WP_Error
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function get_item_permissions_check( $request ) {
|
||||
if(isset($request['collection_id'])) {
|
||||
$collection = $this->collection_repository->fetch($request['collection_id']);
|
||||
if($collection instanceof Entities\Collection) {
|
||||
if (! $collection->can_read()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} elseif(isset($request['item_id'])) {
|
||||
$item = $this->items_repository->fetch($request['item_id']);
|
||||
if($item instanceof Entities\Item) {
|
||||
if (! $item->can_read()) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
} else { // Exporting all
|
||||
$dummy = new Entities\Collection();
|
||||
return current_user_can($dummy->get_capabilities()->read); // Need to check Colletion by collection
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \Tainacan\Entities\Item $item
|
||||
* @param \WP_REST_Request $request
|
||||
*
|
||||
* @return array|\WP_Error|\WP_REST_Response
|
||||
*/
|
||||
public function prepare_item_for_response( $item, $request ) {
|
||||
$items_metadata = $item->get_metadata();
|
||||
|
||||
$prepared_item = [];
|
||||
|
||||
foreach ($items_metadata as $item_metadata){
|
||||
$prepared_item[] = $item_metadata->_toArray();
|
||||
}
|
||||
|
||||
return $prepared_item;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param \WP_REST_Request $request
|
||||
* @param \WP_Query|Entities\Item $query
|
||||
* @param array $args
|
||||
* @return \WP_Error|number
|
||||
*/
|
||||
public function export($request, $query, $args) {
|
||||
|
||||
$type = \Tainacan\Exposers_Handler::request_has_type($request);
|
||||
$path = wp_upload_dir();
|
||||
$path = $path['path'];
|
||||
$filename = $path.date('YmdHis').'-tainacan-export.'.$type->get_extension();
|
||||
$pid = -1;
|
||||
|
||||
$log = \Tainacan\Entities\Log::create(
|
||||
__('Export Process', 'tainacan'),
|
||||
__('Exporting Data', 'tainacan').'\nArgs: '.print_r($args, true),
|
||||
['file' => $filename],
|
||||
[],
|
||||
'processing'
|
||||
);
|
||||
|
||||
$body = json_decode( $request->get_body(), true );
|
||||
$background = ! (isset($body['export-background']) && $body['export-background'] == false);
|
||||
if( $background ) {
|
||||
$pid = pcntl_fork();
|
||||
} else {
|
||||
$pid = true;
|
||||
}
|
||||
if ($pid === -1) {
|
||||
$error = new \WP_Error('could not fork');
|
||||
$log = \Tainacan\Entities\Log::create(
|
||||
__('Export Process Error', 'tainacan'),
|
||||
__('Exporting Error', 'tainacan').'\\nArgs: '.print_r($args, true).'\\nError: could not fork',
|
||||
$error,
|
||||
[],
|
||||
'error'
|
||||
);
|
||||
remove_filter( 'rest_request_after_callbacks', [\Tainacan\Exposers_Handler::get_instance(), 'rest_request_after_callbacks'], 10, 3 ); //exposer mapping
|
||||
remove_filter( 'tainacan-rest-response', [\Tainacan\Exposers_Handler::get_instance(), 'rest_response'], 10, 2 ); // exposer types
|
||||
return $log;
|
||||
} elseif ($pid) { // we are the parent or run at foreground
|
||||
try {
|
||||
ignore_user_abort(true);
|
||||
set_time_limit(0);
|
||||
ini_set("memory_limit", "256M");
|
||||
|
||||
if($background) { // wait for child to respond and exit and reconnect database if is forked
|
||||
$status = null;
|
||||
pcntl_wait($status);
|
||||
global $wpdb;
|
||||
$wpdb->db_connect();
|
||||
}
|
||||
|
||||
$response = [];
|
||||
if(isset($request['collection_id'])) { // One Colletion
|
||||
$collection_id = $request['collection_id'];
|
||||
$items = $query;
|
||||
if ($items->have_posts()) {
|
||||
while ( $items->have_posts() ) { //TODO write line by line
|
||||
$items->the_post();
|
||||
|
||||
$item = new Entities\Item($items->post);
|
||||
|
||||
$prepared_item = $this->prepare_item_for_response($item, $request);
|
||||
|
||||
array_push($response, $prepared_item);
|
||||
}
|
||||
wp_reset_postdata();
|
||||
}
|
||||
} elseif (isset($request['item_id'])) { // One Item
|
||||
|
||||
$item = new Entities\Item($request['item_id']);
|
||||
if($item->get_id() > 0) {
|
||||
$prepared_item = $this->prepare_item_for_response($item, $request);
|
||||
|
||||
$response = [$prepared_item];
|
||||
}
|
||||
} else { // Export All
|
||||
$collections = $query;
|
||||
$collection_controller = new REST_Collections_Controller();
|
||||
if ($collections->have_posts()) {
|
||||
while ($collections->have_posts()) {
|
||||
$collections->the_post();
|
||||
$collection_id = $collections->post->ID;
|
||||
$collection = \Tainacan\Repositories\Repository::get_entity_by_post($collections->post);
|
||||
|
||||
$prepared_collection = $collection_controller->prepare_item_for_response($collection, $request);
|
||||
|
||||
$prepared_items = [];
|
||||
|
||||
$items = $this->items_repository->fetch($args, $collection_id, 'WP_Query');
|
||||
if ($items->have_posts()) {
|
||||
while ( $items->have_posts() ) { //TODO write line by line
|
||||
$items->the_post();
|
||||
|
||||
$item = new Entities\Item($items->post);
|
||||
|
||||
$prepared_item = $this->prepare_item_for_response($item, $request);
|
||||
|
||||
array_push($prepared_items, $prepared_item);
|
||||
}
|
||||
wp_reset_postdata();
|
||||
}
|
||||
|
||||
$prepared_collection['items'] = $prepared_items;
|
||||
array_push($prepared_collection, $response);
|
||||
}
|
||||
wp_reset_postdata();
|
||||
}
|
||||
}
|
||||
|
||||
$rest_response = new \WP_REST_Response(apply_filters('tainacan-rest-response', $response, $request));
|
||||
$data = $rest_response->get_data();
|
||||
file_put_contents($filename, is_string($data) ? $data : print_r($data, true));
|
||||
|
||||
if($background) {
|
||||
$log->set_status('publish');
|
||||
$logs = \Tainacan\Repositories\Logs::get_instance();
|
||||
$logs->update($log);
|
||||
exit(1);
|
||||
} else {
|
||||
return $rest_response->get_data();
|
||||
}
|
||||
} catch (\Exception $e) {
|
||||
if($background) {
|
||||
exit(1);
|
||||
} else {
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
} else { // we are the child
|
||||
|
||||
remove_filter( 'rest_request_after_callbacks', [\Tainacan\Exposers_Handler::get_instance(), 'rest_request_after_callbacks'], 10, 3 ); //exposer mapping
|
||||
remove_filter( 'tainacan-rest-response', [\Tainacan\Exposers_Handler::get_instance(), 'rest_response'], 10, 2 ); // exposer types
|
||||
return $log;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \WP_REST_Request $request
|
||||
*
|
||||
* @return \WP_Error|\WP_REST_Response
|
||||
*/
|
||||
public function get_items( $request ) {
|
||||
$args = $this->prepare_filters($request); // TODO default args
|
||||
$rest_response = new \WP_REST_Response([], 200); // TODO error, empty response
|
||||
|
||||
if(isset($request['collection_id'])) { // One Colletion
|
||||
$collection_id = $request['collection_id'];
|
||||
$items = $this->items_repository->fetch($args, $collection_id, 'WP_Query');
|
||||
|
||||
$response = $this->export($request, $items, $args);
|
||||
|
||||
$total_items = $items->found_posts;
|
||||
$ret = $response instanceof Entity ? $response->__toArray() : $response;
|
||||
$rest_response = new \WP_REST_Response($ret, 200);
|
||||
|
||||
$rest_response->header('X-WP-Total', (int) $total_items);
|
||||
} elseif (isset($request['item_id'])) { // One Item
|
||||
|
||||
$item = new Entities\Item($request['item_id']);
|
||||
if($item->get_id() > 0) {
|
||||
$response = $this->export($request, $item, $args);
|
||||
|
||||
$total_items = 1;
|
||||
$max_pages = 1;
|
||||
|
||||
$rest_response = new \WP_REST_Response($response->__toArray(), 200);
|
||||
|
||||
$rest_response->header('X-WP-Total', 1);
|
||||
$rest_response->header('X-WP-TotalPages', 1);
|
||||
}
|
||||
} else { // Export All
|
||||
$Tainacan_Collection = \Tainacan\Repositories\Collections::get_instance();
|
||||
$collections = $Tainacan_Collection->fetch(['post_status' => 'publish'], 'WP_Query');
|
||||
|
||||
$response = $this->export($request, $collections, $args);
|
||||
$total_items = $collections->found_posts;
|
||||
$ret = $response instanceof Entity ? $response->__toArray() : $response;
|
||||
$rest_response = new \WP_REST_Response($ret, 200);
|
||||
|
||||
$rest_response->header('X-WP-Total', (int) $total_items);
|
||||
}
|
||||
|
||||
return $rest_response;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param \WP_REST_Request $request
|
||||
*
|
||||
* @return bool|\WP_Error
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function get_items_permissions_check( $request ) {
|
||||
return $this->get_item_permissions_check($request);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
?>
|
|
@ -38,7 +38,17 @@ class REST_Logs_Controller extends REST_Controller {
|
|||
'methods' => \WP_REST_Server::READABLE,
|
||||
'callback' => array($this, 'get_item'),
|
||||
'permission_callback' => array($this, 'get_item_permissions_check'),
|
||||
'args' => $this->get_endpoint_args_for_item_schema(\WP_REST_Server::READABLE)
|
||||
'args' => array(
|
||||
'context' => array(
|
||||
'type' => 'string',
|
||||
'default' => 'view',
|
||||
'description' => 'The context in which the request is made.',
|
||||
'enum' => array(
|
||||
'view',
|
||||
'edit'
|
||||
)
|
||||
),
|
||||
),
|
||||
),
|
||||
'schema' => [$this, 'get_schema']
|
||||
)
|
||||
|
|
|
@ -44,6 +44,22 @@ class REST_Metadata_Controller extends REST_Controller {
|
|||
public function register_routes() {
|
||||
register_rest_route($this->namespace, '/collection/(?P<collection_id>[\d]+)/' . $this->rest_base . '/(?P<metadatum_id>[\d]+)',
|
||||
array(
|
||||
array(
|
||||
'methods' => \WP_REST_Server::READABLE,
|
||||
'callback' => array($this, 'get_item'),
|
||||
'permission_callback' => array($this, 'get_item_permissions_check'),
|
||||
'args' => array(
|
||||
'context' => array(
|
||||
'type' => 'string',
|
||||
'default' => 'view',
|
||||
'description' => 'The context in which the request is made.',
|
||||
'enum' => array(
|
||||
'view',
|
||||
'edit'
|
||||
)
|
||||
),
|
||||
),
|
||||
),
|
||||
array(
|
||||
'methods' => \WP_REST_Server::EDITABLE,
|
||||
'callback' => array($this, 'update_item'),
|
||||
|
@ -55,12 +71,6 @@ class REST_Metadata_Controller extends REST_Controller {
|
|||
'callback' => array($this, 'delete_item'),
|
||||
'permission_callback' => array($this, 'delete_item_permissions_check'),
|
||||
),
|
||||
array(
|
||||
'methods' => \WP_REST_Server::READABLE,
|
||||
'callback' => array($this, 'get_item'),
|
||||
'permission_callback' => array($this, 'get_item_permissions_check'),
|
||||
'args' => $this->get_endpoint_args_for_item_schema(\WP_REST_Server::READABLE),
|
||||
),
|
||||
'schema' => [$this, 'get_schema']
|
||||
)
|
||||
);
|
||||
|
@ -83,28 +93,38 @@ class REST_Metadata_Controller extends REST_Controller {
|
|||
);
|
||||
register_rest_route($this->namespace, '/' . $this->rest_base,
|
||||
array(
|
||||
array(
|
||||
'methods' => \WP_REST_Server::CREATABLE,
|
||||
'callback' => array($this, 'create_item'),
|
||||
'permission_callback' => array($this, 'create_item_permissions_check'),
|
||||
'args' => $this->get_endpoint_args_for_item_schema(\WP_REST_Server::CREATABLE),
|
||||
),
|
||||
array(
|
||||
'methods' => \WP_REST_Server::READABLE,
|
||||
'callback' => array($this, 'get_items'),
|
||||
'permission_callback' => array($this, 'get_items_permissions_check'),
|
||||
'args' => $this->get_wp_query_params(),
|
||||
),
|
||||
array(
|
||||
'methods' => \WP_REST_Server::CREATABLE,
|
||||
'callback' => array($this, 'create_item'),
|
||||
'permission_callback' => array($this, 'create_item_permissions_check'),
|
||||
'args' => $this->get_endpoint_args_for_item_schema(\WP_REST_Server::CREATABLE),
|
||||
),
|
||||
'schema' => [$this, 'get_schema'],
|
||||
)
|
||||
);
|
||||
register_rest_route($this->namespace, '/'. $this->rest_base . '/(?P<metadatum_id>[\d]+)',
|
||||
array(
|
||||
// ENDPOINT Z.
|
||||
array(
|
||||
'methods' => \WP_REST_Server::DELETABLE,
|
||||
'callback' => array($this, 'delete_item'),
|
||||
'permission_callback' => array($this, 'delete_item_permissions_check')
|
||||
'methods' => \WP_REST_Server::READABLE,
|
||||
'callback' => array($this, 'get_item'),
|
||||
'permission' => array($this, 'get_item_permissions_check'),
|
||||
'args' => array(
|
||||
'context' => array(
|
||||
'type' => 'string',
|
||||
'default' => 'view',
|
||||
'description' => 'The context in which the request is made.',
|
||||
'enum' => array(
|
||||
'view',
|
||||
'edit'
|
||||
)
|
||||
),
|
||||
),
|
||||
),
|
||||
array(
|
||||
'methods' => \WP_REST_Server::EDITABLE,
|
||||
|
@ -113,10 +133,9 @@ class REST_Metadata_Controller extends REST_Controller {
|
|||
'args' => $this->get_endpoint_args_for_item_schema(\WP_REST_Server::EDITABLE)
|
||||
),
|
||||
array(
|
||||
'methods' => \WP_REST_Server::READABLE,
|
||||
'callback' => array($this, 'get_item'),
|
||||
'permission' => array($this, 'get_item_permissions_check'),
|
||||
'args' => $this->get_endpoint_args_for_item_schema(\WP_REST_Server::READABLE)
|
||||
'methods' => \WP_REST_Server::DELETABLE,
|
||||
'callback' => array($this, 'delete_item'),
|
||||
'permission_callback' => array($this, 'delete_item_permissions_check')
|
||||
),
|
||||
'schema' => [$this, 'get_schema'],
|
||||
)
|
||||
|
|
|
@ -54,7 +54,21 @@ class REST_Taxonomies_Controller extends REST_Controller {
|
|||
'methods' => \WP_REST_Server::READABLE,
|
||||
'callback' => array($this, 'get_item'),
|
||||
'permission_callback' => array($this, 'get_item_permissions_check'),
|
||||
'args' => $this->get_endpoint_args_for_item_schema(\WP_REST_Server::READABLE)
|
||||
'args' => array(
|
||||
'context' => array(
|
||||
'type' => 'string',
|
||||
'default' => 'view',
|
||||
'description' => 'The context in which the request is made.',
|
||||
'enum' => array(
|
||||
'view',
|
||||
'edit'
|
||||
)
|
||||
),
|
||||
'fetch_only' => array(
|
||||
'type' => 'string/array',
|
||||
'description' => __( 'Fetch only specific attribute. The specifics attributes are the same in schema.', 'tainacan' ),
|
||||
)
|
||||
)
|
||||
),
|
||||
array(
|
||||
'methods' => \WP_REST_Server::DELETABLE,
|
||||
|
|
|
@ -18,7 +18,6 @@ $rest_exporters_controller = new \Tainacan\API\EndPoints\REST_Exporters_Contr
|
|||
$rest_background_processes_controller = new \Tainacan\API\EndPoints\REST_Background_Processes_Controller();
|
||||
$rest_bulkedit_controller = new \Tainacan\API\EndPoints\REST_Bulkedit_Controller();
|
||||
$rest_exposers_controller = new \Tainacan\API\EndPoints\REST_Exposers_Controller();
|
||||
new \Tainacan\API\EndPoints\REST_Export_Controller();
|
||||
new \Tainacan\API\EndPoints\REST_Metadatum_Mappers_Controller();
|
||||
$rest_facets_controller = new \Tainacan\API\EndPoints\REST_Facets_Controller();
|
||||
$rest_oaipmh_expose_controller = new \Tainacan\API\EndPoints\REST_Oaipmh_Expose_Controller();
|
||||
|
|
Loading…
Reference in New Issue