first commit
This commit is contained in:
@@ -0,0 +1,131 @@
|
||||
<?php
|
||||
namespace ElementorPro\Modules\Notes\Data\Endpoints;
|
||||
|
||||
use Elementor\Data\V2\Base\Endpoint;
|
||||
use ElementorPro\Core\Utils\Collection;
|
||||
use ElementorPro\Data\Http_Status;
|
||||
use ElementorPro\Modules\Notes\Database\Models\Note;
|
||||
use ElementorPro\Modules\Notes\Database\Models\User;
|
||||
use ElementorPro\Modules\Notes\Database\Query\Note_Query_Builder;
|
||||
use ElementorPro\Modules\Notes\User\Capabilities;
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly.
|
||||
}
|
||||
|
||||
class Read_Status_Endpoint extends Endpoint {
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function get_name() {
|
||||
return 'read-status';
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function get_format() {
|
||||
return 'notes/read-status';
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
protected function register() {
|
||||
$args = [
|
||||
'ids' => [
|
||||
'type' => 'array',
|
||||
'description' => 'The id\'s of the notes.',
|
||||
'items' => [
|
||||
'type' => 'integer',
|
||||
],
|
||||
'required' => true,
|
||||
],
|
||||
];
|
||||
|
||||
$this->register_items_route( \WP_REST_Server::CREATABLE, $args );
|
||||
$this->register_items_route( \WP_REST_Server::DELETABLE, $args );
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark notes as read by the current user.
|
||||
*
|
||||
* @param \WP_REST_Request $request
|
||||
*
|
||||
* @return \WP_REST_Response
|
||||
*/
|
||||
protected function create_items( $request ) {
|
||||
$user_id = get_current_user_id();
|
||||
$notes = $this->get_notes(
|
||||
$request->get_param( 'ids' ),
|
||||
true
|
||||
);
|
||||
|
||||
/** @var Note $note */
|
||||
foreach ( $notes as $note ) {
|
||||
$reader = $note->readers->find( function ( User $user ) use ( $user_id ) {
|
||||
return $user->ID === $user_id;
|
||||
} );
|
||||
|
||||
if ( ! $reader ) {
|
||||
$note->add_readers( [ $user_id ] );
|
||||
}
|
||||
}
|
||||
|
||||
return new \WP_REST_Response( [], Http_Status::CREATED );
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark notes as unread by the current user.
|
||||
*
|
||||
* @param \WP_REST_Request $request
|
||||
*
|
||||
* @return \WP_REST_Response
|
||||
*/
|
||||
protected function delete_items( $request ) {
|
||||
$user_id = get_current_user_id();
|
||||
$notes = $this->get_notes( $request->get_param( 'ids' ) );
|
||||
|
||||
/** @var Note $note */
|
||||
foreach ( $notes as $note ) {
|
||||
$note->remove_readers( [ $user_id ] );
|
||||
}
|
||||
|
||||
// TODO: Should return status 204 when the $e.data will support it
|
||||
return new \WP_REST_Response( [], Http_Status::OK );
|
||||
}
|
||||
|
||||
/**
|
||||
* @inheritDoc
|
||||
*/
|
||||
public function get_permission_callback( $request ) {
|
||||
$can_read_notes = false;
|
||||
|
||||
foreach ( $this->get_notes( $request->get_param( 'ids' ) ) as $note ) {
|
||||
$can_read_notes = current_user_can( Capabilities::READ_NOTES, $note );
|
||||
|
||||
if ( false === $can_read_notes ) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return $can_read_notes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get notes by their ids.
|
||||
*
|
||||
* @param array $ids
|
||||
* @param bool $with_readers
|
||||
*
|
||||
* @return Collection
|
||||
*/
|
||||
private function get_notes( array $ids, $with_readers = false ) {
|
||||
return Note::query()
|
||||
->where_in( 'id', $ids )
|
||||
->when( $with_readers, function ( Note_Query_Builder $builder ) {
|
||||
return $builder->with_readers();
|
||||
} )
|
||||
->get();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user