diff --git a/.gitignore b/.gitignore index ad14b641ee..c9bf1d8fe2 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ phpcs-report.txt !/assets/css/vue-vendor.css !/assets/css/vue-frontend.css !/assets/css/wp-version-before-5-3.css +.vscode diff --git a/includes/REST/OrderControllerV2.php b/includes/REST/OrderControllerV2.php index 98d1b09974..918522e48e 100644 --- a/includes/REST/OrderControllerV2.php +++ b/includes/REST/OrderControllerV2.php @@ -2,6 +2,7 @@ namespace WeDevs\Dokan\REST; +use WC_Customer_Download; use WC_Data_Store; use WP_Error; use WP_REST_Server; @@ -59,6 +60,16 @@ public function register_routes() { 'required' => true, ], ], + 'download_remaining' => [ + 'type' => 'integer', + 'description' => __( 'Download remaining.', 'dokan-lite' ), + 'required' => false, + ], + 'access_expires' => [ + 'type' => 'string', + 'description' => __( 'Access expires.', 'dokan-lite' ), + 'required' => false, + ], ], ], [ @@ -125,10 +136,6 @@ public function register_routes() { public function get_order_downloads( $request ) { global $wpdb; - $user_id = dokan_get_current_user_id(); - $data = []; - $downloads = []; - $download_permissions = $wpdb->get_results( $wpdb->prepare( " @@ -138,38 +145,27 @@ public function get_order_downloads( $request ) { ) ); - $product_ids = wp_list_pluck( $download_permissions, 'product_id' ); - $product_ids = array_unique( $product_ids ); - - $products = wc_get_products( - [ - 'include' => $product_ids, - ] - ); - - $existing_product_ids = wp_list_pluck( $products, 'id' ); + $product_ids = array_unique( wp_list_pluck( $download_permissions, 'product_id' ) ); - $downloads = array_filter( - $download_permissions, - function ( $download ) use ( $existing_product_ids ) { - return in_array( $download->product_id, $existing_product_ids ); + // Create a lookup map for products by ID. + $products = []; + foreach ( $product_ids as $product_id ) { + $product = wc_get_product( $product_id ); + if ( ! $product ) { + continue; } - ); + $products[ $product_id ] = $product; + } - $downloads = array_map( - function ( $download ) use ( $products, $request ) { - $filter_items = array_filter( - $products, - function ( $product ) use ( $download ) { - return $product->get_id() === intval( $download->product_id ); - } - ); - $download->product = reset( $filter_items ); - - return $this->prepare_data_for_response( $download, $request ); - }, - $downloads - ); + // Filter downloads with existing products and prepare response. + $downloads = []; + foreach ( $download_permissions as $download ) { + $product_id = intval( $download->product_id ); + if ( isset( $products_by_id[ $product_id ] ) ) { + $download->product = $products[ $product_id ]; + $downloads[] = $this->prepare_data_for_response( $download, $request ); + } + } $data = $this->format_downloads_data( $downloads, $products ); @@ -230,6 +226,8 @@ public function prepare_data_for_response( $download, $request ) { public function grant_order_downloads( $requests ) { $order_id = intval( $requests->get_param( 'id' ) ); $product_ids = array_filter( array_map( 'absint', (array) wp_unslash( $requests->get_param( 'ids' ) ) ) ); + $remaining = $requests->get_param( 'download_remaining' ); + $expiry = $requests->get_param( 'access_expires' ); $file_counter = 0; $order = dokan()->order->get( $order_id ); $data = []; @@ -244,6 +242,20 @@ public function grant_order_downloads( $requests ) { foreach ( $files as $download_id => $file ) { $inserted_id = wc_downloadable_file_permission( $download_id, $product_id, $order ); + if ( ! $inserted_id ) { + continue; + } + + $download = new WC_Customer_Download( $inserted_id ); + if ( $download ) { + if ( $remaining ) { + $download->set_downloads_remaining( $remaining ); + } + if ( $expiry ) { + $download->set_access_expires( $expiry ); + } + $download->save(); + } if ( $inserted_id ) { ++$file_counter; diff --git a/includes/REST/OrderControllerV3.php b/includes/REST/OrderControllerV3.php index 2306b5c432..f011a47afe 100644 --- a/includes/REST/OrderControllerV3.php +++ b/includes/REST/OrderControllerV3.php @@ -34,21 +34,25 @@ function ( $download ) use ( $products ) { return ! empty( $product_item->get_id() ) && ! empty( $download->product_id ) && absint( $product_item->get_id() ) === absint( $download->product_id ); } ); - $product = reset( $product ); - - $download->product = [ - 'id' => $product->get_id(), - 'name' => $product->get_name(), - 'slug' => $product->get_slug(), - 'link' => $product->get_permalink(), - ]; - - /** - * @var $file \WC_Product_Download - */ - $file = $product->get_file( $download->download_id ); - $download->file_data = $file->get_data(); - $download->file_data['file_title'] = wc_get_filename_from_url( $product->get_file_download_path( $download->download_id ) ); + $product = ! empty( $product ) ? reset( $product ) : null; + + if ( $product ) { + $download->product = [ + 'id' => $product->get_id(), + 'name' => $product->get_name(), + 'slug' => $product->get_slug(), + 'link' => $product->get_permalink(), + ]; + + /** + * @var \WC_Product_Download|false $file + */ + $file = $product->get_file( $download->download_id ); + if ( $file instanceof \WC_Product_Download ) { + $download->file_data = $file->get_data(); + $download->file_data['file_title'] = wc_get_filename_from_url( $product->get_file_download_path( $download->download_id ) ); + } + } return $download; },