Skip to main content
Glama
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);

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/rkm097git/euconquisto-composer-mcp-poc'

If you have feedback or need assistance with the MCP directory API, please join our Discord server