125 lines
3.0 KiB
PHP
125 lines
3.0 KiB
PHP
|
<?php
|
||
|
/**
|
||
|
* Notifications API Endpoint
|
||
|
*
|
||
|
* @package easy-digital-downloads
|
||
|
* @copyright Copyright (c) 2021, Easy Digital Downloads
|
||
|
* @license GPL2+
|
||
|
* @since 2.11.4
|
||
|
*/
|
||
|
|
||
|
namespace EDD\API\v3;
|
||
|
|
||
|
use EDD\Models\Notification;
|
||
|
|
||
|
class Notifications extends Endpoint {
|
||
|
|
||
|
/**
|
||
|
* Registers the endpoints.
|
||
|
*
|
||
|
* @since 2.11.4
|
||
|
*/
|
||
|
public function register() {
|
||
|
register_rest_route(
|
||
|
self::$namespace,
|
||
|
'notifications',
|
||
|
array(
|
||
|
array(
|
||
|
'methods' => \WP_REST_Server::READABLE,
|
||
|
'callback' => array( $this, 'listNotifications' ),
|
||
|
'permission_callback' => array( $this, 'canViewNotification' ),
|
||
|
)
|
||
|
)
|
||
|
);
|
||
|
|
||
|
register_rest_route(
|
||
|
self::$namespace,
|
||
|
'notifications/(?P<id>\d+)',
|
||
|
array(
|
||
|
array(
|
||
|
'methods' => \WP_REST_Server::DELETABLE,
|
||
|
'callback' => array( $this, 'dismissNotification' ),
|
||
|
'permission_callback' => array( $this, 'canViewNotification' ),
|
||
|
'args' => array(
|
||
|
'id' => array(
|
||
|
'description' => __( 'ID of the notification.', 'easy-digital-downloads' ),
|
||
|
'type' => 'integer',
|
||
|
'required' => true,
|
||
|
'validate_callback' => function ( $param, $request, $key ) {
|
||
|
$notification = EDD()->notifications->get( intval( $param ) );
|
||
|
|
||
|
return ! empty( $notification );
|
||
|
},
|
||
|
'sanitize_callback' => function ( $param, $request, $key ) {
|
||
|
return intval( $param );
|
||
|
}
|
||
|
)
|
||
|
),
|
||
|
)
|
||
|
)
|
||
|
);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Whether the current user can view (and dismiss) notifications.
|
||
|
*
|
||
|
* @since 2.11.4
|
||
|
*
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function canViewNotification() {
|
||
|
return current_user_can( 'manage_shop_settings' );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns a list of notifications.
|
||
|
*
|
||
|
* @since 2.11.4
|
||
|
*
|
||
|
* @param \WP_REST_Request $request
|
||
|
*
|
||
|
* @return \WP_REST_Response
|
||
|
*/
|
||
|
public function listNotifications( \WP_REST_Request $request ) {
|
||
|
$active = array_map( function ( Notification $notification ) {
|
||
|
return $notification->toArray();
|
||
|
}, EDD()->notifications->getActiveNotifications() );
|
||
|
|
||
|
// @todo At a later date we may want to receive dismissed notifications too.
|
||
|
/*$dismissed = array_map( function ( Notification $notification ) {
|
||
|
return $notification->toArray();
|
||
|
}, EDD()->notifications->getDismissedNotifications() );*/
|
||
|
|
||
|
return new \WP_REST_Response( array(
|
||
|
'active' => $active,
|
||
|
//'dismissed' => $dismissed,
|
||
|
) );
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Dismisses a single notification.
|
||
|
*
|
||
|
* @since 2.11.4
|
||
|
*
|
||
|
* @param \WP_REST_Request $request
|
||
|
*
|
||
|
* @return \WP_REST_Response
|
||
|
*/
|
||
|
public function dismissNotification( \WP_REST_Request $request ) {
|
||
|
$result = EDD()->notifications->update(
|
||
|
$request->get_param( 'id' ),
|
||
|
array( 'dismissed' => 1 )
|
||
|
);
|
||
|
|
||
|
if ( ! $result ) {
|
||
|
return new \WP_REST_Response( array(
|
||
|
'error' => __( 'Failed to dismiss notification.', 'easy-digital-downloads' ),
|
||
|
), 500 );
|
||
|
}
|
||
|
|
||
|
wp_cache_delete( 'edd_active_notification_count', 'edd_notifications' );
|
||
|
|
||
|
return new \WP_REST_Response( null, 204 );
|
||
|
}
|
||
|
}
|