ferrero-naming-tool/public/api.php
DJP 82eff7b76a Initial commit: Ferrero Communication Assets Naming Convention Tool
- PHP-based naming convention tool for Ferrero communication assets
- Filename builder with validation
- Filename decoder with component breakdown
- Complete help documentation
- Ferrero brand styling with Montserrat font
- OMG Job Number field (numbers only, max 10 chars)
- 105 brands, 29 countries, 39 asset types from Excel
- Responsive landscape layout
- Data management via JSON (parsed from Excel)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-14 16:05:16 -04:00

266 lines
8.9 KiB
PHP

<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, DELETE');
header('Access-Control-Allow-Headers: Content-Type');
// Load data from JSON file
$dataFile = __DIR__ . '/../backend/data.json';
function loadData() {
global $dataFile;
if (!file_exists($dataFile)) {
return ['error' => 'Data file not found'];
}
$json = file_get_contents($dataFile);
return json_decode($json, true);
}
function saveData($data) {
global $dataFile;
file_put_contents($dataFile, json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));
}
// Get action from URL
$action = isset($_GET['action']) ? $_GET['action'] : '';
$method = $_SERVER['REQUEST_METHOD'];
switch ($action) {
case 'data':
echo json_encode(loadData());
break;
case 'build':
if ($method === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
$omgJobNumber = $input['omg_job_number'] ?? '';
$brandCode = strtoupper($input['brand_code'] ?? '');
$countryCode = strtoupper($input['country_code'] ?? '');
$subjectTitle = strtoupper($input['subject_title'] ?? '');
$assetType = strtoupper($input['asset_type'] ?? '');
$spotVersion = strtoupper($input['spot_version'] ?? '');
$seconds = $input['seconds'] ?? '';
$aspectRatio = $input['aspect_ratio'] ?? '';
$hasMaster = $input['has_master'] ?? false;
// Validation
$errors = [];
if (empty($omgJobNumber) || !ctype_digit($omgJobNumber) || strlen($omgJobNumber) > 10) {
$errors[] = 'OMG Job Number is required, must be numbers only, and max 10 digits';
}
if (empty($brandCode) || strlen($brandCode) < 2 || strlen($brandCode) > 5) {
$errors[] = 'Brand code must be 2-5 characters';
}
if (empty($countryCode) || strlen($countryCode) != 2) {
$errors[] = 'Country code must be exactly 2 characters';
}
if (empty($subjectTitle) || strlen($subjectTitle) > 15) {
$errors[] = 'Subject title is required and must be max 15 characters';
}
if (empty($assetType) || strlen($assetType) != 3) {
$errors[] = 'Asset type must be exactly 3 characters';
}
if (empty($seconds)) {
$errors[] = 'Duration in seconds is required';
}
if (empty($aspectRatio)) {
$errors[] = 'Aspect ratio is required';
}
if (!empty($errors)) {
echo json_encode(['error' => implode(', ', $errors)]);
exit;
}
// Build filename - start with OMG Job Number
$parts = [$omgJobNumber, $brandCode, $countryCode, $subjectTitle, $assetType];
// Add spot version and MST if applicable
if ($hasMaster && !empty($spotVersion)) {
$parts[] = $spotVersion . '_MST';
} elseif (!empty($spotVersion)) {
$parts[] = $spotVersion;
} elseif ($hasMaster) {
$parts[] = 'MST';
}
// Add duration
$parts[] = $seconds . 'S';
// Add aspect ratio
$parts[] = $aspectRatio;
$filename = implode('_', $parts);
echo json_encode(['filename' => $filename]);
}
break;
case 'decode':
if ($method === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
$filename = $input['filename'] ?? '';
if (empty($filename)) {
echo json_encode(['error' => 'Filename is required']);
exit;
}
// Remove file extension if present
$filename = preg_replace('/\.[^.]+$/', '', $filename);
// Split by underscore
$parts = explode('_', $filename);
if (count($parts) < 7) {
echo json_encode(['error' => 'Invalid filename format. Expected at least 7 parts separated by underscores']);
exit;
}
// Parse components (with OMG Job Number at start)
$result = [
'omg_job_number' => $parts[0],
'brand_code' => $parts[1],
'country_code' => $parts[2],
'subject_title' => $parts[3],
'asset_type' => $parts[4],
'spot_version' => '',
'has_master' => false,
'seconds' => '',
'aspect_ratio' => ''
];
// Handle optional spot version and MST
$currentIndex = 5;
while ($currentIndex < count($parts)) {
$part = $parts[$currentIndex];
// Check if it's the duration (ends with S and has numbers)
if (preg_match('/^\d+S$/', $part)) {
$result['seconds'] = rtrim($part, 'S');
$currentIndex++;
break;
}
// Check if it's MST
elseif ($part === 'MST') {
$result['has_master'] = true;
$currentIndex++;
}
// Otherwise it's a spot version
else {
$result['spot_version'] = $part;
$currentIndex++;
}
}
// Last part should be aspect ratio
if ($currentIndex < count($parts)) {
$result['aspect_ratio'] = $parts[$currentIndex];
}
// Load data to get full names
$data = loadData();
$result['brand_name'] = $data['brands'][$result['brand_code']] ?? 'Unknown Brand';
$result['country_name'] = $data['countries'][$result['country_code']] ?? 'Unknown Country';
$result['asset_type_name'] = $data['asset_types'][$result['asset_type']] ?? 'Unknown Asset Type';
echo json_encode($result);
}
break;
case 'brands':
if ($method === 'GET') {
$data = loadData();
echo json_encode($data['brands']);
} elseif ($method === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
$code = strtoupper($input['code'] ?? '');
$name = $input['name'] ?? '';
if (empty($code) || empty($name)) {
echo json_encode(['error' => 'Code and name are required']);
exit;
}
if (strlen($code) < 2 || strlen($code) > 5) {
echo json_encode(['error' => 'Brand code must be 2-5 characters']);
exit;
}
$data = loadData();
$data['brands'][$code] = $name;
saveData($data);
echo json_encode(['message' => 'Brand added successfully', 'code' => $code, 'name' => $name]);
}
break;
case 'countries':
if ($method === 'GET') {
$data = loadData();
echo json_encode($data['countries']);
} elseif ($method === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
$code = strtoupper($input['code'] ?? '');
$name = $input['name'] ?? '';
if (empty($code) || empty($name)) {
echo json_encode(['error' => 'Code and name are required']);
exit;
}
if (strlen($code) != 2) {
echo json_encode(['error' => 'Country code must be exactly 2 characters']);
exit;
}
$data = loadData();
$data['countries'][$code] = $name;
saveData($data);
echo json_encode(['message' => 'Country added successfully', 'code' => $code, 'name' => $name]);
}
break;
case 'asset-types':
if ($method === 'GET') {
$data = loadData();
echo json_encode($data['asset_types']);
} elseif ($method === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
$code = strtoupper($input['code'] ?? '');
$name = $input['name'] ?? '';
if (empty($code) || empty($name)) {
echo json_encode(['error' => 'Code and name are required']);
exit;
}
if (strlen($code) != 3) {
echo json_encode(['error' => 'Asset type code must be exactly 3 characters']);
exit;
}
$data = loadData();
$data['asset_types'][$code] = $name;
saveData($data);
echo json_encode(['message' => 'Asset type added successfully', 'code' => $code, 'name' => $name]);
}
break;
default:
echo json_encode(['error' => 'Invalid action']);
break;
}
?>