false, 'error' => 'Method not allowed']); exit; } $input = json_decode(file_get_contents('php://input'), true) ?: $_POST; $video_id = $input['video_id'] ?? null; $event_type = $input['event_type'] ?? 'view'; if (!$video_id) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'Video ID required']); exit; } $data = [ 'usr_id' => $current_user_id, 'watch_duration' => $input['watch_duration'] ?? 0, 'completion_percentage' => $input['completion_percentage'] ?? 0, 'country_code' => $input['country_code'] ?? null ]; $result = $analytics->trackEvent($video_id, $event_type, $data); // Track retention if provided if (isset($input['minute'])) { $analytics->trackRetention($video_id, $input['minute']); } // Track traffic source if provided if (isset($input['source_type'])) { // Get video owner global $class_database; $sql = "SELECT usr_id FROM db_videofiles WHERE video_id = ?"; $res = $class_database->execute($sql, [$video_id]); if ($res && $row = $class_database->fetch($res)) { $analytics->trackTrafficSource( $video_id, $row['usr_id'], $input['source_type'], $input['source_detail'] ?? '' ); } } echo json_encode(['success' => (bool)$result]); exit; } // All other actions require authentication if (!$current_user_id) { http_response_code(401); echo json_encode(['success' => false, 'error' => 'Authentication required']); exit; } // Handle analytics queries switch ($action) { case 'overview': $data = $analytics->getChannelOverview($current_user_id, $days); echo json_encode(['success' => true, 'data' => $data]); break; case 'timeseries': $metric = $_GET['metric'] ?? 'views'; $data = $analytics->getChannelTimeSeries($current_user_id, $days, $metric); echo json_encode(['success' => true, 'data' => $data]); break; case 'top_videos': $metric = $_GET['metric'] ?? 'views'; $limit = intval($_GET['limit'] ?? 10); $data = $analytics->getTopVideos($current_user_id, $days, $metric, $limit); echo json_encode(['success' => true, 'data' => $data]); break; case 'demographics': $data = $analytics->getDemographics($current_user_id, $days); echo json_encode(['success' => true, 'data' => $data]); break; case 'traffic_sources': $data = $analytics->getTrafficSources($current_user_id, $days); echo json_encode(['success' => true, 'data' => $data]); break; case 'retention': $video_id = $_GET['video_id'] ?? null; if (!$video_id) { http_response_code(400); echo json_encode(['success' => false, 'error' => 'Video ID required']); exit; } // Verify ownership global $class_database; $sql = "SELECT usr_id FROM db_videofiles WHERE video_id = ?"; $result = $class_database->execute($sql, [$video_id]); if (!$result || $class_database->rowCount($result) == 0) { http_response_code(404); echo json_encode(['success' => false, 'error' => 'Video not found']); exit; } $row = $class_database->fetch($result); if ($row['usr_id'] != $current_user_id) { http_response_code(403); echo json_encode(['success' => false, 'error' => 'Permission denied']); exit; } $data = $analytics->getAudienceRetention($video_id, $days); echo json_encode(['success' => true, 'data' => $data]); break; default: http_response_code(400); echo json_encode(['success' => false, 'error' => 'Invalid action']); }