test-api-enhanced.jsā¢8.97 kB
#!/usr/bin/env node
/**
* Enhanced API Test - Using insights from C# interface documentation
*/
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 enhancedAPITest() {
console.log('šÆ Enhanced API Test - Using C# Interface Insights\n');
const baseURL = "https://api.digitalpages.com.br";
const projectUID = "36c92686-c494-ec11-a22a-dc984041c95d";
// Parse JWT to get user info
const [header, payload, signature] = jwtToken.split('.');
const decodedPayload = JSON.parse(Buffer.from(payload, 'base64').toString());
const userUID = decodedPayload.oid; // User UID from JWT
console.log('š Context from JWT:');
console.log(` - User UID: ${userUID}`);
console.log(` - Directory: ${decodedPayload.directory}`);
console.log(` - Email: ${decodedPayload.email}`);
console.log(` - Roles: ${decodedPayload.role.join(', ')}`);
// Test 1: Try with additional headers that might be required
console.log('\n1ļøā£ Testing with enhanced headers:');
const compositionUID = generateUID();
const compositionData = {
version: "1.1",
metadata: {
title: "Enhanced API Test",
description: "Test with proper headers",
thumb: null,
tags: ["api", "test"]
},
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>Enhanced API test content</p>",
background_color: "#FFFFFF",
padding_top: 0,
padding_bottom: 0
}]
};
const compositionJSON = JSON.stringify(compositionData);
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(' - Including additional context headers');
const response = await fetch(url, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${jwtToken}`,
'Accept': 'application/json',
'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',
'X-User-UID': userUID, // User context
'X-Project-UID': projectUID, // Project context
'X-Directory-UID': decodedPayload.directory, // Directory context
'Content-Language': 'pt-br'
},
body: formData
});
console.log(` - 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 query parameters for storage context
console.log('\n2ļøā£ Testing with storage context parameters:');
const contextURL = `${baseURL}/storage/v1.0/content?uid=${compositionUID}&manual_project_uid=${projectUID}&user_uid=${userUID}&directory_uid=${decodedPayload.directory}&content_type=digitalpages/composer`;
try {
console.log(' - URL:', contextURL);
const contextFormData = new FormData();
const contextBlob = new Blob([compositionJSON], { type: 'digitalpages/composer' });
contextFormData.append('file', contextBlob, 'composition.rdpcomposer');
const contextResponse = await fetch(contextURL, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${jwtToken}`,
'Accept': 'application/json'
},
body: contextFormData
});
console.log(` - Status: ${contextResponse.status} ${contextResponse.statusText}`);
const contextResponseText = await contextResponse.text();
console.log(` - Response: ${contextResponseText}`);
} catch (error) {
console.log(` - Error: ${error.message}`);
}
// Test 3: Try different API endpoint based on OAuth insights
console.log('\n3ļøā£ Testing alternative endpoint pattern:');
const altURL = `${baseURL}/storage/v1.0/upload?project_uid=${projectUID}&uid=${compositionUID}`;
try {
console.log(' - URL:', altURL);
const altFormData = new FormData();
const altBlob = new Blob([compositionJSON], { type: 'digitalpages/composer' });
altFormData.append('file', altBlob, 'composition.rdpcomposer');
const altResponse = await fetch(altURL, {
method: 'POST', // Try POST instead of PUT
headers: {
'Authorization': `Bearer ${jwtToken}`,
'Accept': 'application/json'
},
body: altFormData
});
console.log(` - Status: ${altResponse.status} ${altResponse.statusText}`);
const altResponseText = await altResponse.text();
console.log(` - Response: ${altResponseText}`);
} catch (error) {
console.log(` - Error: ${error.message}`);
}
// Test 4: Try with connector context (based on IConnectorDataServerRequestV2)
console.log('\n4ļøā£ Testing with connector context:');
const connectorURL = `${baseURL}/storage/v1.0/content`;
try {
console.log(' - URL:', connectorURL);
console.log(' - Using connector-style request');
const connectorData = {
service: "storage",
method: "PUT",
parameters: {
uid: compositionUID,
manual_project_uid: projectUID,
user_uid: userUID,
content_type: "digitalpages/composer"
}
};
const connectorFormData = new FormData();
connectorFormData.append('file', new Blob([compositionJSON], { type: 'digitalpages/composer' }), 'composition.rdpcomposer');
connectorFormData.append('metadata', JSON.stringify(connectorData));
const connectorResponse = await fetch(connectorURL, {
method: 'PUT',
headers: {
'Authorization': `Bearer ${jwtToken}`,
'Accept': 'application/json',
'X-Service': 'storage',
'X-Method': 'PUT'
},
body: connectorFormData
});
console.log(` - Status: ${connectorResponse.status} ${connectorResponse.statusText}`);
const connectorResponseText = await connectorResponse.text();
console.log(` - Response: ${connectorResponseText}`);
} catch (error) {
console.log(` - Error: ${error.message}`);
}
// Test 5: Try basic authentication test endpoint
console.log('\n5ļøā£ Testing basic authentication endpoint:');
const authTestURL = `${baseURL}/user/me`;
try {
console.log(' - URL:', authTestURL);
const authResponse = await fetch(authTestURL, {
method: 'GET',
headers: {
'Authorization': `Bearer ${jwtToken}`,
'Accept': 'application/json'
}
});
console.log(` - Status: ${authResponse.status} ${authResponse.statusText}`);
const authResponseText = await authResponse.text();
console.log(` - Response: ${authResponseText.substring(0, 200)}...`);
} catch (error) {
console.log(` - Error: ${error.message}`);
}
console.log('\nš Enhanced Summary:');
console.log(' - Added user context from JWT token');
console.log(' - Tried different headers and parameters');
console.log(' - Tested alternative endpoints and methods');
console.log(' - The 500 errors persist across all variations');
console.log(' - This suggests a server-side issue or missing authentication requirement');
}
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);
});
}
enhancedAPITest().catch(console.error);