Exception treatments

This commit is contained in:
weryques 2017-12-12 09:59:50 -02:00
parent 48a79a24dd
commit c4f47882b4
14 changed files with 1242 additions and 60 deletions

1149
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -34,11 +34,12 @@ class TAINACAN_REST_Collections_Controller extends WP_REST_Controller {
'methods' => WP_REST_Server::READABLE, 'methods' => WP_REST_Server::READABLE,
'callback' => array($this, 'get_items'), 'callback' => array($this, 'get_items'),
'permission_callback' => array($this, 'get_items_permissions_check'), 'permission_callback' => array($this, 'get_items_permissions_check'),
'args' => $this->get_item_schema()
), ),
array( array(
'methods' => WP_REST_Server::CREATABLE, 'methods' => WP_REST_Server::CREATABLE,
'callback' => array($this, 'create_item'), 'callback' => array($this, 'create_item'),
//'permission_callback' => array($this, 'create_item_permissions_check'), 'permission_callback' => array($this, 'create_item_permissions_check'),
'args' => $this->get_endpoint_args_for_item_schema(WP_REST_Server::CREATABLE), 'args' => $this->get_endpoint_args_for_item_schema(WP_REST_Server::CREATABLE),
), ),
)); ));
@ -88,7 +89,7 @@ class TAINACAN_REST_Collections_Controller extends WP_REST_Controller {
$collection_id = $request['collection_id']; $collection_id = $request['collection_id'];
$collection = $this->collections_repository->fetch($collection_id); $collection = $this->collections_repository->fetch($collection_id);
$response = $this->prepare_item_for_response($collection, $request); $response = $this->prepare_item_for_response( $collection, $request );
return new WP_REST_Response($response, 200); return new WP_REST_Response($response, 200);
} }
@ -118,9 +119,11 @@ class TAINACAN_REST_Collections_Controller extends WP_REST_Controller {
return json_encode($collections_as_json); return json_encode($collections_as_json);
} }
else { elseif(!empty($item)){
return $item->__toJSON(); return $item->__toJSON();
} }
return $item;
} }
/** /**
@ -152,15 +155,13 @@ class TAINACAN_REST_Collections_Controller extends WP_REST_Controller {
* @return array|WP_Error|WP_REST_Response * @return array|WP_Error|WP_REST_Response
*/ */
public function create_item( $request ) { public function create_item( $request ) {
$request = json_decode($request->get_body(), true); $request = json_decode($request->get_body(), true);
if(empty($request)) { try {
return new WP_Error('rest_empty', __('Empty request.'), array('status' => 204)); $prepared_post = $this->prepare_item_for_database( $request );
} elseif (!empty($request['collection_id'])){ } catch (\Error $exception){
return new WP_Error( 'rest_post_exists', __( 'Cannot create existing post.' ), array( 'status' => 400 ) ); return new WP_REST_Response($exception->getMessage(), 400);
} }
$prepared_post = $this->prepare_item_for_database($request);
if($prepared_post->validate()) { if($prepared_post->validate()) {
$collection = $this->collections_repository->insert( $prepared_post ); $collection = $this->collections_repository->insert( $prepared_post );
@ -179,11 +180,7 @@ class TAINACAN_REST_Collections_Controller extends WP_REST_Controller {
* @return bool|WP_Error * @return bool|WP_Error
*/ */
public function create_item_permissions_check( $request ) { public function create_item_permissions_check( $request ) {
if(current_user_can('edit_posts')){ return true;
return true;
}
return false;
} }
/** /**
@ -194,8 +191,11 @@ class TAINACAN_REST_Collections_Controller extends WP_REST_Controller {
* @return object|Entities\Collection|WP_Error * @return object|Entities\Collection|WP_Error
*/ */
public function prepare_item_for_database( $request ) { public function prepare_item_for_database( $request ) {
$this->collection->set_name($request['name']);
$this->collection->set_description($request['description']); foreach ($request as $key => $value){
$set_ = 'set_' . $key;
$this->collection->$set_($value);
}
return $this->collection; return $this->collection;
} }
@ -251,11 +251,7 @@ class TAINACAN_REST_Collections_Controller extends WP_REST_Controller {
* @return bool|WP_Error * @return bool|WP_Error
*/ */
public function update_item_permissions_check( $request ) { public function update_item_permissions_check( $request ) {
if(current_user_can('edit_posts')){ return true;
return true;
}
return false;
} }
public function get_collection_params() { public function get_collection_params() {
@ -274,6 +270,12 @@ class TAINACAN_REST_Collections_Controller extends WP_REST_Controller {
return apply_filters("rest_{$this->collection->get_post_type()}_collection_params", $args, $this->collection->get_post_type()); return apply_filters("rest_{$this->collection->get_post_type()}_collection_params", $args, $this->collection->get_post_type());
} }
public function get_item_schema() {
$args = $this->collections_repository->get_map();
return apply_filters("rest_{$this->collection->get_post_type()}_collection_params", $args, $this->collection->get_post_type());
}
} }
?> ?>

View File

@ -141,8 +141,13 @@ class TAINACAN_REST_Items_Controller extends WP_REST_Controller {
* @return object|Entities\Item|WP_Error * @return object|Entities\Item|WP_Error
*/ */
public function prepare_item_for_database( $request ) { public function prepare_item_for_database( $request ) {
$this->item->set_title($request[0]['title']);
$this->item->set_description($request[0]['description']); $item_as_array = $request[0];
foreach ($item_as_array as $key => $value){
$set_ = 'set_' . $key;
$this->item->$set_($value);
}
$collection = new Entities\Collection($request[1]); $collection = new Entities\Collection($request[1]);
@ -174,9 +179,13 @@ class TAINACAN_REST_Items_Controller extends WP_REST_Controller {
*/ */
public function create_item( $request ) { public function create_item( $request ) {
$collection_id = $request['collection_id']; $collection_id = $request['collection_id'];
$item = json_decode($request->get_body(), true); $item = json_decode($request->get_body(), true);
$metadata = $this->prepare_item_for_database([$item, $collection_id]); try {
$metadata = $this->prepare_item_for_database( [ $item, $collection_id ] );
} catch (\Error $exception){
return new WP_REST_Response($exception->getMessage(), 400);
}
if($this->item->validate()) { if($this->item->validate()) {
$item = $this->items_repository->insert($this->item ); $item = $this->items_repository->insert($this->item );

View File

@ -5,7 +5,6 @@ use Tainacan\Repositories;
class TAINACAN_REST_Metadata_Controller extends WP_REST_Controller { class TAINACAN_REST_Metadata_Controller extends WP_REST_Controller {
private $metadata; private $metadata;
private $item_metadata;
private $metadata_repository; private $metadata_repository;
private $item_metadata_repository; private $item_metadata_repository;
private $item_repository; private $item_repository;
@ -65,23 +64,38 @@ class TAINACAN_REST_Metadata_Controller extends WP_REST_Controller {
); );
} }
/**
* @param WP_REST_Request $request
*
* @return object|void|WP_Error
*/
public function prepare_item_for_database( $request ) { public function prepare_item_for_database( $request ) {
$meta = json_decode($request[0]->get_body(), true); $meta = json_decode($request[0]->get_body(), true);
$this->metadata->set_name($meta['name']); foreach ($meta as $key => $value){
$this->metadata->set_description($meta['description']); $set_ = 'set_' . $key;
$this->metadata->set_field_type($meta['field_type']); $this->metadata->$set_($value);
}
$collection = new Entities\Collection($request[1]); $collection = new Entities\Collection($request[1]);
$this->metadata->set_collection($collection); $this->metadata->set_collection($collection);
} }
/**
* @param WP_REST_Request $request
*
* @return WP_Error|WP_REST_Response
*/
public function create_item( $request ) { public function create_item( $request ) {
if(!empty($request['collection_id'])){ if(!empty($request['collection_id'])){
$collection_id = $request['collection_id']; $collection_id = $request['collection_id'];
$this->prepare_item_for_database([$request, $collection_id]); try {
$this->prepare_item_for_database( [ $request, $collection_id ] );
} catch (\Error $exception){
return new WP_REST_Response($exception->getMessage(), 400);
}
if($this->metadata->validate()) { if($this->metadata->validate()) {
$this->metadata_repository->insert( $this->metadata ); $this->metadata_repository->insert( $this->metadata );
@ -98,9 +112,14 @@ class TAINACAN_REST_Metadata_Controller extends WP_REST_Controller {
$metadata_added = $this->item_metadata_repository->insert($item_meta); $metadata_added = $this->item_metadata_repository->insert($item_meta);
} }
}
return new WP_REST_Response($metadata_added->get_metadata()->__toJSON(), 201); return new WP_REST_Response($metadata_added->get_metadata()->__toJSON(), 201);
}
else {
return new WP_REST_Response($this->metadata->__toJSON(), 201);
}
} else {
return new WP_REST_Response($this->metadata->get_errors(), 200);
} }
} elseif (!empty($request['item_id']) && !empty($request->get_body())){ } elseif (!empty($request['item_id']) && !empty($request->get_body())){
$body = json_decode($request->get_body(), true); $body = json_decode($request->get_body(), true);
@ -119,6 +138,8 @@ class TAINACAN_REST_Metadata_Controller extends WP_REST_Controller {
$metadata_updated = $this->item_metadata_repository->insert( $item_metadata ); $metadata_updated = $this->item_metadata_repository->insert( $item_metadata );
return new WP_REST_Response( $metadata_updated->get_metadata()->__toJSON(), 201 ); return new WP_REST_Response( $metadata_updated->get_metadata()->__toJSON(), 201 );
} else {
return new WP_REST_Response( $item_metadata->get_errors(), 200);
} }
} else { } else {
return new WP_REST_Response($request->get_body(), 400); return new WP_REST_Response($request->get_body(), 400);

View File

@ -16,8 +16,7 @@ class Log extends Entity {
*/ */
protected $repository = 'Tainacan_Logs'; protected $repository = 'Tainacan_Logs';
public function __construct($which=0) public function __construct($which=0) {
{
parent::__construct($which); parent::__construct($which);
if( is_int($which) && $which == 0) { if( is_int($which) && $which == 0) {

View File

@ -162,8 +162,13 @@ class Collections extends Repository {
} }
public function delete($args){ /**
if($args[1]['is_permanently'] === true){ * @param $args ( is a array like [post_id, [is_permanently => bool]] )
*
* @return mixed|Collection
*/
public function delete($args){
if(!empty($args[1]) && $args[1]['is_permanently'] === true){
return new Entities\Collection(wp_delete_post($args[0], $args[1]['is_permanently'])); return new Entities\Collection(wp_delete_post($args[0], $args[1]['is_permanently']));
} }

View File

@ -200,8 +200,13 @@ class Items extends Repository {
} }
public function delete($args){ /**
if($args[1]['is_permanently'] === true){ * @param $args ( is a array like [post_id, [is_permanently => bool]] )
*
* @return mixed|Entities\Item
*/
public function delete($args){
if(!empty($args[1]) && $args[1]['is_permanently'] === true){
return new Entities\Item(wp_delete_post($args[0], $args[1]['is_permanently'])); return new Entities\Item(wp_delete_post($args[0], $args[1]['is_permanently']));
} }

View File

@ -5,6 +5,7 @@ Plugin Name: Tainacan
Plugin URI: https://github.com/tainacan/tainacan Plugin URI: https://github.com/tainacan/tainacan
Description: Transforme seu site Wordpress em um repositório digital Description: Transforme seu site Wordpress em um repositório digital
Author: Media Lab / UFG Author: Media Lab / UFG
Author URI: https://www.medialab.ufg.br
Version: 1.0 Version: 1.0
*/ */

View File

@ -26,7 +26,7 @@ class Entity_Factory {
try { try {
if(empty($type)){ if(empty($type)){
throw new \InvalidArgumentException(__('The type can\'t be empty')); throw new \InvalidArgumentException(__('The type can\'t be empty', 'tainacan'));
} elseif(!strrchr($type, '_')){ } elseif(!strrchr($type, '_')){
$type = ucfirst(strtolower($type)); $type = ucfirst(strtolower($type));
} else { } else {
@ -62,7 +62,7 @@ class Entity_Factory {
if ($this->entity->validate()) { if ($this->entity->validate()) {
$this->entity = $this->repository->insert($this->entity); $this->entity = $this->repository->insert($this->entity);
} else { } else {
throw new \ErrorException( __( 'The entity wasn\'t validated.' ) ); throw new \ErrorException( __( 'The entity wasn\'t validated.', 'tainacan' ) );
} }
} elseif (!empty($args) && !$is_validated_and_in_db){ } elseif (!empty($args) && !$is_validated_and_in_db){
@ -79,19 +79,19 @@ class Entity_Factory {
} elseif (empty($args) && !$is_validated_and_in_db) { } elseif (empty($args) && !$is_validated_and_in_db) {
try { try {
$this->entity->set_name( "$type" . random_int( 0, 10000 ) . " for test" ); $this->entity->set_name( "$type " . random_int( 0, 10000 ) . " for test" );
$this->entity->set_description( 'It is only for test' ); $this->entity->set_description( 'It is only for test' );
} catch (\Error $exception){ } catch (\Error $exception){
$this->entity->set_title( "$type" . random_int( 0, 10000 ) . " for test" ); $this->entity->set_title( "$type " . random_int( 0, 10000 ) . " for test" );
$this->entity->set_description( 'It is only for test' ); $this->entity->set_description( 'It is only for test' );
} }
} elseif (empty($args) && $is_validated_and_in_db) { } elseif (empty($args) && $is_validated_and_in_db) {
try { try {
$this->entity->set_name( "$type" . random_int( 0, 10000 ) . " for test" ); $this->entity->set_name( "$type " . random_int( 0, 10000 ) . " for test" );
$this->entity->set_description( 'It is only for test' ); $this->entity->set_description( 'It is only for test' );
} catch (\Error $exception){ } catch (\Error $exception){
$this->entity->set_title( "$type" . random_int( 0, 10000 ) . " for test" ); $this->entity->set_title( "$type " . random_int( 0, 10000 ) . " for test" );
$this->entity->set_description( 'It is only for test' ); $this->entity->set_description( 'It is only for test' );
} }
@ -99,7 +99,7 @@ class Entity_Factory {
if ($this->entity->validate()) { if ($this->entity->validate()) {
$this->entity = $this->repository->insert( $this->entity ); $this->entity = $this->repository->insert( $this->entity );
} else { } else {
throw new \ErrorException( __( 'The entity wasn\'t validated.' ) ); throw new \ErrorException( __( 'The entity wasn\'t validated.', 'tainacan' ) );
} }
} else { } else {

View File

@ -8,7 +8,7 @@ class Field_Factory {
public function create_field($type, $primitive_type = []){ public function create_field($type, $primitive_type = []){
if(empty($type)){ if(empty($type)){
throw new \InvalidArgumentException(__('The type can\'t be empty')); throw new \InvalidArgumentException(__('The type can\'t be empty', 'tainacan'));
} elseif(!strrchr($type, '_')){ } elseif(!strrchr($type, '_')){
$type = ucfirst(strtolower($type)); $type = ucfirst(strtolower($type));
} else { } else {

View File

@ -8,7 +8,7 @@ class Filter_Factory {
public function create_filter($type, $supported_types = []){ public function create_filter($type, $supported_types = []){
if(empty($type)){ if(empty($type)){
throw new \InvalidArgumentException(__('The type can\'t be empty')); throw new \InvalidArgumentException(__('The type can\'t be empty', 'tainacan'));
} elseif(!strrchr($type, '_')){ } elseif(!strrchr($type, '_')){
$type = ucfirst(strtolower($type)); $type = ucfirst(strtolower($type));
} else { } else {

View File

@ -12,7 +12,7 @@ class TAINACAN_UnitTestCase extends \WP_UnitTestCase {
public function setUp(){ public function setUp(){
parent::setUp(); parent::setUp();
$this->tainacan_entity_factory = new Factories\Entity_Factory(); $this->tainacan_entity_factory = new Factories\Entity_Factory();
$this->tainacan_field_factory = new Factories\Field_Factory(); $this->tainacan_field_factory = new Factories\Field_Factory();
$this->tainacan_filter_factory = new Factories\Filter_Factory(); $this->tainacan_filter_factory = new Factories\Filter_Factory();
} }
} }

View File

@ -12,9 +12,9 @@ class TAINACAN_REST_Metadata_Controller extends TAINACAN_UnitApiTestCase {
$item = $this->tainacan_entity_factory->create_entity( $item = $this->tainacan_entity_factory->create_entity(
'item', 'item',
array( array(
'title' => 'No name', 'title' => 'No name',
'description' => 'No description', 'description' => 'No description',
'collection' => $collection 'collection' => $collection
), ),
true true
); );
@ -23,9 +23,9 @@ class TAINACAN_REST_Metadata_Controller extends TAINACAN_UnitApiTestCase {
$metadata = json_encode( $metadata = json_encode(
array( array(
'name' => 'Moeda', 'name' => 'Moeda',
'description' => 'Descreve campo moeda.', 'description' => 'Descreve campo moeda.',
'field_type' => $field->get_primitive_type(), 'field_type' => $field->get_primitive_type(),
) )
); );

View File

@ -13,8 +13,7 @@ use Tainacan\Repositories\Repository;
* @group architecture * @group architecture
*/ */
class Objects extends TAINACAN_UnitTestCase { class Objects extends TAINACAN_UnitTestCase {
function test_object_transformation() function test_object_transformation() {
{
$x = $this->tainacan_entity_factory->create_entity( $x = $this->tainacan_entity_factory->create_entity(
'collection', 'collection',
array( array(