- saveFileBuilder (fileBuilder.js) hacía POST directo a viewer_functions.php sin header Host -> en Forge (api_web_url interno http://web:80) Apache servía el vhost por defecto -> 404. Ahora delega en AcaiHttpClient.postViewerAction, que resuelve api_web_url + Host: forge_host (igual que el resto de tools). Pasa credentials completo. - upload_record_image: rechaza data-URI/base64 con error claro (antes derivaba el nombre del base64 -> "File name too long" en mcp_respond.php). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
103 lines
3.0 KiB
JavaScript
103 lines
3.0 KiB
JavaScript
import { AcaiHttpClient } from "./acaiHttpClient.js";
|
|
|
|
/**
|
|
* Helper to save files using saveFileBuilder action.
|
|
* Delega en AcaiHttpClient.postViewerAction, que construye la URL con
|
|
* api_web_url + el header Host (forge_host) y aplica assertSafeCmsTarget.
|
|
* Used by multiple tools (save.js, saveGeneralSection.js, write.js, etc.)
|
|
*
|
|
* @param {Object} params
|
|
* @param {Object} params.credentials - Target completo (web_url, api_web_url, forge_host, mode)
|
|
* @param {string} params.token - Session token
|
|
* @param {string} params.tokenHash - Token hash
|
|
* @param {string} params.path - Folder path (e.g., '/modulos/mymodule/')
|
|
* @param {string} params.fileName - File name (e.g., 'script.js', 'style.css')
|
|
* @param {string} params.content - File content
|
|
* @returns {Promise<Object>} Response from the API
|
|
*/
|
|
export async function saveFileBuilder({
|
|
credentials,
|
|
token,
|
|
tokenHash,
|
|
path,
|
|
fileName,
|
|
content,
|
|
rawDataSended = true
|
|
}) {
|
|
if (!content) {
|
|
return null;
|
|
}
|
|
|
|
const payload = {
|
|
fileName: fileName,
|
|
content: content,
|
|
rawDataSended: rawDataSended,
|
|
rootFolder: false,
|
|
path: path
|
|
};
|
|
|
|
console.error(`[saveFileBuilder] Path: ${path}`);
|
|
console.error(`[saveFileBuilder] Content length: ${content.length} chars`);
|
|
|
|
try {
|
|
const response = await AcaiHttpClient.postViewerAction(
|
|
credentials,
|
|
'saveFileBuilder',
|
|
payload,
|
|
token,
|
|
tokenHash
|
|
);
|
|
|
|
console.error(`[saveFileBuilder] Response for ${fileName}:`, JSON.stringify(response.data, null, 2));
|
|
|
|
return {
|
|
success: response.data.success || false,
|
|
message: response.data.message || (response.data.success ? 'OK' : 'Error'),
|
|
data: response.data
|
|
};
|
|
} catch (error) {
|
|
console.error(`[saveFileBuilder] Error saving ${fileName}:`, error.message);
|
|
return {
|
|
success: false,
|
|
message: `Error saving ${fileName}: ${error.message}`,
|
|
error: error.message
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Helper to save multiple files at once
|
|
*
|
|
* @param {Object} params
|
|
* @param {Object} params.credentials - Target completo (web_url, api_web_url, forge_host, mode)
|
|
* @param {string} params.token - Session token
|
|
* @param {string} params.tokenHash - Token hash
|
|
* @param {string} params.path - Folder path (e.g., '/modulos/mymodule/')
|
|
* @param {Object} params.files - Object with fileName: content pairs
|
|
* @returns {Promise<Object>} Results for each file
|
|
*/
|
|
export async function saveMultipleFiles({
|
|
credentials,
|
|
token,
|
|
tokenHash,
|
|
path,
|
|
files
|
|
}) {
|
|
const results = {};
|
|
|
|
for (const [fileName, content] of Object.entries(files)) {
|
|
if (content) {
|
|
results[fileName] = await saveFileBuilder({
|
|
credentials,
|
|
token,
|
|
tokenHash,
|
|
path,
|
|
fileName,
|
|
content
|
|
});
|
|
}
|
|
}
|
|
|
|
return results;
|
|
}
|