test-api-detailed.jsā¢7.93 kB
#!/usr/bin/env node
/**
* Detailed API Test - Mimicking exact browser behavior
*/
import { readFileSync } from 'fs';
import { resolve, dirname } from 'path';
import { fileURLToPath } from 'url';
const currentDir = dirname(fileURLToPath(import.meta.url));
const tokenPath = resolve(currentDir, 'correct-jwt-new.txt');
const jwtToken = readFileSync(tokenPath, 'utf8').trim();
async function detailedAPITest() {
console.log('š¬ Detailed API Test - Mimicking Browser Behavior\n');
const baseURL = "https://api.digitalpages.com.br";
const projectUID = "36c92686-c494-ec11-a22a-dc984041c95d";
// Test 1: Check if we need specific content type
console.log('1ļøā£ Testing with exact browser content type:');
const compositionUID = generateUID();
const compositionData = {
version: "1.1",
metadata: {
title: "Test Composition",
description: "API Test",
thumb: null,
tags: []
},
interface: {
content_language: "pt_br",
index_option: "buttons",
font_family: "Lato",
show_summary: "disabled",
finish_btn: "disabled"
},
structure: [{
id: generateUID(),
type: "text-1",
content: "<p>Test content</p>",
background_color: "#FFFFFF",
padding_top: 0,
padding_bottom: 0
}]
};
const compositionJSON = JSON.stringify(compositionData);
// Try with browser's exact MIME type
const formData = new FormData();
const blob = new Blob([compositionJSON], { type: 'digitalpages/composer' });
formData.append('file', blob, 'composition.rdpcomposer');
const url = `${baseURL}/storage/v1.0/content?uid=${compositionUID}&manual_project_uid=${projectUID}`;
try {
console.log(' - URL:', url);
console.log(' - Method: PUT');
console.log(' - Content-Type: multipart/form-data (auto-set)');
console.log(' - File type: digitalpages/composer');
console.log(' - File name: composition.rdpcomposer');
const response = await fetch(url, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${jwtToken}`,
'Accept': '*/*',
'Origin': 'https://composer.euconquisto.com',
'Referer': 'https://composer.euconquisto.com/',
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36'
},
body: formData
});
console.log(`\n - Status: ${response.status} ${response.statusText}`);
const responseText = await response.text();
console.log(` - Response: ${responseText}`);
} catch (error) {
console.log(` - Error: ${error.message}`);
}
// Test 2: Try with different UID format
console.log('\n2ļøā£ Testing with different UID format:');
const simpleUID = Date.now().toString();
const simpleURL = `${baseURL}/storage/v1.0/content?uid=${simpleUID}&manual_project_uid=${projectUID}`;
try {
console.log(' - Using timestamp as UID:', simpleUID);
console.log(' - URL:', simpleURL);
const simpleFormData = new FormData();
const simpleBlob = new Blob([compositionJSON], { type: 'digitalpages/composer' });
simpleFormData.append('file', simpleBlob, 'composition.rdpcomposer');
const simpleResponse = await fetch(simpleURL, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${jwtToken}`,
'Accept': '*/*'
},
body: simpleFormData
});
console.log(` - Status: ${simpleResponse.status} ${simpleResponse.statusText}`);
const simpleResponseText = await simpleResponse.text();
console.log(` - Response: ${simpleResponseText}`);
} catch (error) {
console.log(` - Error: ${error.message}`);
}
// Test 3: Try without manual_project_uid
console.log('\n3ļøā£ Testing without manual_project_uid:');
const noProjectURL = `${baseURL}/storage/v1.0/content?uid=${compositionUID}`;
try {
console.log(' - URL:', noProjectURL);
const noProjectFormData = new FormData();
const noProjectBlob = new Blob([compositionJSON], { type: 'digitalpages/composer' });
noProjectFormData.append('file', noProjectBlob, 'composition.rdpcomposer');
const noProjectResponse = await fetch(noProjectURL, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${jwtToken}`
},
body: noProjectFormData
});
console.log(` - Status: ${noProjectResponse.status} ${noProjectResponse.statusText}`);
const noProjectResponseText = await noProjectResponse.text();
console.log(` - Response: ${noProjectResponseText}`);
} catch (error) {
console.log(` - Error: ${error.message}`);
}
// Test 4: Try with project_uid instead of manual_project_uid
console.log('\n4ļøā£ Testing with project_uid parameter:');
const projectParamURL = `${baseURL}/storage/v1.0/content?uid=${compositionUID}&project_uid=${projectUID}`;
try {
console.log(' - URL:', projectParamURL);
const projectFormData = new FormData();
const projectBlob = new Blob([compositionJSON], { type: 'digitalpages/composer' });
projectFormData.append('file', projectBlob, 'composition.rdpcomposer');
const projectResponse = await fetch(projectParamURL, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${jwtToken}`
},
body: projectFormData
});
console.log(` - Status: ${projectResponse.status} ${projectResponse.statusText}`);
const projectResponseText = await projectResponse.text();
console.log(` - Response: ${projectResponseText}`);
} catch (error) {
console.log(` - Error: ${error.message}`);
}
// Test 5: Try minimal JSON structure
console.log('\n5ļøā£ Testing with minimal JSON structure:');
const minimalData = {
structure: [{
type: "text-1",
content: "Test"
}]
};
try {
const minimalFormData = new FormData();
const minimalBlob = new Blob([JSON.stringify(minimalData)], { type: 'digitalpages/composer' });
minimalFormData.append('file', minimalBlob, 'composition.rdpcomposer');
const minimalResponse = await fetch(url, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${jwtToken}`
},
body: minimalFormData
});
console.log(` - Status: ${minimalResponse.status} ${minimalResponse.statusText}`);
const minimalResponseText = await minimalResponse.text();
console.log(` - Response: ${minimalResponseText}`);
} catch (error) {
console.log(` - Error: ${error.message}`);
}
console.log('\nš Summary:');
console.log(' - All variations return 500 Internal Server Error');
console.log(' - The API might be expecting additional headers or parameters');
console.log(' - Or the server might have an issue with our requests');
console.log(' - Need to capture actual browser traffic to see exact format');
}
function generateUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0;
const v = c == 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
detailedAPITest().catch(console.error);