'', 'apiKey' => '', 'timeout' => 120, 'headers' => [ 'Content-Type' => 'application/json', 'Accept' => 'application/json' ] ]; $collectionPath = __DIR__ . '/Content Scaling Flow.postman_collection_Oliver(New).json'; $testRunner = null; $error = null; $campaigns = []; $selectedCampaign = null; $workflowStep = 1; $workflowResults = []; try { if (file_exists($collectionPath)) { $testRunner = new TestRunner($collectionPath, $config); } else { $error = "Postman collection file not found"; } } catch (Exception $e) { $error = "Error initializing test runner: " . $e->getMessage(); } // Handle ONLY explicit user actions if ($_POST && $testRunner) { if ($_POST['action'] === 'load_campaigns') { // Load campaigns from API $requests = $testRunner->getAvailableRequests(); foreach ($requests as $index => $request) { if (strpos($request['name'], 'Retrieve Localized Campaign Folders') !== false) { $result = $testRunner->runSingleTest($request, $index); if ($result['status'] === 'PASS') { // Filter to only show "3 - Production & execution" campaigns $filters = ['stage' => '3 - Production & execution']; $campaigns = CampaignFormatter::getActionableCampaigns($result['response']['body'], $filters); $message = "Successfully loaded " . count($campaigns) . " campaigns in '3 - Production & execution' stage"; } else { $error = "Failed to load campaigns: " . ($result['response']['error'] ?? 'Unknown error'); } break; } } } if ($_POST['action'] === 'select_campaign') { $selectedCampaignId = $_POST['selected_campaign_id'] ?? ''; if ($selectedCampaignId && !empty($_POST['campaigns_data'])) { $allCampaigns = json_decode($_POST['campaigns_data'], true); foreach ($allCampaigns as $campaign) { if ($campaign['asset_id'] === $selectedCampaignId) { $selectedCampaign = $campaign; $_SESSION['selected_campaign'] = $campaign; // Store in session $workflowStep = 2; break; } } } } if ($_POST['action'] === 'get_folders') { // Get selected campaign from session or previous step if (isset($_SESSION['selected_campaign'])) { $selectedCampaign = $_SESSION['selected_campaign']; $campaignId = $selectedCampaign['asset_id'] ?? ''; if ($campaignId) { $workflowResults['folders'] = getAssetFolders($testRunner, $campaignId); $workflowStep = 2; // Stay on step 2 } } else { $error = "No campaign selected. Please go back to Step 1."; } } if ($_POST['action'] === 'download_asset') { $assetId = $_POST['asset_id'] ?? ''; $filename = $_POST['filename'] ?? ''; if ($assetId && isset($_SESSION['selected_campaign'])) { $selectedCampaign = $_SESSION['selected_campaign']; // Create downloader instance $apiClient = new ApiClient(); $apiClient->setBaseUrl('https://ppr.dam.ferrero.com/otmmapi'); // Get OAuth2 token if ($testRunner) { $oauth2Status = $testRunner->getOAuth2Status(); if ($oauth2Status['enabled'] && ($oauth2Status['has_token'] ?? false)) { try { $token = $testRunner->refreshToken() ? 'refreshed' : 'existing'; $oauth2Handler = new ReflectionProperty($testRunner, 'oauth2Handler'); $oauth2Handler->setAccessible(true); $oauth2HandlerInstance = $oauth2Handler->getValue($testRunner); if ($oauth2HandlerInstance) { $apiClient->setHeader('Authorization', $oauth2HandlerInstance->getAuthHeader()); } } catch (Exception $e) { $error = "OAuth2 token error: " . $e->getMessage(); } } } if (!isset($error)) { // Test the direct content endpoint first - CORRECT endpoint with 's' $testRequest = [ 'method' => 'GET', 'url' => "/v6/assets/{$assetId}/contents" ]; $testResponse = $apiClient->executeRequest($testRequest); if ($testResponse['success'] && !empty($testResponse['body'])) { // Direct download worked! $safeFilename = preg_replace('/[^a-zA-Z0-9._-]/', '_', $filename ?: "asset_{$assetId}"); if (!pathinfo($safeFilename, PATHINFO_EXTENSION)) { $safeFilename .= '.jpg'; // Default extension } if (!is_dir('downloads/')) { mkdir('downloads/', 0755, true); } $fullPath = 'downloads/' . $safeFilename; $bytesWritten = file_put_contents($fullPath, $testResponse['body']); $workflowResults['download'] = [ 'success' => $bytesWritten !== false, 'filename' => $safeFilename, 'filepath' => $fullPath, 'size' => $bytesWritten ?: 0, 'asset_id' => $assetId, 'download_url' => "/v6/assets/{$assetId}/contents", 'method' => 'direct_content_endpoint' ]; } else { // Fall back to AssetDownloader $downloader = new AssetDownloader($apiClient); $result = $downloader->downloadAsset($assetId, $filename); $result['direct_test'] = [ 'attempted' => true, 'success' => false, 'http_code' => $testResponse['http_code'] ?? 0, 'error' => $testResponse['error'] ?? null, 'response_size' => strlen($testResponse['body'] ?? '') ]; $workflowResults['download'] = $result; } $workflowStep = 2; // Stay on step 2 } } } if ($_POST['action'] === 'download_folder') { $folderAssetIds = $_POST['folder_asset_ids'] ?? []; $folderName = $_POST['folder_name'] ?? 'folder_download'; if (!empty($folderAssetIds) && isset($_SESSION['selected_campaign'])) { $selectedCampaign = $_SESSION['selected_campaign']; // Setup API client similar to single download $apiClient = new ApiClient(); $apiClient->setBaseUrl('https://ppr.dam.ferrero.com/otmmapi'); if ($testRunner) { $oauth2Status = $testRunner->getOAuth2Status(); if ($oauth2Status['enabled'] && ($oauth2Status['has_token'] ?? false)) { try { $oauth2Handler = new ReflectionProperty($testRunner, 'oauth2Handler'); $oauth2Handler->setAccessible(true); $oauth2HandlerInstance = $oauth2Handler->getValue($testRunner); if ($oauth2HandlerInstance) { $apiClient->setHeader('Authorization', $oauth2HandlerInstance->getAuthHeader()); } } catch (Exception $e) { $error = "OAuth2 token error: " . $e->getMessage(); } } } if (!isset($error)) { $downloader = new AssetDownloader($apiClient); $result = $downloader->downloadMultipleAssets($folderAssetIds, $folderName); $workflowResults['bulk_download'] = $result; $workflowStep = 2; // Stay on step 2 } } } if ($_POST['action'] === 'explore_folder') { $folderId = $_POST['folder_id'] ?? ''; $folderName = $_POST['folder_name'] ?? 'Unnamed'; if ($folderId && isset($_SESSION['selected_campaign'])) { $selectedCampaign = $_SESSION['selected_campaign']; $workflowResults['folder_contents'] = getAssetsFromFolder($testRunner, $folderId); $workflowResults['explored_folder_name'] = $folderName; $workflowStep = 2; // Stay on step 2 but show folder contents } } if ($_POST['action'] === 'explore_all_folders') { $folderIds = $_POST['folder_ids'] ?? []; if (!empty($folderIds) && isset($_SESSION['selected_campaign'])) { $selectedCampaign = $_SESSION['selected_campaign']; $workflowResults['all_folder_contents'] = []; foreach ($folderIds as $index => $folderId) { $result = getAssetsFromFolder($testRunner, $folderId); $workflowResults['all_folder_contents'][] = [ 'folder_id' => $folderId, 'folder_name' => "Folder " . ($index + 1), 'result' => $result ]; } $workflowStep = 2; } } } function getAssetFolders($testRunner, $campaignId) { $requests = $testRunner->getAvailableRequests(); foreach ($requests as $index => $request) { $name = strtolower($request['name']); if (strpos($name, 'master asset folder') !== false && strpos($name, 'final asset') !== false) { $modifiedRequest = $request; $url = is_array($request['request']['url']) ? $request['request']['url']['raw'] : $request['request']['url']; $url = str_replace('6930c59abea5bd4259b67f7647f65cd01d36278d', $campaignId, $url); $baseUrl = 'https://ppr.dam.ferrero.com/otmmapi'; $url = str_replace('{{baseUrl}}', $baseUrl, $url); if (is_array($modifiedRequest['request']['url'])) { $modifiedRequest['request']['url']['raw'] = $url; } else { $modifiedRequest['request']['url'] = $url; } return $testRunner->runSingleTest($modifiedRequest, $index); } } return ['status' => 'ERROR', 'message' => 'Asset folders request not found']; } function getAssetsFromFolder($testRunner, $folderId) { $requests = $testRunner->getAvailableRequests(); foreach ($requests as $index => $request) { $name = strtolower($request['name']); if (strpos($name, 'all assets from') !== false) { $modifiedRequest = $request; $url = is_array($request['request']['url']) ? $request['request']['url']['raw'] : $request['request']['url']; $url = preg_replace('/folders\/[^\/]+\//', "folders/{$folderId}/", $url); $baseUrl = 'https://ppr.dam.ferrero.com/otmmapi'; $url = str_replace('{{baseUrl}}', $baseUrl, $url); if (is_array($modifiedRequest['request']['url'])) { $modifiedRequest['request']['url']['raw'] = $url; } else { $modifiedRequest['request']['url'] = $url; } return $testRunner->runSingleTest($modifiedRequest, $index); } } return ['status' => 'ERROR', 'message' => 'Assets request not found']; } // Check if we have a selected campaign from session if (isset($_SESSION['selected_campaign']) && !$selectedCampaign) { $selectedCampaign = $_SESSION['selected_campaign']; $workflowStep = 2; } $oauth2Status = $testRunner ? $testRunner->getOAuth2Status() : null; ?>
Click the button below to load campaigns from the API using your Postman collection settings.
✅ Loaded = count($campaigns) ?> campaigns
Campaign ID: = htmlspecialchars($campaign['campaign_id'] ?? 'N/A') ?>
Brand: = htmlspecialchars($campaign['brand'] ?? 'N/A') ?>
Market: = htmlspecialchars($campaign['market'] ?? 'N/A') ?>
Stage: = htmlspecialchars($campaign['stage'] ?? 'N/A') ?>
Asset ID: = htmlspecialchars($campaign['asset_id']) ?>
= htmlspecialchars($selectedCampaign['asset_id']) ?>
Status: = $result['status'] ?>
HTTP Code: = $result['response']['http_code'] ?? 'N/A' ?>
URL: = htmlspecialchars($result['response']['url'] ?? 'N/A') ?>
Asset ID: = htmlspecialchars($folder['asset_id']) ?>
Type: = htmlspecialchars($folder['data_type'] ?? 'CONTAINER') ?>
Created: = htmlspecialchars($folder['date_imported'] ?? 'N/A') ?>
This will show contents of both folders side by side for comparison.
Error: = htmlspecialchars($result['response']['error'] ?? 'Unknown error') ?>
Status: = $contentsResult['status'] ?>
HTTP Code: = $contentsResult['response']['http_code'] ?? 'N/A' ?>
📁 Subfolders: = $folderCount ?>
📄 Files: = $fileCount ?>
File Types:
= htmlspecialchars($asset['asset_id'] ?? 'N/A') ?>This folder is empty.
Error: = htmlspecialchars($contentsResult['response']['error'] ?? 'Unknown error') ?>
ID: = htmlspecialchars($folderId) ?>
Status: = $result['status'] ?>
Error exploring folder: = htmlspecialchars($result['response']['error'] ?? 'Unknown error') ?>
✅ Download Successful!
File: = htmlspecialchars($downloadResult['filename']) ?>
Path: = htmlspecialchars($downloadResult['filepath']) ?>
Size: = number_format($downloadResult['size']) ?> bytes
Asset ID: = htmlspecialchars($downloadResult['asset_id']) ?>
❌ Download Failed
Error: = htmlspecialchars($downloadResult['error']) ?>
HTTP Code: = $downloadResult['http_code'] ?>
Download Folder: = htmlspecialchars($bulkResult['download_folder']) ?>