From 61e597c6c8c627a5982ae7acd47a3dc69fbabc37 Mon Sep 17 00:00:00 2001 From: leogermani Date: Thu, 18 Jul 2019 12:22:40 -0300 Subject: [PATCH] add item duplicate API endpoint #250 --- .../class-tainacan-rest-items-controller.php | 73 +++++++++++ tests/test-api-items.php | 113 ++++++++++++++++++ 2 files changed, 186 insertions(+) diff --git a/src/api/endpoints/class-tainacan-rest-items-controller.php b/src/api/endpoints/class-tainacan-rest-items-controller.php index 750a55277..ae0ab76e9 100644 --- a/src/api/endpoints/class-tainacan-rest-items-controller.php +++ b/src/api/endpoints/class-tainacan-rest-items-controller.php @@ -98,6 +98,17 @@ class REST_Items_Controller extends REST_Controller { ), ) ); + register_rest_route( + $this->namespace, '/collection/(?P[\d]+)/' . $this->rest_base . '/(?P[\d]+)/duplicate', + array( + array( + 'methods' => \WP_REST_Server::CREATABLE, + 'callback' => array($this, 'duplicate_item'), + 'permission_callback' => array($this, 'create_item_permissions_check'), + 'args' => $this->get_collection_params(), + ), + ) + ); } /** @@ -627,6 +638,68 @@ class REST_Items_Controller extends REST_Controller { return false; } + + /** + * @param \WP_REST_Request $request + * + * @return \WP_Error|\WP_REST_Response + */ + public function duplicate_item( $request ) { + $item_id = $request['item_id']; + + $item = $this->items_repository->fetch($item_id); + if ($item) { + + $new_item = new Entities\Item(); + $items_repo = Repositories\Items::get_instance(); + + $new_item->set_title( $item->get_title() ); + $new_item->set_description( $item->get_description() ); + $new_item->set_status( $item->get_status() ); + $new_item->set_collection_id( $item->get_collection_id() ); + + if ( $new_item->validate() ) { + + $new_item = $items_repo->insert($new_item); + + $metadata = $item->get_metadata(); + + $errors = []; + + foreach ($metadata as $item_metadatum) { + + $new_item_metadatum = new Entities\Item_Metadata_Entity( $new_item, $item_metadatum->get_metadatum() ); + $new_item_metadatum->set_value( $item_metadatum->get_value() ); + + if ( $new_item_metadatum->validate() ) { + Repositories\Item_Metadata::get_instance()->insert( $new_item_metadatum ); + } else { + $errors[] = $new_item_metadatum->get_errors(); + } + + } + + } else { + return new \WP_REST_Response([ + 'error_message' => __('Error duplicating item', 'tainacan'), + 'errors' => $new_item->get_errors(), + 'item' => $this->prepare_item_for_response($item, $request) + ], 400); + } + + + do_action('tainacan-api-item-duplicated', $item, $new_item); + + return new \WP_REST_Response($this->prepare_item_for_response($new_item, $request), 201); + + } + + return new \WP_REST_Response([ + 'error_message' => __('An item with this ID was not found', 'tainacan' ), + 'item_id' => $item_id + ], 400); + + } /** diff --git a/tests/test-api-items.php b/tests/test-api-items.php index 484b0709a..2fe4e4182 100644 --- a/tests/test-api-items.php +++ b/tests/test-api-items.php @@ -476,6 +476,119 @@ class TAINACAN_REST_Items_Controller extends TAINACAN_UnitApiTestCase { //$this->assertEquals(403, $response->get_status()); $this->assertEquals(201, $response->get_status()); } + + function test_duplicate() { + + $collection = $this->tainacan_entity_factory->create_entity( + 'collection', + array( + 'name' => 'Agile', + 'description' => 'Agile methods', + 'status' => 'publish' + ), + true + ); + + + $public_meta = $this->tainacan_entity_factory->create_entity( + 'metadatum', + array( + 'name' => 'public_meta', + 'collection' => $collection, + 'metadata_type' => 'Tainacan\Metadata_Types\Text', + 'status' => 'publish' + ), + true + ); + + $multiple_meta = $this->tainacan_entity_factory->create_entity( + 'metadatum', + array( + 'name' => 'public_meta', + 'collection' => $collection, + 'metadata_type' => 'Tainacan\Metadata_Types\Text', + 'multiple' => 'yes', + 'status' => 'publish' + ), + true + ); + + $taxonomy = $this->tainacan_entity_factory->create_entity( + 'taxonomy', + array( + 'name' => 'taxonomy_public', + 'description' => 'taxonomy_public', + 'status' => 'publish' + ), + true + ); + + $tax_meta = $this->tainacan_entity_factory->create_entity( + 'metadatum', + array( + 'name' => 'metadata-public', + 'status' => 'publish', + 'collection' => $collection, + 'metadata_type' => 'Tainacan\Metadata_Types\Taxonomy', + 'metadata_type_options' => [ + 'allow_new_terms' => 'yes', + 'taxonomy_id' => $taxonomy->get_id() + ], + 'multiple' => 'yes' + ), + true + ); + + $item1 = $this->tainacan_entity_factory->create_entity( + 'item', + array( + 'title' => 'Lean Startup', + 'description' => 'Um processo ágil de criação de novos negócios.', + 'collection' => $collection, + 'status' => 'publish' + ), + true + ); + + $itemMetaRepo = \Tainacan\Repositories\Item_Metadata::get_instance(); + + $newMeta = new \Tainacan\Entities\Item_Metadata_Entity($item1, $public_meta); + $newMeta->set_value('test'); + $newMeta->validate(); + $itemMetaRepo->insert($newMeta); + + $newMeta = new \Tainacan\Entities\Item_Metadata_Entity($item1, $multiple_meta); + $newMeta->set_value(['test1', 'test2']); + $newMeta->validate(); + $itemMetaRepo->insert($newMeta); + + $newMeta = new \Tainacan\Entities\Item_Metadata_Entity($item1, $tax_meta); + $newMeta->set_value(['blue', 'red']); + $newMeta->validate(); + $itemMetaRepo->insert($newMeta); + + $request = new \WP_REST_Request('POST', $this->namespace . '/collection/' . $collection->get_id() . '/items/' . $item1->get_id() . '/duplicate'); + + $response = $this->server->dispatch($request); + + $this->assertEquals(201, $response->get_status()); + + $data = $response->get_data(); + + $this->assertEquals('Lean Startup', $data['title']); + + $metadata_1 = $item1->get_metadata(); + + $duplicated = \Tainacan\Repositories\Items::get_instance()->fetch( (int) $data['id'] ); + + $metadata_2 = $duplicated->get_metadata(); + + foreach( $metadata_1 as $k => $m ) { + $this->assertEquals( $m->get_value(), $metadata_2[$k]->get_value() ); + } + + } + } ?> \ No newline at end of file