BP_REST_Activity_Comment_Endpoint
Activity endpoints.
Description
Source
File: bp-activity/classes/class-bp-rest-activity-comment-endpoint.php
class BP_REST_Activity_Comment_Endpoint extends WP_REST_Controller {
/**
* Activity endpoints class.
*
* @since 0.1.0
*
* @var BP_REST_Activity_Endpoint
*/
protected $activity_endpoint;
/**
* Constructor.
*
* @since 0.1.0
*/
public function __construct() {
$this->namespace = bp_rest_namespace() . '/' . bp_rest_version();
$this->rest_base = buddypress()->activity->id;
$this->activity_endpoint = new BP_REST_Activity_Endpoint();
}
/**
* Register the component routes.
*
* @since 0.1.0
*/
public function register_routes() {
$activity_endpoint = '/' . $this->rest_base . '/(?P<id>[\d]+)';
register_rest_route(
$this->namespace,
$activity_endpoint . '/comment',
array(
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_items' ),
'permission_callback' => array( $this, 'get_items_permissions_check' ),
'args' => $this->get_collection_params(),
),
array(
'methods' => WP_REST_Server::CREATABLE,
'callback' => array( $this, 'create_item' ),
'permission_callback' => array( $this, 'create_item_permissions_check' ),
'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ),
),
'schema' => array( $this, 'get_item_schema' ),
)
);
}
/**
* Retrieve activity comments.
*
* @since 0.1.0
*
* @param WP_REST_Request $request Full details about the request.
*
* @return WP_REST_Response | WP_Error
* @api {GET} /wp-json/buddyboss/v1/activity/:id/comment Get activity comments
* @apiName GetActivityComment
* @apiGroup Activity
* @apiDescription Get all comments for an activity.
* @apiVersion 1.0.0
* @apiPermission LoggedInUser if the site is in Private Network.
* @apiParam {Number} id A unique numeric ID for the activity.
* @apiParam {String=threaded,stream,false} [display_comments=threaded] Comments by default, stream for within stream display, threaded for below each activity item.
*/
public function get_items( $request ) {
$retval = array();
$activity = $this->get_activity_object( $request );
if ( empty( $activity->id ) ) {
return new WP_Error(
'bp_rest_invalid_id',
__( 'Invalid activity ID.', 'buddyboss' ),
array(
'status' => 404,
)
);
}
if ( ! empty( $activity->children ) ) {
$request->set_param( 'context', 'view' );
$retval['comments'] = $this->prepare_activity_comments( $activity->children, $request );
}
$response = rest_ensure_response( $retval );
/**
* Fires after a list of activity details is fetched via the REST API.
*
* @param WP_REST_Response $response The response data.
* @param WP_REST_Request $request The request sent to the API.
*
* @since 0.1.0
*/
do_action( 'bp_rest_activity_comment_get_items', $response, $request );
return $response;
}
/**
* Check if a given request has access to activity comment.
*
* @param WP_REST_Request $request Full data about the request.
*
* @return bool|WP_Error
* @since 0.1.0
*/
public function get_items_permissions_check( $request ) {
$retval = true;
if ( function_exists( 'bp_enable_private_network' ) && true !== bp_enable_private_network() && ! is_user_logged_in() ) {
$retval = new WP_Error(
'bp_rest_authorization_required',
__( 'Sorry, Restrict access to only logged-in members.', 'buddyboss' ),
array(
'status' => rest_authorization_required_code(),
)
);
}
if ( true === $retval && ! bp_is_active( 'activity' ) ) {
$retval = new WP_Error(
'bp_rest_component_required',
__( 'Sorry, Activity component was not enabled.', 'buddyboss' ),
array(
'status' => '404',
)
);
}
/**
* Filter the activity comment permissions check.
*
* @param bool|WP_Error $retval Returned value.
* @param WP_REST_Request $request The request sent to the API.
*
* @since 0.1.0
*/
return apply_filters( 'bp_rest_activity_comment_get_items_permissions_check', $retval, $request );
}
/**
* Create an activity comment.
*
* @param WP_REST_Request $request Full data about the request.
*
* @return WP_REST_Response | WP_Error
* @since 0.1.0
*
* @api {POST} /wp-json/buddyboss/v1/activity/:id/comment Create activity comment
* @apiName CreateActivityComment
* @apiGroup Activity
* @apiDescription Create comment under activity.
* @apiVersion 1.0.0
* @apiPermission LoggedInUser
* @apiParam {Number} id A unique numeric ID for the activity.
* @apiParam {Number} [parent_id] ID of the parent activity/comment item.
* @apiParam {String} content The content of the comment.
* @apiParam {String=threaded,stream,false} [display_comments=threaded] Comments by default, stream for within stream display, threaded for below each activity item.
*/
public function create_item( $request ) {
if ( true === $this->activity_endpoint->bp_rest_activity_content_validate( $request ) ) {
return new WP_Error(
'bp_rest_comment_blank_content',
__( 'Please do not leave the comment area blank.', 'buddyboss' ),
array(
'status' => 400,
)
);
}
if ( empty( $request['parent_id'] ) ) {
$request['parent_id'] = '';
}
if ( empty( $request['content'] ) ) {
$request['content'] = '​';
}
$comment_id = bp_activity_new_comment(
array(
'activity_id' => $request['id'],
'content' => $request['content'],
'parent_id' => $request['parent_id'],
)
);
if ( is_wp_error( $comment_id ) ) {
return new WP_Error(
'comment_error',
esc_html( $comment_id->get_error_message() ),
array(
'status' => 500,
)
);
}
$activity_comment = new BP_Activity_Activity( $comment_id );
$fields_update = $this->update_additional_fields_for_object( $activity_comment, $request );
if ( is_wp_error( $fields_update ) ) {
return $fields_update;
}
$retval = array();
$retval['created'] = true;
if ( empty( $request['display_comments'] ) ) {
$request->set_param( 'display_comments', 'threaded' );
}
$activity = $this->get_activity_object( $request );
if ( ! empty( $activity->children ) ) {
$request->set_param( 'context', 'view' );
$retval['comments'] = $this->prepare_activity_comments( $activity->children, $request );
}
$response = rest_ensure_response( $retval );
/**
* Fires after an activity comment is created via the REST API.
*
* @param WP_REST_Response $response The response data.
* @param WP_REST_Request $request The request sent to the API.
*
* @since 0.1.0
*/
do_action( 'bp_rest_activity_create_item', $response, $request );
return $response;
}
/**
* Checks if a given request has access to create an activity comment.
*
* @param WP_REST_Request $request Full details about the request.
*
* @return bool|WP_Error
* @since 0.1.0
*/
public function create_item_permissions_check( $request ) {
$retval = true;
if ( ! is_user_logged_in() ) {
$retval = new WP_Error(
'bp_rest_authorization_required',
__( 'Sorry, you are not allowed to create an activity comment.', 'buddyboss' ),
array(
'status' => rest_authorization_required_code(),
)
);
}
$activity = $this->get_activity_object( $request );
if ( empty( $activity ) || empty( $activity->id ) ) {
return new WP_Error(
'bp_rest_invalid_id',
__( 'Invalid activity ID.', 'buddyboss' ),
array(
'status' => 404,
)
);
}
/**
* Filter the activity comment `create_item` permissions check.
*
* @param bool|WP_Error $retval Returned value.
* @param WP_REST_Request $request The request sent to the API.
*
* @since 0.1.0
*/
return apply_filters( 'bp_rest_activity_comment_create_item_permissions_check', $retval, $request );
}
/**
* Edit the type of the some properties for the CREATABLE methods.
*
* @param string $method Optional. HTTP method of the request.
*
* @return array Endpoint arguments.
* @since 0.1.0
*/
public function get_endpoint_args_for_item_schema( $method = WP_REST_Server::CREATABLE ) {
$args = $this->get_collection_params();
$key = 'get_item';
if ( WP_REST_Server::CREATABLE === $method ) {
$key = 'create_item';
$args['context']['default'] = 'edit';
$args['content'] = array(
'description' => __( 'The content for the comment.', 'buddyboss' ),
'required' => false,
'type' => 'string',
'validate_callback' => 'rest_validate_request_arg',
);
$args['parent_id'] = array(
'description' => __( 'Parent comment ID.', 'buddyboss' ),
'type' => 'integer',
'validate_callback' => 'rest_validate_request_arg',
'sanitize_callback' => 'absint',
'validate_callback' => 'rest_validate_request_arg',
);
}
/**
* Filters the method query arguments.
*
* @param array $args Query arguments.
* @param string $method HTTP method of the request.
*
* @since 0.1.0
*/
return apply_filters( "bp_rest_activity_comment_{$key}_query_arguments", $args, $method );
}
/**
* Get the plugin schema, conforming to JSON Schema.
*
* @return array
* @since 0.1.0
*/
public function get_item_schema() {
$schema = array(
'$schema' => 'http://json-schema.org/draft-04/schema#',
'title' => 'activity_comments',
'type' => 'object',
'properties' => array(
'created' => array(
'context' => array( 'embed', 'edit' ),
'description' => __( 'Whether the comment created or not.', 'buddyboss' ),
'type' => 'boolean',
'readonly' => true,
),
'comments' => array(
'context' => array( 'embed', 'view', 'edit' ),
'description' => __( 'A list of comments for activity.', 'buddyboss' ),
'type' => 'array',
'readonly' => true,
),
),
);
/**
* Filters the activity details schema.
*
* @param string $schema The endpoint schema.
*/
return apply_filters( 'bp_rest_activity_comment_details_schema', $this->add_additional_fields_schema( $schema ) );
}
/**
* Get the query params for collections of plugins.
*
* @return array
* @since 0.1.0
*/
public function get_collection_params() {
$params = parent::get_collection_params();
$params['context']['default'] = 'view';
// Removing unused params.
unset( $params['search'], $params['page'], $params['per_page'] );
$params['id'] = array(
'description' => __( 'A unique numeric ID for the activity.', 'buddyboss' ),
'type' => 'integer',
'reqiured' => true,
);
$params['display_comments'] = array(
'description' => __( 'Comments by default, stream for within stream display, threaded for below each activity item.', 'buddyboss' ),
'default' => 'threaded',
'enum' => array( 'stream', 'threaded' ),
'type' => 'string',
'sanitize_callback' => 'sanitize_key',
'validate_callback' => 'rest_validate_request_arg',
);
/**
* Filters the collection query params.
*
* @param array $params Query params.
*/
return apply_filters( 'bp_rest_activity_collection_params', $params );
}
/**
* Get activity object.
*
* @param WP_REST_Request $request Full details about the request.
*
* @return BP_Activity_Activity|string An activity object.
* @since 0.1.0
*/
protected function get_activity_object( $request ) {
$activity_id = is_numeric( $request ) ? $request : (int) $request['id'];
$display_comments = ( array_key_exists( 'display_comments', $request ) ? $request['display_comments'] : true );
$activity = bp_activity_get_specific(
array(
'activity_ids' => array( $activity_id ),
'display_comments' => $display_comments,
)
);
if ( is_array( $activity ) && ! empty( $activity['activities'][0] ) ) {
return $activity['activities'][0];
}
return '';
}
/**
* Prepare activity comments.
*
* @param array $comments Comments.
* @param WP_REST_Request $request Full details about the request.
*
* @return array An array of activity comments.
* @since 0.1.0
*/
protected function prepare_activity_comments( $comments, $request ) {
$data = array();
if ( empty( $comments ) ) {
return $data;
}
foreach ( $comments as $comment ) {
$data[] = $this->activity_endpoint->prepare_response_for_collection(
$this->activity_endpoint->prepare_item_for_response( $comment, $request )
);
}
/**
* Filter activity comments returned from the API.
*
* @param array $data An array of activity comments.
* @param array $comments Comments.
* @param WP_REST_Request $request Request used to generate the response.
*
* @since 0.1.0
*/
return apply_filters( 'bp_rest_activity_prepare_comments', $data, $comments, $request );
}
}
Changelog
| Version | Description |
|---|---|
| 0.1.0 | Introduced. |
Methods
- __construct — Constructor.
- create_item — Create an activity comment.
- create_item_permissions_check — Checks if a given request has access to create an activity comment.
- get_activity_object — Get activity object.
- get_collection_params — Get the query params for collections of plugins.
- get_endpoint_args_for_item_schema — Edit the type of the some properties for the CREATABLE methods.
- get_item_schema — Get the plugin schema, conforming to JSON Schema.
- get_items — Retrieve activity comments.
- get_items_permissions_check — Check if a given request has access to activity comment.
- prepare_activity_comments — Prepare activity comments.
- register_routes — Register the component routes.
Questions?
We're always happy to help with code or other questions you might have! Search our developer docs, contact support, or connect with our sales team.