Files
carpseeds.pl/wp-content/plugins/przelewy24/includes/subscription/class-p24-subscription-user.php
2024-07-15 11:28:08 +02:00

219 lines
5.7 KiB
PHP

<?php
/**
* File that define P24_Subscription_User class.
*
* @package Przelewy24
*/
defined( 'ABSPATH' ) || exit;
/**
* Class P24_Subscription_User
*/
class P24_Subscription_User {
/**
* The P24_Core instance.
*
* @var P24_Core
*/
private $plugin_core;
/**
* The constructor.
*
* @param P24_Core $plugin_core The P24_Core instance.
*/
public function __construct( P24_Core $plugin_core ) {
$this->plugin_core = $plugin_core;
}
/**
* Extend nav.
*
* @param array $endpoints Default endpoints.
* @param array $descriptions Additional endpoints description.
* @return array
*/
public function extend_nav( $endpoints, $descriptions ) {
$endpoints['p24-subscriptions-user'] = __( 'Subskrypcje P24' );
return $endpoints;
}
/**
* Set nav url.
*
* @param string $url Proposed url.
* @param string $endpoint Endpoint name.
* @param string $value Unused in our context.
* @param string $permalink Unused in our context.
* @return string
*/
public function set_nav_url( $url, $endpoint, $value, $permalink ) {
if ( 'p24-subscriptions-user' === $endpoint ) {
$post = get_post( P24_Subscription_Config::page_id() );
if ( $post ) {
$url = get_post_permalink( $post );
}
}
return $url;
}
/**
* Get post data.
*
* There are problems with arrays in $_POST. This is workaround.
*/
private function get_post() {
/* We are forced to verify nonce in this place. */
if ( isset( $_POST['p24_nonce'] ) ) {
$nonce = sanitize_key( $_POST['p24_nonce'] );
if ( ! wp_verify_nonce( $nonce, 'p24_action' ) ) {
return array();
}
}
return $_POST;
}
/**
* Process form.
*
* @param WP_User $user The active user.
* @param array $cards The user cards.
*/
private function process_form( $user, $cards ) {
$valid_keys = array_map(
function ( $card ) {
return $card->custom_key;
},
$cards
);
$post = $this->get_post();
if ( ! $post ) {
return;
}
if ( ! array_key_exists( 'p24_action_type_field', $post ) ) {
return;
} elseif ( 'user_subscriptions' !== $post['p24_action_type_field'] ) {
return;
} elseif ( ! array_key_exists( 'card_for_subscription', $post ) ) {
return;
}
$cards_for_subscription = wp_unslash( $post['card_for_subscription'] );
foreach ( $cards_for_subscription as $subscription_id => $card_ref ) {
if ( in_array( $card_ref, $valid_keys, true ) ) {
P24_Subscription_Db::update_card_reference( (int) $subscription_id, $card_ref );
} else {
P24_Subscription_Db::clear_card_reference( (int) $subscription_id );
}
}
}
/**
* Render.
*/
public function render() {
$user = wp_get_current_user();
if ( $user->ID ) {
$cards = WC_Gateway_Przelewy24::get_all_cards( (int) $user->ID );
$this->process_form( $user, $cards );
$subscriptions = P24_Subscription_Db::get_active_list_for_user( $user );
$files = $this->get_all_files_for_user( $user );
$inactive = P24_Subscription_Db::get_inactive_list_for_user( $user );
} else {
$cards = array();
$subscriptions = array();
$files = array();
$inactive = array();
}
$data = compact( 'user', 'subscriptions', 'cards', 'files', 'inactive' );
$this->plugin_core->render_template( 'subscriptions-user', $data );
}
/**
* Find file.
*
* @param WP_User $user Use of interest.
* @param int $subscription_id Subscription id.
* @param string $file_name File name.
* @return array|null
*/
private function find_file( $user, $subscription_id, $file_name ) {
$subscription_id = (int) $subscription_id;
$file_name = (string) $file_name;
$subscriptions = P24_Subscription_Db::get_active_list_for_user( $user );
foreach ( $subscriptions as $subscription ) {
if ( (int) $subscription->record_id === $subscription_id ) {
$files = P24_Subscription::files_for_subscription( $subscription->product_id );
foreach ( $files as $file ) {
if ( $file['name'] === $file_name ) {
return $file;
}
}
return null;
}
}
return null;
}
/**
* Get all files for user.
*
* @param WP_User $user Use of interest.
* @return array
*/
private function get_all_files_for_user( $user ) {
$all_files = array();
$subscriptions = P24_Subscription_Db::get_active_list_for_user( $user );
foreach ( $subscriptions as $subscription ) {
$files = P24_Subscription::files_for_subscription( $subscription->product_id );
array_walk(
$files,
function ( &$record ) use ( $subscription ) {
$record['parent_id'] = $subscription->record_id;
$record['name_url'] = rawurlencode( $record['name'] );
}
);
$all_files = array_merge( $all_files, $files );
}
return $all_files;
}
/**
* Try download.
*
* @throws LogicException The callee should finish script.
*/
public function try_download() {
global $current_user;
if ( ! $current_user || ! $current_user->ID ) {
return;
}
wp_verify_nonce( null );
if ( isset( $_GET['subscription_id'] ) && isset( $_GET['file_name'] ) && isset( $_GET['p24'] ) && isset( $_GET['download'] ) ) {
$subscription_id = sanitize_text_field( wp_unslash( $_GET['subscription_id'] ) );
$file_name = sanitize_text_field( wp_unslash( $_GET['file_name'] ) );
$file = $this->find_file( $current_user, $subscription_id, $file_name );
if ( $file ) {
WC_Download_Handler::download_file_xsendfile( $file['url'], $file['name'] );
exit();
}
}
}
/**
* Bind events.
*/
public function bind_core_events() {
add_filter( 'woocommerce_account_menu_items', array( $this, 'extend_nav' ), 10, 2 );
add_filter( 'woocommerce_get_endpoint_url', array( $this, 'set_nav_url' ), 10, 4 );
add_action( 'init', array( $this, 'try_download' ) );
add_shortcode( 'p24_user_subscription', array( $this, 'render' ) );
}
}