wp_generate_uuid4(), 'start' => $start, 'end' => $start, 'multiple_events' => false, ]; $new_visitor = [ 'fingerprint' => $params['request']['fingerprint'], 'uuid' => wp_generate_uuid4(), 'ip' => $params['request']['ip'], 'user_agent' => $params['request']['user_agent'], 'device' => $params['request']['device'], 'browser_name' => $params['request']['browser_name'], 'browser_version' => $params['request']['browser_version'], 'domain' => $domain, 'lang' => $params['request']['lang'], 'timezone' => $params['request']['timezone'], 'visitor_flows' => [$new_visitor_flow], ]; $new_visitor_event = [ 'uuid' => wp_generate_uuid4(), 'visitor_uuid' => $new_visitor['uuid'], 'flow_uuid' => $new_visitor_flow['uuid'], 'url' => $params['request']['url'], 'referer' => $params['request']['referer'], 'start' => $start, 'end' => $start, 'event_name' => $params['request']['event_name'] ?? 'visit', 'event_type' => $params['request']['event_type'] ?? 'action', 'attributes' => isset($params['request']['attributes']) ? $params['request']['attributes'] : '', ]; parent::aesirx_analytics_create_visitor($new_visitor); parent::aesirx_analytics_create_visitor_event($new_visitor_event); return [ 'visitor_uuid' => $new_visitor['uuid'], 'event_uuid' => $new_visitor_event['uuid'], 'flow_uuid' => $new_visitor_event['flow_uuid'], ]; } else { $url = wp_parse_url($params['request']['url']); if (!$url || !isset($url['host'])) { return new WP_Error('validation_error', esc_html__('Wrong URL format, domain not found', 'aesirx-consent')); } if ($url['host'] !== $visitor['domain']) { return new WP_Error('validation_error', esc_html__('The domain sent in the new URL does not match the domain stored in the visitor document', 'aesirx-consent')); } global $wpdb; if (!$visitor['timezone']) { $updated_data['timezone'] = isset($params['request']['timezone']) ? $params['request']['timezone'] : ''; } if (!$visitor['lang']) { $updated_data['lang'] = isset($params['request']['lang']) ? $params['request']['lang'] : ''; } if (!empty($updated_data)) { $wpdb->update( // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching $wpdb->prefix . 'analytics_visitors', $updated_data, ['uuid' => $visitor['uuid']], ); } $create_flow = true; $visitor_flow = [ 'uuid' => wp_generate_uuid4(), 'start' => $start, 'end' => $start, 'multiple_events' => false, ]; $is_already_multiple = false; if ($params['request']['referer']) { $referer = wp_parse_url($params['request']['referer']); if ($referer && $referer['host'] === $url['host'] && $visitor['visitor_flows']) { $list = $visitor['visitor_flows']; if (!empty($list)) { $first = $list[0]; $max = $first['start']; $visitor_flow['uuid'] = $first['uuid']; $is_already_multiple = $first['multiple_events']; $create_flow = false; foreach ($list as $val) { if ($max < $val['start']) { $max = $val['start']; $visitor_flow['uuid'] = $val['uuid']; } } } } } if ($create_flow) { parent::aesirx_analytics_create_visitor_flow($visitor['uuid'], $visitor_flow); } $visitor_event = [ 'uuid' => wp_generate_uuid4(), 'visitor_uuid' => $visitor['uuid'], 'flow_uuid' => $visitor_flow['uuid'], 'url' => $params['request']['url'], 'referer' => $params['request']['referer'], 'start' => $start, 'end' => $start, 'event_name' => $params['request']['event_name'] ?? 'visit', 'event_type' => $params['request']['event_type'] ?? 'action', 'attributes' => $params['request']['attributes'] ?? '', ]; parent::aesirx_analytics_create_visitor_event($visitor_event); if (!$create_flow && !$is_already_multiple) { parent::aesirx_analytics_mark_visitor_flow_as_multiple($visitor_flow['uuid']); } return [ 'visitor_uuid' => $visitor['uuid'], 'event_uuid' => $visitor_event['uuid'], 'flow_uuid' => $visitor_event['flow_uuid'], ]; } } }