->get_user_session(); } else { return $this->get_anonymous_session(); } } /** * Create a new session (either user or anonymous) */ public function create_session($user_email = null) { if ($user_email || is_user_logged_in()) { return $this->create_user_session($user_email); } else { return $this->create_anonymous_session(); } } /** * Create customer session with provided data (for checkout) */ public function create_customer_session_with_data($customer_data) { // First try to get or create the customer $customer = $this->get_or_create_customer_with_data($customer_data); if (!$customer) { $this->log_session_event('Failed to get/create customer', $customer_data); return false; } // Create authenticated session for this customer $query = ' mutation CreateCustomerSession($email: String!) { createCustomerSession(email: $email) { authToken success message customer { id email firstName lastName } } } '; $variables = array('email' => $customer_data['email']); $response = $this->make_graphql_request($this->booking_endpoint, $query, $variables); if ($response && $response['status_code'] == 200) { $data = $response['data']; if (isset($data['data']['createCustomerSession']['success']) && $data['data']['createCustomerSession']['success']) { $auth_token = $data['data']['createCustomerSession']['authToken']; $session_cookie = $this->extract_session_cookie($response); $customer_info = $data['data']['createCustomerSession']['customer']; $session_data = array( 'auth_token' => $auth_token, 'session_cookie' => $session_cookie, 'is_anonymous' => false, 'created_at' => time(), 'customer' => $customer_info, 'customer_data' => $customer_data ); // Store in session for immediate use WC()->session->set('coverwell_timewise_session', $session_data); $this->log_session_event('Customer session created for checkout', $session_data); return $session_data; } } $this->log_session_event('Failed to create customer session', array( 'customer_data' => $customer_data, 'response' => $response )); return false; } /** * Get or create customer with full data (address, etc.) */ private function get_or_create_customer_with_data($customer_data) { $query = ' mutation GetOrCreateCustomer($input: CustomerInput!) { getOrCreateCustomer(input: $input) { success message customer { id email firstName lastName phone billingAddress { street street2 city state zip country } shippingAddress { street street2 city state zip country } } } } '; // Prepare customer input with all available data $customer_input = array( 'email' => $customer_data['email'], 'firstName' => $customer_data['firstName'], 'lastName' => $customer_data['lastName'] ); // Add phone if provided if (!empty($customer_data['phone'])) { $customer_input['phone'] = $customer_data['phone']; } // Add billing address if provided if (!empty($customer_data['billingAddress'])) { $customer_input['billingAddress'] = $customer_data['billingAddress']; } // Add shipping address if provided if (!empty($customer_data['shippingAddress'])) { $customer_input['shippingAddress'] = $customer_data['shippingAddress']; } $variables = array('input' => $customer_input); $response = $this->make_graphql_request($this->booking_endpoint, $query, $variables); if ($response && $response['status_code'] == 200) { $data = $response['data']; if (isset($data['data']['getOrCreateCustomer']['success']) && $data['data']['getOrCreateCustomer']['success']) { return $data['data']['getOrCreateCustomer']['customer']; } } return false; } /** * Get or create anonymous session */ private function get_anonymous_session() { $session_key = 'uvitale_timewise_session_anonymous'; $stored_session = get_transient($session_key); if ($stored_session && $this->is_session_valid($stored_session)) { return $stored_session; } return $this->create_anonymous_session(); } /** * Create anonymous Timewise session */ public function create_anonymous_session() { $query = ' mutation CreateAnonymousSession { createAnonymousSession { authToken success message } } '; $response = $this->make_graphql_request($this->booking_endpoint, $query); if ($response && $response['status_code'] == 200) { $data = $response['data']; if (isset($data['data']['createAnonymousSession']['success']) && $data['data']['createAnonymousSession']['success']) { $auth_token = $data['data']['createAnonymousSession']['authToken']; $session_cookie = $this->extract_session_cookie($response); $session_data = array( 'auth_token' => $auth_token, 'session_cookie' => $session_cookie, 'is_anonymous' => true, 'created_at' => time(), 'user_id' => null ); $session_key = 'uvitale_timewise_session_anonymous'; set_transient($session_key, $session_data, HOUR_IN_SECONDS * 6); $this->log_session_event('Anonymous session created', $session_data); return $session_data; } } $this->log_session_event('Failed to create anonymous session', $response); return false; } /** * Get or create user session */ private function get_user_session($user_id = null) { if (!$user_id) { $user_id = get_current_user_id(); } if (!$user_id) { return $this->get_anonymous_session(); } $session_key = 'uvitale_timewise_session_user_' . $user_id; $stored_session = get_transient($session_key); if ($stored_session && $this->is_session_valid($stored_session)) { return $stored_session; } $user = get_user_by('ID', $user_id); return $this->create_user_session($user->user_email); } /** * Create user session in Timewise */ public function create_user_session($email = null) { if (!$email && is_user_logged_in()) { $user = wp_get_current_user(); $email = $user->user_email; } if (!$email) { return $this->create_anonymous_session(); } // First, get or create customer in Timewise $customer_data = $this->get_or_create_customer($email); if (!$customer_data) { $this->log_session_event('Failed to get/create customer', array('email' => $email)); return $this uVitale Peptides | Empowering the future of wellness. https://validator.w3.org/feed/docs/rss2.html GLP-1 Agonist (Triple) 10mg Home CJC-1295 + Ipamorelin 10mg Coverwell Checkout Coverwell Checkout Checkout Coverwell Checkout Coverwell Checkout Coverwell Checkout GLP-1 Agonist (Single) 10mg Coverwell Checkout Coverwell Checkout Coverwell Checkout Coverwell Checkout GLP-1 Agonist (Dual) 10mg Coverwell Checkout Coverwell Checkout Coverwell Checkout Tesamorelin 5mg Coverwell Checkout BPC-157 10mg Coverwell Checkout Timewise Login Payment Type PT-141 10mg MT2 (Melanotan II) 10mg Sermorelin 5mg Coverwell Checkout LOCALFREE NAD+ (buffered) 500mg CJC-1295 + DAC 5mg HILTON IAMHIX50 THANKYOUSHAREEN20 DSIP 10mg Epithalon (Epitalon) 10mg THANKYOUCAROL20 HIX20 Research Partner Program BPC-157 + TB-500 10mg Coverwell Checkout IGF-1 LR3 1mg About Content restricted RESEARCH20 AOD-9604 5mg Coverwell Checkout CJC-1295 5mg GHRP 2 5mg GHK-Cu 50mg