'upload_error',
'message' => $bd_file['error'],
) );
}
$name_parts = pathinfo( $bd_file['file'] );
$url = $bd_file['url'];
$mime = $bd_file['type'];
$file = $bd_file['file'];
$title = $name_parts['filename'];
/**
* @todo check it has no impact on BuddyDrive Editor
*/
$privacy = buddydrive_get_default_privacy();
$groups = array();
$parent_folder_id = 0;
if ( ! empty( $bp_params['parent_folder_id'] ) ) {
$parent_folder_id = (int) $bp_params['parent_folder_id'];
}
if ( ! empty( $bp_params['privacy'] ) ) {
$privacy = $bp_params['privacy'];
if ( ! empty( $bp_params['privacy_item_id'] ) && 'groups' === $privacy ) {
$groups = (array) $bp_params['privacy_item_id'];
}
}
$buddyfile_id = buddydrive_add_item( array(
'user_id' => $bp_params['item_id'],
'type' => buddydrive_get_file_post_type(),
'guid' => $url,
'title' => $title,
'mime_type' => $mime,
'privacy' => $privacy,
'groups' => $groups,
'parent_folder_id' => $parent_folder_id,
) );
if ( empty( $buddyfile_id ) ) {
bp_attachments_json_response( false, $is_html4, array(
'type' => 'upload_error',
'message' => __( 'Error while creating the file, sorry.', 'buddydrive' ),
) );
} else {
// Try to create a thumbnail if it's an image and a public file
if ( 'public' === $privacy ) {
buddydrive_set_thumbnail( $buddyfile_id, $bd_file );
}
}
$response = buddydrive_prepare_for_js( $buddyfile_id );
$response['buddydrive_id'] = $response['id'];
$response['url'] = $response['link'];
$response['uploaded'] = true;
unset( $response['id'] );
// Finally return file to the editor
bp_attachments_json_response( true, $is_html4, $response );
}
add_action( 'wp_ajax_buddydrive_upload', 'buddydrive_upload_file' );
/**
* Fetch BuddyDrive Items for the current scope
*
* @since 2.0.0
*
* @return string JSON reply
*/
function buddydrive_fetch_items() {
if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) ) {
wp_send_json_error( array(
'message' => __( 'The action was not sent correctly.', 'buddydrive' ),
) );
}
$not_allowed = array( 'message' => __( 'You are not allowed to perform this action.', 'buddydrive' ) );
// Nonce check
if ( empty( $_POST['buddydrive_nonce'] ) || ! wp_verify_nonce( $_POST['buddydrive_nonce'], 'buddydrive_fetch_items' ) ) {
wp_send_json_error( $not_allowed );
}
$defaults = array(
'paged' => 1,
'per_page' => 20,
'type' => array( buddydrive_get_folder_post_type(), buddydrive_get_file_post_type() ),
'orderby' => 'modified',
'order' => 'DESC',
'buddydrive_scope' => buddydrive_get_current_scope(),
);
if ( bp_is_user() ) {
$defaults['user_id'] = bp_displayed_user_id();
} elseif ( bp_is_group() ) {
$defaults['group_id'] = bp_get_current_group_id();
}
// Ajax ~ is_admin()
if ( 'admin' === $defaults['buddydrive_scope'] && is_buddypress() ) {
$defaults['buddydrive_scope'] = 'public';
}
$query_args = bp_parse_args( $_POST, $defaults, 'buddydrive_fetch_items' );
if ( 'title' === $query_args['orderby'] ) {
$query_args['order'] = 'ASC';
}
$buddydrive_items = new BuddyDrive_Item;
$buddydrive_items->get( $query_args );
$items = array_map( 'buddydrive_prepare_for_js', array_filter( (array) $buddydrive_items->query->posts ) );
// Pagination
$metas = array( 'paged' => (int) $query_args['paged'], 'has_more_items' => false );
$found_items = (int) $buddydrive_items->query->found_posts;
if ( 0 < $found_items ) {
$metas['has_more_items'] = (bool) floor( ( $found_items - 1 ) / ( 20 * (int) $query_args['paged'] ) );
}
// Make sure to fetch additional data for the parent folder if needed
if ( ! empty( $query_args['buddydrive_parent'] ) ) {
$post_parent = buddydrive_get_buddyfile( $query_args['buddydrive_parent'], buddydrive_get_folder_post_type() );
$metas['post_parent_title'] = $post_parent->title;
$metas['post_parent_owner'] = $post_parent->user_id;
$labels = buddydrive_get_sharing_options();
$metas['post_parent_infos'] = sprintf(
_x( 'Files added to this folder will have the following privacy: %s', 'Parent folder privacy infos', 'buddydrive' ),
esc_html( $labels[ $post_parent->check_for ] )
);
if ( 'buddydrive_groups' === $post_parent->post_status ) {
$groups = wp_parse_id_list( $post_parent->group );
$group_id = reset( $groups );
if ( bp_is_group() && (int) bp_get_current_group_id() === (int) $group_id ) {
$object = groups_get_current_group();
} elseif ( bp_is_active( 'groups' ) ) {
$object = groups_get_group( array( 'group_id' => $group_id ) );
}
if ( ! empty( $object->id ) ) {
$object->buddydrive_type = 'group';
$group = buddydrive_prepare_bpobject_js( $object );
$metas['post_parent_infos'] = sprintf(
_x( 'Files added to this folder will be accessible to members of this group: %s', 'Parent folder privacy infos', 'buddydrive' ),
sprintf(
'%3$s',
esc_url_raw( $group['link'] ),
esc_attr( $group['name'] ),
$group['avatar']
)
);
}
} elseif ( 'buddydrive_members' === $post_parent->post_status ) {
$members = wp_parse_id_list( $post_parent->members );
if ( ! empty( $members ) ) {
$objects = buddydrive_list_objects( array( 'buddydrive_type' => 'members', 'include' => $members ) );
$avatars = array();
foreach ( $objects as $object ) {
$object = buddydrive_prepare_bpobject_js( $object );
if ( empty( $object['name'] ) ) {
continue;
}
$avatars[] = sprintf(
'%3$s',
esc_url_raw( $object['link'] ),
esc_attr( $object['name'] ),
$object['avatar']
);
}
if ( ! empty( $avatars ) ) {
$metas['post_parent_infos'] = sprintf(
_x( 'Files added to this folder will be accessible to the following members: %s', 'Parent folder privacy infos', 'buddydrive' ),
join( ' ', $avatars )
);
}
}
}
// Capability check for the folder!
$can_list = buddydrive_check_download( $post_parent, bp_loggedin_user_id() );
if ( is_wp_error( $can_list ) && 'empty_password' !== $can_list->get_error_code() ) {
wp_send_json_error( $not_allowed );
}
}
if ( empty( $items ) ) {
$metas['no_items_found'] = __( 'No items found.', 'buddydrive' );
// Capability check for the edit action
} elseif ( ! empty( $query_args['id'] ) && ! empty( $query_args['is_edit' ] ) ) {
$item = reset( $items );
if ( empty( $item['can_edit'] ) ) {
wp_send_json_error( $not_allowed );
}
}
wp_send_json_success( array( 'items' => $items, 'metas' => $metas ) );
}
add_action( 'wp_ajax_buddydrive_fetch_items', 'buddydrive_fetch_items' );
add_action( 'wp_ajax_nopriv_buddydrive_fetch_items', 'buddydrive_fetch_items' );
/**
* Edit a BuddyDrive Item
*
* @since 2.0.0
*
* @return string JSON reply
*/
function buddydrive_item_update() {
if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) ) {
wp_send_json_error( array(
'message' => __( 'The action was not sent correctly.', 'buddydrive' ),
) );
}
// Nonce check
if ( empty( $_POST['buddydrive_nonce'] ) || ! wp_verify_nonce( $_POST['buddydrive_nonce'], 'buddydrive_update_item' ) ) {
wp_send_json_error( array(
'message' => __( 'You are not allowed to perform this action.', 'buddydrive' ),
) );
}
$r = wp_parse_args( $_POST, array(
'id' => 0,
) );
$error = array( 'message' => __( 'Unknown item.', 'buddydrive' ) );
if ( empty( $r['id'] ) ) {
wp_send_json_error( $error );
}
// Validate file
$item = buddydrive_get_buddyfile( (int) $r['id'], array( buddydrive_get_folder_post_type(), buddydrive_get_file_post_type() ) );
if ( ! $item->ID ) {
wp_send_json_error( $error );
}
if ( 'folder' === $r['privacy'] ) {
// Set default privacy
$r['privacy'] = buddydrive_get_default_privacy();
// One folder & one only
if ( ! empty( $r['folder'] ) ) {
$r['parent_folder_id'] = reset( wp_parse_id_list( $r['folder'] ) );
}
}
if ( ! buddydrive_update_item( $r, $item ) ) {
wp_send_json_error( array(
'message' => __( 'Something went wrong. Please try again later.', 'buddydrive' ),
) );
}
wp_send_json_success( array(
'message' => __( 'Item updated successfully.', 'buddydrive' ),
) );
}
add_action( 'wp_ajax_buddydrive_item_update', 'buddydrive_item_update' );
/**
* Fetch objetcs for advanced privacy options
*
* @since 2.0.0
*
* @return string JSON reply.
*/
function buddydrive_get_bpobjects() {
if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) ) {
wp_send_json_error( array(
'message' => __( 'The action was not sent correctly.', 'buddydrive' ),
) );
}
// Nonce check
if ( empty( $_POST['buddydrive_nonce'] ) || ! wp_verify_nonce( $_POST['buddydrive_nonce'], 'buddydrive_fetch_objects' ) ) {
wp_send_json_error( array(
'message' => __( 'You are not allowed to perform this action.', 'buddydrive' ),
) );
}
$r = wp_parse_args( $_POST, array(
'include' => array(),
'user_id' => bp_loggedin_user_id(),
'search_terms' => '',
'buddydrive_type' => ''
) );
if ( bp_is_group() ) {
$r['buddydrive_scope'] = 'groups';
$r['group_id'] = bp_get_current_group_id();
}
$objects = buddydrive_list_objects( $r );
if ( empty( $objects ) ) {
wp_send_json_error( array( 'error' => __( 'No items were found.', 'buddydrive' ) ) );
} else {
wp_send_json_success( array_map( 'buddydrive_prepare_bpobject_js', $objects ) );
}
}
add_action( 'wp_ajax_buddydrive_get_bpobjects', 'buddydrive_get_bpobjects' );
/**
* Bulk Edit items
*
* @since 2.0.0
*
* @return string JSON reply.
*/
function buddydrive_bulk_edit_items() {
if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) ) {
wp_send_json_error( array(
'message' => __( 'The action was not sent correctly.', 'buddydrive' ),
) );
}
// Nonce check
if ( empty( $_POST['buddydrive_nonce'] ) || ! wp_verify_nonce( $_POST['buddydrive_nonce'], 'buddydrive_bulk_edit' ) ) {
wp_send_json_error( array(
'message' => __( 'You are not allowed to perform this action.', 'buddydrive' ),
) );
}
$r = wp_parse_args( $_POST, array() );
$error = array( 'error' => __( 'An unexpected error occured.', 'buddydrive' ) );
if ( empty( $r['type'] ) ) {
wp_send_json_error( $error );
}
if ( empty( $r['items'] ) ) {
wp_send_json_error( array( 'error' => __( 'No items were sent.', 'buddydrive' ) ) );
}
$bulk_edited = array();
if ( 'delete' === $r['type'] ) {
$bulk_edited = buddydrive_delete_item( array( 'ids' => $r['items'], 'user_id' => false ) );
} elseif ( 'remove' === $r['type'] ) {
$bulk_edited = buddydrive_items_remove_parent( $r['items'] );
} elseif ( 'group_remove' === $r['type'] ) {
$bulk_edited = buddydrive_items_remove_from_group( $r['items'] );
}
if ( empty( $bulk_edited ) ) {
wp_send_json_error( $error );
}
wp_send_json_success( $bulk_edited );
}
add_action( 'wp_ajax_buddydrive_bulk_edit_items', 'buddydrive_bulk_edit_items' );
/**
* Creates a new BuddyDrive folder
*
* @since 2.0.0
*
* @return string JSON reply.
*/
function buddydrive_add_folder() {
$error = array( 'error' => __( 'An unexpected error occured.', 'buddydrive' ) );
if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) ) {
wp_send_json_error( $error );
}
$not_allowed = array( 'message' => __( 'You are not allowed to perform this action.', 'buddydrive' ) );
// Nonce check
if ( empty( $_POST['buddydrive_nonce'] ) || ! wp_verify_nonce( $_POST['buddydrive_nonce'], 'buddydrive_new_folder' ) ) {
wp_send_json_error( $not_allowed );
}
// Capability check
if ( ! buddydrive_current_user_can( 'buddydrive_upload' ) ) {
wp_send_json_error( $not_allowed );
}
$r = wp_parse_args( $_POST, array(
'privacy' => buddydrive_get_default_privacy(),
) );
if ( empty( $r['title'] ) ) {
wp_send_json_error( $error );
}
$args = array(
'type' => buddydrive_get_folder_post_type(),
'title' => esc_html( $r['title'] ),
'privacy' => buddydrive_get_privacy( 'buddydrive_' . $r['privacy'] ),
);
// Bail if it's an unknown status.
if ( ! $args['privacy'] ) {
wp_send_json_error( $error );
}
// Allow admins to create folders in other users BuddyDrive
if ( ! empty( $r['user_id'] ) && bp_current_user_can( 'bp_moderate' ) ) {
$args['user_id'] = (int) $r['user_id'];
}
if ( bp_is_group() ) {
$args = array_merge( $args,
array(
'privacy' => buddydrive_get_privacy( 'buddydrive_groups' ),
'groups' => array( bp_get_current_group_id() ),
) );
}
$folder_id = buddydrive_add_item( $args );
$folder = get_post( $folder_id );
if ( empty( $folder->ID ) ) {
wp_send_json_error( $error );
} else {
$folder->new_folder = true;
}
wp_send_json_success( buddydrive_prepare_for_js( $folder ) );
}
add_action( 'wp_ajax_buddydrive_add_folder', 'buddydrive_add_folder');
/**
* Get the current user statistics
*
* @since 2.0.0
*
* @return string JSON reply.
*/
function buddydrive_get_stats() {
$error = array( 'error' => __( 'An unexpected error occured.', 'buddydrive' ) );
if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) ) {
wp_send_json_error( $error );
}
$not_allowed = array( 'message' => __( 'You are not allowed to perform this action.', 'buddydrive' ) );
// Nonce check
if ( empty( $_POST['buddydrive_nonce'] ) || ! wp_verify_nonce( $_POST['buddydrive_nonce'], 'buddydrive_user_stats' ) ) {
wp_send_json_error( $not_allowed );
}
$user_id = bp_loggedin_user_id();
$space_used = buddydrive_get_user_space_data( $user_id );
$total = 0;
$response = array(
'id' => $user_id,
'used' => number_format_i18n( $space_used['percent'], 2 ),
'detail' => array(),
'total' => '',
);
$stats = BuddyDrive_Item::get_user_stats( $user_id );
if ( ! empty( $stats) ) {
$buddydrive_status = buddydrive_get_stati();
foreach ( $stats as $stat ) {
if ( ! isset( $buddydrive_status[ $stat->post_status ]['label'] ) ) {
continue;
}
$response['detail'][] = array(
'type' => $buddydrive_status[ $stat->post_status ]['buddydrive_privacy'],
'label' => $buddydrive_status[ $stat->post_status ]['label'],
'stat' => sprintf( _n( '%d file', '%d files', $stat->num, 'buddydrive' ), number_format_i18n( $stat->num ) ),
);
$total += $stat->num;
}
}
if ( ! empty( $total ) ) {
$response['total'] = sprintf( _n( '(%d file)', '(%d files)', $total, 'buddydrive' ), number_format_i18n( $total ) );
}
wp_send_json_success( $response );
}
add_action( 'wp_ajax_buddydrive_get_stats', 'buddydrive_get_stats' );