2023-05-22 13:43:10 -04:00
|
|
|
<?php
|
|
|
|
|
/**
|
|
|
|
|
* Mutation - updateSession
|
|
|
|
|
*
|
|
|
|
|
* Registers mutation for updating session meta data.
|
|
|
|
|
*
|
|
|
|
|
* @package WPGraphQL\WooCommerce\Mutation
|
|
|
|
|
* @since 0.12.5
|
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
namespace WPGraphQL\WooCommerce\Mutation;
|
|
|
|
|
|
|
|
|
|
use GraphQL\Error\UserError;
|
|
|
|
|
use WPGraphQL\WooCommerce\Data\Mutation\Cart_Mutation;
|
|
|
|
|
use WPGraphQL\WooCommerce\Model\Customer;
|
|
|
|
|
|
|
|
|
|
/**
|
2024-08-07 12:39:45 -04:00
|
|
|
* Class - Session_Update
|
2023-05-22 13:43:10 -04:00
|
|
|
*/
|
2024-08-07 12:39:45 -04:00
|
|
|
class Session_Update {
|
2023-05-22 13:43:10 -04:00
|
|
|
/**
|
|
|
|
|
* Registers mutation
|
2023-06-13 23:17:02 +03:00
|
|
|
*
|
|
|
|
|
* @return void
|
2023-05-22 13:43:10 -04:00
|
|
|
*/
|
|
|
|
|
public static function register_mutation() {
|
|
|
|
|
register_graphql_mutation(
|
|
|
|
|
'updateSession',
|
|
|
|
|
[
|
|
|
|
|
'inputFields' => self::get_input_fields(),
|
|
|
|
|
'outputFields' => self::get_output_fields(),
|
|
|
|
|
'mutateAndGetPayload' => self::mutate_and_get_payload(),
|
|
|
|
|
]
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Defines the mutation input field configuration
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public static function get_input_fields() {
|
|
|
|
|
return [
|
|
|
|
|
'sessionData' => [
|
|
|
|
|
'type' => [ 'list_of' => 'MetaDataInput' ],
|
2026-03-30 23:37:51 -04:00
|
|
|
'description' => static function () {
|
2026-06-30 10:16:21 -04:00
|
|
|
return __( 'Data to be persisted in the session.', 'graphql-for-ecommerce' );
|
2026-03-30 23:37:51 -04:00
|
|
|
},
|
2023-05-22 13:43:10 -04:00
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Defines the mutation output field configuration
|
|
|
|
|
*
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
|
|
|
|
public static function get_output_fields() {
|
|
|
|
|
return [
|
|
|
|
|
'session' => [
|
|
|
|
|
'type' => [ 'list_of' => 'MetaData' ],
|
2023-11-30 15:41:32 +02:00
|
|
|
'resolve' => static function () {
|
2023-06-13 23:17:02 +03:00
|
|
|
/**
|
|
|
|
|
* Session handler.
|
|
|
|
|
*
|
2023-07-19 23:01:50 +03:00
|
|
|
* @var \WPGraphQL\WooCommerce\Utils\QL_Session_Handler $session
|
2023-06-13 23:17:02 +03:00
|
|
|
*/
|
|
|
|
|
$session = \WC()->session;
|
|
|
|
|
$session_data = $session->get_session_data();
|
2023-05-22 13:43:10 -04:00
|
|
|
$session = [];
|
|
|
|
|
foreach ( $session_data as $key => $value ) {
|
|
|
|
|
$meta = new \stdClass();
|
|
|
|
|
$meta->id = null;
|
|
|
|
|
$meta->key = $key;
|
|
|
|
|
$meta->value = maybe_unserialize( $value );
|
|
|
|
|
$session[] = $meta;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $session;
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
'customer' => [
|
|
|
|
|
'type' => 'Customer',
|
2023-07-19 22:56:42 +03:00
|
|
|
'resolve' => static function () {
|
2023-05-22 13:43:10 -04:00
|
|
|
return new Customer( 'session' );
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Defines the mutation data modification closure.
|
|
|
|
|
*
|
|
|
|
|
* @return callable
|
|
|
|
|
*/
|
|
|
|
|
public static function mutate_and_get_payload() {
|
2023-11-30 15:41:32 +02:00
|
|
|
return static function ( $input ) {
|
2023-05-22 13:43:10 -04:00
|
|
|
Cart_Mutation::check_session_token();
|
|
|
|
|
|
|
|
|
|
// Guard against missing input.
|
|
|
|
|
if ( empty( $input['sessionData'] ) ) {
|
2026-06-30 10:16:21 -04:00
|
|
|
throw new UserError( __( 'No session data provided', 'graphql-for-ecommerce' ) );
|
2023-05-22 13:43:10 -04:00
|
|
|
}
|
|
|
|
|
$session_data_input = $input['sessionData'];
|
|
|
|
|
|
2023-06-13 23:17:02 +03:00
|
|
|
/**
|
|
|
|
|
* Session handler.
|
|
|
|
|
*
|
2023-07-19 23:01:50 +03:00
|
|
|
* @var \WPGraphQL\WooCommerce\Utils\QL_Session_Handler $session
|
2023-06-13 23:17:02 +03:00
|
|
|
*/
|
|
|
|
|
$session = \WC()->session;
|
|
|
|
|
|
2023-05-22 13:43:10 -04:00
|
|
|
// Save session data input.
|
|
|
|
|
foreach ( $session_data_input as $meta ) {
|
2023-06-13 23:17:02 +03:00
|
|
|
$session->set( $meta['key'], $meta['value'] );
|
2023-05-22 13:43:10 -04:00
|
|
|
}
|
|
|
|
|
|
2023-06-13 23:17:02 +03:00
|
|
|
if ( is_a( $session, '\WC_Session_Handler' ) ) {
|
|
|
|
|
$session->save_data();
|
2023-05-22 13:43:10 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
do_action( 'woographql_update_session', true );
|
|
|
|
|
|
|
|
|
|
// Process errors or return successful.
|
2023-06-13 23:17:02 +03:00
|
|
|
$notices = $session->get( 'wc_notices' );
|
2023-05-22 13:43:10 -04:00
|
|
|
if ( ! empty( $notices['error'] ) ) {
|
|
|
|
|
$error_messages = implode( ' ', array_column( $notices['error'], 'notice' ) );
|
|
|
|
|
\wc_clear_notices();
|
|
|
|
|
throw new UserError( $error_messages );
|
|
|
|
|
} else {
|
|
|
|
|
return [ 'status' => 'SUCCESS' ];
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
}
|