add item duplicate API endpoint #250

This commit is contained in:
leogermani 2019-07-18 12:22:40 -03:00
parent 923caebb43
commit 61e597c6c8
2 changed files with 186 additions and 0 deletions

View File

@ -98,6 +98,17 @@ class REST_Items_Controller extends REST_Controller {
), ),
) )
); );
register_rest_route(
$this->namespace, '/collection/(?P<collection_id>[\d]+)/' . $this->rest_base . '/(?P<item_id>[\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(),
),
)
);
} }
/** /**
@ -628,6 +639,68 @@ class REST_Items_Controller extends REST_Controller {
return false; 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);
}
/** /**
* @param string $method * @param string $method

View File

@ -476,6 +476,119 @@ class TAINACAN_REST_Items_Controller extends TAINACAN_UnitApiTestCase {
//$this->assertEquals(403, $response->get_status()); //$this->assertEquals(403, $response->get_status());
$this->assertEquals(201, $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() );
}
}
} }
?> ?>