Complete PHP-based workflow application for Ferrero DAM system: - OAuth2 authentication with automatic token management - Campaign discovery and filtering - Folder structure navigation - Asset download (individual and bulk) - Metadata extraction and display - Clean step-by-step web interface Status: Fully functional and production-ready 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
251 lines
No EOL
10 KiB
PHP
251 lines
No EOL
10 KiB
PHP
<?php
|
|
|
|
require_once 'TestRunner.php';
|
|
|
|
class WorkflowManager
|
|
{
|
|
private $testRunner;
|
|
private $campaignData = [];
|
|
|
|
public function __construct($testRunner)
|
|
{
|
|
$this->testRunner = $testRunner;
|
|
}
|
|
|
|
public function getCampaignFolders()
|
|
{
|
|
$requests = $this->testRunner->getAvailableRequests();
|
|
|
|
// Find the "Retrieve Localized Campaign Folders" request
|
|
foreach ($requests as $index => $request) {
|
|
if (strpos(strtolower($request['name']), 'localized campaign') !== false) {
|
|
$result = $this->testRunner->runSingleTest($request, $index);
|
|
|
|
if ($result['status'] === 'PASS') {
|
|
$responseData = json_decode($result['response']['body'], true);
|
|
|
|
// Handle the actual API response structure
|
|
if (isset($responseData['search_result_resource']['search_result']['asset_list'])) {
|
|
$this->campaignData = ['items' => $responseData['search_result_resource']['search_result']['asset_list']];
|
|
} else {
|
|
$this->campaignData = $responseData;
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public function getActionableCampaigns()
|
|
{
|
|
if (empty($this->campaignData) || !isset($this->campaignData['items'])) {
|
|
return [];
|
|
}
|
|
|
|
$actionable = [];
|
|
|
|
foreach ($this->campaignData['items'] as $campaign) {
|
|
if ($this->shouldProcessCampaign($campaign)) {
|
|
$actionable[] = [
|
|
'id' => $campaign['asset_id'] ?? $campaign['id'] ?? 'Unknown',
|
|
'name' => $this->getCampaignMetadata($campaign, 'FERRERO.FIELD.CAMPAIGN_NAME') ?? 'Unnamed',
|
|
'campaign_id' => $this->getCampaignMetadata($campaign, 'FERRERO.FIELD.CAMPAIGN ID'),
|
|
'campaign_name' => $this->getCampaignMetadata($campaign, 'FERRERO.FIELD.CAMPAIGN NAME'),
|
|
'campaign_type' => $this->getCampaignMetadata($campaign, 'FERRERO.FIELD.CAMPAIGN TYPE'),
|
|
'folder_data' => $campaign
|
|
];
|
|
}
|
|
}
|
|
|
|
return $actionable;
|
|
}
|
|
|
|
private function shouldProcessCampaign($campaign)
|
|
{
|
|
// Define your criteria for campaigns that need processing
|
|
$campaignType = $this->getCampaignMetadata($campaign, 'FERRERO.FIELD.CAMPAIGN TYPE');
|
|
|
|
// Example criteria - adjust based on your business rules
|
|
$actionableTypes = ['ACTIVE', 'PENDING', 'IN_PROGRESS', 'READY_FOR_SCALING'];
|
|
|
|
if (in_array($campaignType, $actionableTypes)) {
|
|
return true;
|
|
}
|
|
|
|
// Additional criteria can be added here
|
|
// - Modified in last X days
|
|
// - Missing certain metadata
|
|
// - Specific naming patterns
|
|
|
|
return false;
|
|
}
|
|
|
|
private function getCampaignMetadata($campaign, $fieldName)
|
|
{
|
|
// Use the same metadata extraction logic as ResponseFormatter
|
|
return $this->getMetadataValue($campaign, $fieldName);
|
|
}
|
|
|
|
private function getMetadataValue($asset, $fieldId)
|
|
{
|
|
if (!isset($asset['metadata']['metadata_element_list'])) {
|
|
return null;
|
|
}
|
|
|
|
foreach ($asset['metadata']['metadata_element_list'] as $category) {
|
|
if (!isset($category['metadata_element_list'])) {
|
|
continue;
|
|
}
|
|
|
|
foreach ($category['metadata_element_list'] as $element) {
|
|
if ($element['id'] === $fieldId && isset($element['value']['value']['value'])) {
|
|
return $element['value']['value']['value'];
|
|
}
|
|
|
|
// Handle tabular fields (like brand, market)
|
|
if (isset($element['metadata_element_list'])) {
|
|
foreach ($element['metadata_element_list'] as $tableField) {
|
|
if ($tableField['id'] === $fieldId && isset($tableField['value']['value']['value'])) {
|
|
return $tableField['value']['value']['value'];
|
|
}
|
|
|
|
// Handle domain values
|
|
if ($tableField['id'] === $fieldId && isset($tableField['value']['value']['field_value']['value'])) {
|
|
return $tableField['value']['value']['display_value'] ?? $tableField['value']['value']['field_value']['value'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
public function processCampaign($campaignId)
|
|
{
|
|
$workflow = [];
|
|
|
|
// Step 1: Get Master Asset and Final Asset folders
|
|
$folderResult = $this->getMasterAndFinalAssetFolders($campaignId);
|
|
$workflow['folders'] = $folderResult;
|
|
|
|
if ($folderResult['status'] === 'PASS') {
|
|
$folders = json_decode($folderResult['response']['body'], true);
|
|
|
|
foreach ($folders['items'] ?? [] as $folder) {
|
|
$folderName = strtolower($folder['name'] ?? '');
|
|
|
|
// Step 2: Process Master Asset folder
|
|
if (strpos($folderName, 'master') !== false) {
|
|
$assetsResult = $this->getAssetsFromFolder($folder['id']);
|
|
$workflow['master_assets'] = $assetsResult;
|
|
}
|
|
|
|
// Step 3: Process Final Asset folder
|
|
if (strpos($folderName, 'final') !== false) {
|
|
$assetsResult = $this->getAssetsFromFolder($folder['id']);
|
|
$workflow['final_assets'] = $assetsResult;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $workflow;
|
|
}
|
|
|
|
private function getMasterAndFinalAssetFolders($campaignId)
|
|
{
|
|
$requests = $this->testRunner->getAvailableRequests();
|
|
|
|
foreach ($requests as $index => $request) {
|
|
$name = strtolower($request['name']);
|
|
if (strpos($name, 'master asset folder') !== false && strpos($name, 'final asset') !== false) {
|
|
// Modify request to use specific campaign ID
|
|
$modifiedRequest = $request;
|
|
if (isset($modifiedRequest['request']['url'])) {
|
|
if (is_array($modifiedRequest['request']['url'])) {
|
|
$url = $modifiedRequest['request']['url']['raw'];
|
|
} else {
|
|
$url = $modifiedRequest['request']['url'];
|
|
}
|
|
|
|
// Replace placeholder ID with actual campaign ID
|
|
$url = str_replace(':id', $campaignId, $url);
|
|
$url = str_replace('6930c59abea5bd4259b67f7647f65cd01d36278d', $campaignId, $url);
|
|
|
|
if (is_array($modifiedRequest['request']['url'])) {
|
|
$modifiedRequest['request']['url']['raw'] = $url;
|
|
} else {
|
|
$modifiedRequest['request']['url'] = $url;
|
|
}
|
|
}
|
|
|
|
return $this->testRunner->runSingleTest($modifiedRequest, $index);
|
|
}
|
|
}
|
|
|
|
return ['status' => 'ERROR', 'message' => 'Master/Final Asset folder request not found'];
|
|
}
|
|
|
|
private function getAssetsFromFolder($folderId)
|
|
{
|
|
$requests = $this->testRunner->getAvailableRequests();
|
|
|
|
foreach ($requests as $index => $request) {
|
|
$name = strtolower($request['name']);
|
|
if (strpos($name, 'all assets from') !== false) {
|
|
// Modify request to use specific folder ID
|
|
$modifiedRequest = $request;
|
|
if (isset($modifiedRequest['request']['url'])) {
|
|
if (is_array($modifiedRequest['request']['url'])) {
|
|
$url = $modifiedRequest['request']['url']['raw'];
|
|
} else {
|
|
$url = $modifiedRequest['request']['url'];
|
|
}
|
|
|
|
// Replace placeholder ID with actual folder ID
|
|
$url = str_replace(':id', $folderId, $url);
|
|
$url = preg_replace('/folders\/[^\/]+\//', "folders/{$folderId}/", $url);
|
|
|
|
if (is_array($modifiedRequest['request']['url'])) {
|
|
$modifiedRequest['request']['url']['raw'] = $url;
|
|
} else {
|
|
$modifiedRequest['request']['url'] = $url;
|
|
}
|
|
}
|
|
|
|
return $this->testRunner->runSingleTest($modifiedRequest, $index);
|
|
}
|
|
}
|
|
|
|
return ['status' => 'ERROR', 'message' => 'Assets request not found'];
|
|
}
|
|
|
|
public function generateWorkflowReport($campaigns)
|
|
{
|
|
$report = "<div class='workflow-report'>";
|
|
$report .= "<h2>Content Scaling Workflow Report</h2>";
|
|
$report .= "<p>Generated: " . date('Y-m-d H:i:s') . "</p>";
|
|
|
|
if (empty($campaigns)) {
|
|
$report .= "<p>No campaigns require action at this time.</p>";
|
|
} else {
|
|
$report .= "<p><strong>" . count($campaigns) . " campaigns</strong> identified for content scaling:</p>";
|
|
|
|
foreach ($campaigns as $index => $campaign) {
|
|
$report .= "<div class='campaign-summary' style='border: 1px solid #ddd; margin: 10px 0; padding: 15px; border-radius: 4px;'>";
|
|
$report .= "<h4>" . ($index + 1) . ". " . htmlspecialchars($campaign['campaign_name'] ?? $campaign['name']) . "</h4>";
|
|
$report .= "<p><strong>Campaign ID:</strong> " . htmlspecialchars($campaign['campaign_id'] ?? 'N/A') . "</p>";
|
|
$report .= "<p><strong>Type:</strong> " . htmlspecialchars($campaign['campaign_type'] ?? 'N/A') . "</p>";
|
|
$report .= "<p><strong>Folder ID:</strong> " . htmlspecialchars($campaign['id']) . "</p>";
|
|
$report .= "</div>";
|
|
}
|
|
}
|
|
|
|
$report .= "</div>";
|
|
return $report;
|
|
}
|
|
} |