BP_REST_Groups_Details_Endpoint
Groups Details endpoints.
Description
Source
File: bp-groups/classes/class-bp-rest-groups-details-endpoint.php
class BP_REST_Groups_Details_Endpoint extends WP_REST_Controller {
/**
* BP_REST_Groups_Endpoint Instance.
*
* @var BP_REST_Groups_Endpoint
*/
protected $groups_endpoint;
/**
* Constructor.
*
* @since 0.1.0
*/
public function __construct() {
$this->namespace = bp_rest_namespace() . '/' . bp_rest_version();
$this->rest_base = buddypress()->groups->id;
$this->groups_endpoint = new BP_REST_Groups_Endpoint();
}
/**
* Register the component routes.
*
* @since 0.1.0
*/
public function register_routes() {
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/details',
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(),
),
'schema' => array( $this, 'get_item_schema' ),
)
);
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/(?P<id>[\d]+)/detail',
array(
'args' => array(
'id' => array(
'description' => __( 'A unique numeric ID for the Group.', 'buddyboss' ),
'type' => 'integer',
),
),
array(
'methods' => WP_REST_Server::READABLE,
'callback' => array( $this, 'get_item' ),
'permission_callback' => array( $this, 'get_item_permissions_check' ),
),
'schema' => array( $this, 'get_item_schema' ),
)
);
}
/**
* Retrieve groups details.
*
* @param WP_REST_Request $request Full details about the request.
*
* @return WP_REST_Response | WP_Error List of groups object data.
* @since 0.1.0
*
* @api {GET} /wp-json/buddyboss/v1/groups/details Groups Details
* @apiName GetBBGroupsDetails
* @apiGroup Groups
* @apiDescription Retrieve groups details(includes tabs and order_options)
* @apiVersion 1.0.0
*
* @apiParam {String=active,popular,newest,alphabetical} [type] Reorder group by type.
*/
public function get_items( $request ) {
$retval = array();
$retval['tabs'] = $this->get_groups_tabs( $request );
$retval['order_options'] = bp_nouveau_get_component_filters( 'group', 'groups' );
$response = rest_ensure_response( $retval );
/**
* Fires after a list of groups 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_groups_get_items', $response, $request );
return $response;
}
/**
* Check if a given request has access to group details.
*
* @param WP_REST_Request $request Full details about the request.
*
* @return bool|WP_Error
* @since 0.1.0
*/
public function get_items_permissions_check( $request ) {
$retval = true;
if ( ! bp_is_active( 'groups' ) ) {
$retval = new WP_Error(
'bp_rest_component_required',
__( 'Sorry, Groups component was not enabled.', 'buddyboss' ),
array(
'status' => '404',
)
);
}
/**
* Filter the group details 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_group_details_get_items_permissions_check', $retval, $request );
}
/**
* Retrieve groups detail.
*
* @param WP_REST_Request $request Full details about the request.
*
* @return WP_REST_Response | WP_Error List of groups object data.
* @since 0.1.0
*
* @api {GET} /wp-json/buddyboss/v1/groups/:id/detail Group Detail
* @apiName GetBBGroupsDetail
* @apiGroup Groups
* @apiDescription Retrieve groups detail tabs.
* @apiVersion 1.0.0
* @apiPermission LoggedInUser if the site is in Private Network.
* @apiParam {Number} id A unique numeric ID for the Group.
*/
public function get_item( $request ) {
global $bp;
$retval = array();
$group = $this->groups_endpoint->get_group_object( $request );
if ( empty( $group->id ) ) {
$retval = new WP_Error(
'bp_rest_group_invalid_id',
__( 'Invalid group ID.', 'buddyboss' ),
array(
'status' => 404,
)
);
}
/**
* Store temporary variable
*/
$url = ( '/' . bp_get_groups_root_slug() . '/' . bp_get_group_slug( $group ) );
$tempurl = ( ! empty( $_SERVER['REQUEST_URI'] ) ? sanitize_text_field( wp_unslash( $_SERVER['REQUEST_URI'] ) ) : '' );
$tmp_bp = $bp;
/**
* Group navigation tabs creation start
*
* Groups Navigation tab only setup on group page request so for fetch group tabs we need set group url as `REQUEST_URI` forcefully and
* Once our job done switch back to original url.
* With below process BuddyPress state might be change so we need to rest it once our job done.
*
* After set Group url forcefully we need to re-execute core hook which load component and setup tabs for given group.
*/
$_SERVER['REQUEST_URI'] = $url;
// Fixes for the phpunit.
add_filter( 'bp_loggedin_user_id', array( $this, 'bp_rest_get_displayed_user' ), 999 );
add_filter( 'bp_displayed_user_id', array( $this, 'bp_rest_get_displayed_user' ), 999 );
remove_action( 'bp_init', 'bp_register_taxonomies', 2 );
remove_action( 'bp_init', 'bp_register_post_types', 2 );
remove_action( 'bp_init', 'bp_setup_title', 8 );
remove_action( 'bp_init', 'bp_core_load_admin_bar_css', 12 );
remove_action( 'bp_init', 'bp_add_rewrite_tags', 20 );
remove_action( 'bp_init', 'bp_add_rewrite_rules', 30 );
remove_action( 'bp_init', 'bp_add_permastructs', 40 );
remove_action( 'bp_init', 'bp_init_background_updater', 50 );
remove_all_actions( 'bp_actions' );
do_action( 'bp_init' );
// phpcs:ignore
do_action( 'bp_ld_sync/init' ); // We should remove when platform load learndash extention on bp_init.
do_action( 'bp_actions' );
add_action( 'bp_init', 'bp_register_taxonomies', 2 );
add_action( 'bp_init', 'bp_register_post_types', 2 );
add_action( 'bp_init', 'bp_setup_title', 8 );
add_action( 'bp_init', 'bp_core_load_admin_bar_css', 12 );
add_action( 'bp_init', 'bp_add_rewrite_tags', 20 );
add_action( 'bp_init', 'bp_add_rewrite_rules', 30 );
add_action( 'bp_init', 'bp_add_permastructs', 40 );
add_action( 'bp_init', 'bp_init_background_updater', 50 );
$group_slug = $group->slug;
$group_nav = buddypress()->groups->nav;
bp_nouveau_set_nav_item_order( $group_nav, bp_nouveau_get_appearance_settings( 'group_nav_order' ), $group_slug );
$navigation = array();
$default_tab = 'members';
if ( function_exists( 'bp_nouveau_get_appearance_settings' ) ) {
$default_tab = bp_nouveau_get_appearance_settings( 'group_default_tab' );
}
$nav_items = $group_nav->get_secondary(
array(
'parent_slug' => $group_slug,
'user_has_access' => true,
)
);
if ( ! empty( $nav_items ) ) {
foreach ( $nav_items as $nav ) {
$nav = $nav->getArrayCopy();
if ( 'public' !== $group->status && $nav['slug'] === 'courses' && ( ! groups_is_user_member( bp_loggedin_user_id(), $group->id ) && ! bp_current_user_can( 'bp_moderate' ) ) ) {
continue;
}
$name = $nav['name'];
$id = $nav['slug'];
// remove the count numbers.
$name = preg_replace( '/^(.*)(<(.*)<\/(.*)>)/', '$1', $name );
$name = trim( $name );
$tab = array(
'id' => $id,
'title' => $name,
'count' => $this->bp_rest_get_nav_count( $group, $nav ),
'position' => $nav['position'],
'default' => false,
'user_has_access' => $nav['user_has_access'],
'link' => $nav['link'],
'children' => '',
);
if ( $default_tab === $nav['slug'] ) {
$tab['default'] = true;
}
$parent_slug = $group_slug;
if ( 'admin' === $nav['slug'] ) {
$parent_slug .= '_manage';
} elseif ( 'invite' === $nav['slug'] ) {
$parent_slug .= '_invite';
} elseif ( 'photos' === $nav['slug'] ) {
$parent_slug .= '_media';
} elseif ( 'members' === $nav['slug'] ) {
$parent_slug .= '_members';
}
$sub_navs = array();
if ( $group_slug !== $parent_slug ) {
$sub_items = $group_nav->get_secondary(
array(
'parent_slug' => $parent_slug,
'user_has_access' => true,
)
);
if ( ! empty( $sub_items ) ) {
foreach ( $sub_items as $sub_nav ) {
$sub_nav = $sub_nav->getArrayCopy();
$sub_name = $sub_nav['name'];
$sub_id = $sub_nav['slug'];
// remove the count numbers.
$sub_name = preg_replace( '/^(.*)(<(.*)<\/(.*)>)/', '$1', $sub_name );
$sub_name = trim( $sub_name );
$sub_navs[] = array(
'id' => $sub_id,
'title' => $sub_name,
'count' => $this->bp_rest_get_nav_count( $group, $sub_nav ),
'position' => $sub_nav['position'],
'default' => false,
'user_has_access' => $sub_nav['user_has_access'],
'link' => $sub_nav['link'],
'children' => '',
);
}
}
}
$tab['children'] = $sub_navs;
$navigation[] = apply_filters( 'bp_rest_group_tab_' . $id, $tab, $nav );
}
}
$retval['tabs'] = $navigation;
// Fixes for the phpunit.
remove_filter( 'bp_displayed_user_id', array( $this, 'bp_rest_get_displayed_user' ), 999 );
remove_filter( 'bp_loggedin_user_id', array( $this, 'bp_rest_get_displayed_user' ), 999 );
/**
* Group navigation tabs creation End
*
* Switching back to original `REQUEST_URI` and BuddyPress stat.
*/
$_SERVER['REQUEST_URI'] = $tempurl;
$bp = $tmp_bp;
$response = rest_ensure_response( $retval );
/**
* Fires after a list of groups 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_groups_get_item', $response, $request );
return $response;
}
/**
* Check if a given request has access to group details.
*
* @param WP_REST_Request $request Full details about the request.
*
* @return bool|WP_Error
* @since 0.1.0
*/
public function get_item_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( 'groups' ) ) {
$retval = new WP_Error(
'bp_rest_component_required',
__( 'Sorry, Groups component was not enabled.', 'buddyboss' ),
array(
'status' => '404',
)
);
}
$group = $this->groups_endpoint->get_group_object( $request );
if ( true === $retval && empty( $group->id ) ) {
$retval = new WP_Error(
'bp_rest_group_invalid_id',
__( 'Invalid group ID.', 'buddyboss' ),
array(
'status' => 404,
)
);
}
if ( true === $retval && ! is_user_logged_in() && ( 'private' === bp_get_group_status( $group ) || 'hidden' === bp_get_group_status( $group ) ) ) {
$retval = new WP_Error(
'bp_rest_authorization_required',
__( 'Sorry, you are not allowed to view group tabs.', 'buddyboss' ),
array(
'status' => rest_authorization_required_code(),
)
);
}
/**
* Filter the group detail 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_group_details_get_items_permissions_check', $retval, $request );
}
/**
* Get the group details 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' => 'bp_groups_details',
'type' => 'object',
'properties' => array(
'tabs' => array(
'context' => array( 'embed', 'view' ),
'description' => __( 'Groups directory tabs.', 'buddyboss' ),
'type' => 'object',
'readonly' => true,
'items' => array(
'type' => 'array',
),
),
'order_options' => array(
'context' => array( 'embed', 'view' ),
'description' => __( 'Groups order by options.', 'buddyboss' ),
'type' => 'array',
'readonly' => true,
),
),
);
/**
* Filters the group details schema.
*
* @param array $schema The endpoint schema.
*/
return apply_filters( 'bp_rest_group_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 = array(
'type' => array(
'description' => __( 'Filter by.. active(Last Active), popular(Most Members), newest(Newly Created), alphabetical(Alphabetical)', 'buddyboss' ),
'type' => 'string',
'enum' => array( 'active', 'popular', 'newest', 'alphabetical' ),
'validate_callback' => 'rest_validate_request_arg',
),
);
/**
* Filters the collection query params.
*
* @param array $params Query params.
*/
return apply_filters( 'bp_rest_groups_details_collection_params', $params );
}
/**
* Get Groups tabs.
*
* @param WP_REST_Request $request The request sent to the API.
*
* @return array
*/
public function get_groups_tabs( $request ) {
$type = $request->get_param( 'type' );
$tabs = array();
$tabs_items = bp_nouveau_get_groups_directory_nav_items();
if ( ! empty( $tabs_items ) ) {
foreach ( $tabs_items as $key => $item ) {
$tabs[ $key ]['title'] = $item['text'];
$tabs[ $key ]['position'] = $item['position'];
$tabs[ $key ]['count'] = $this->get_group_tab_count( $item['slug'], $type );
}
}
return $tabs;
}
/**
* Get group count for the tab.
*
* @param sting $slug Group tab object slug.
* @param string $type Active, newest, alphabetical, random, popular.
*
* @return int
*/
protected function get_group_tab_count( $slug, $type ) {
$count = 0;
$user_id = ! empty( get_current_user_id() ) ? ( get_current_user_id() ) : false;
switch ( $slug ) {
case 'all':
$groups = groups_get_groups( array( 'type' => $type ) );
if ( ! empty( $groups ) && isset( $groups['total'] ) ) {
$count = $groups['total'];
}
break;
case 'personal':
$groups = groups_get_groups(
array(
'type' => $type,
'user_id' => $user_id,
)
);
if ( ! empty( $groups ) && isset( $groups['total'] ) ) {
$count = $groups['total'];
}
break;
}
return $count;
}
/**
* Retrieve the count attribute for the current nav item.
*
* @param BP_Groups_Group $group Optional. Group object. Default: current group in loop.
* @param array $nav Navigation array.
*
* @return int The count attribute for the nav item.
*/
protected function bp_rest_get_nav_count( $group, $nav ) {
$nav_item = $nav['slug'];
if ( 'members' === $nav_item || 'all-members' === $nav_item ) {
$count = $group->total_member_count;
} elseif ( 'subgroups' === $nav_item ) {
$count = count( bp_get_descendent_groups( $group->id, bp_loggedin_user_id() ) );
} elseif ( bp_is_active( 'media' ) && bp_is_group_media_support_enabled() && 'photos' === $nav_item && function_exists( 'bp_is_group_media_support_enabled' ) ) {
$count = bp_media_get_total_group_media_count( $group->id );
} elseif ( bp_is_active( 'media' ) && bp_is_group_albums_support_enabled() && 'albums' === $nav_item && function_exists( 'bp_is_group_albums_support_enabled' ) ) {
$count = bp_media_get_total_group_album_count( $group->id );
} elseif ( 'leaders' === $nav_item ) {
$admins = groups_get_group_admins( $group->id );
$mods = groups_get_group_mods( $group->id );
$count = count( $admins ) + count( $mods );
}
if ( ! isset( $count ) ) {
return false;
}
return $count;
}
/**
* Set current and display user with current user.
*
* @param int $user_id The user id.
*
* @return int
*/
public function bp_rest_get_displayed_user( $user_id ) {
return get_current_user_id();
}
}
Changelog
| Version | Description |
|---|---|
| 0.1.0 | Introduced. |
Methods
- __construct — Constructor.
- bp_rest_get_displayed_user — Set current and display user with current user.
- bp_rest_get_nav_count — Retrieve the count attribute for the current nav item.
- bp_rest_legacy_get_group_component_filters — Legacy template group directory filter support added.
- bp_rest_legacy_get_groups_directory_nav_items — Legacy template group directory navigation support added.
- get_collection_params — Get the query params for collections of plugins.
- get_group_tab_count — Get group count for the tab.
- get_groups_tabs — Get Groups tabs.
- get_item — Retrieve groups detail.
- get_item_permissions_check — Check if a given request has access to group details.
- get_item_schema — Get the group details schema, conforming to JSON Schema.
- get_items — Retrieve groups details.
- get_items_permissions_check — Check if a given request has access to group details.
- 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.