From 8875cb29cb4508954d8851cf22dda1fc7a22b188 Mon Sep 17 00:00:00 2001 From: Jordan Diaz Date: Wed, 29 Apr 2026 15:30:21 +0000 Subject: [PATCH] Ajustes de estructura --- mcp-server/tools/media/upload.js | 78 +++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 27 deletions(-) diff --git a/mcp-server/tools/media/upload.js b/mcp-server/tools/media/upload.js index 67024b5..3bfd6d1 100644 --- a/mcp-server/tools/media/upload.js +++ b/mcp-server/tools/media/upload.js @@ -251,36 +251,60 @@ export function registerUploadRecordImageTool(server) { ); if (validationError) return validationError; - const credentials = await getSessionCredentials(extra.sessionId); + const projectSlug = path.basename(resolveCurrentProjectDir()); + let result; - // Step 1: Delete old upload - await mcpPost( - credentials, - "deleteRecordUpload", - { uploadId }, - credentials.token, - credentials.tokenHash - ); + try { + // Paso 1: borrar upload viejo via Python (incluye sync de borrado a produccion). + await pythonPost("/api/cms/delete-upload", { + project: projectSlug, + uploadId, + table: tableName, + }); - // Step 2: Upload new image - // Si la URL es local, descargar y enviar base64 (el servidor remoto no - // puede descargarla en modo produccion). - const localFile = await resolveLocalImageAsBase64(imageUrl); - const uploadPayload = localFile - ? { tableName, recordId, fieldName, alt, fileBase64: localFile.fileBase64, fileName: localFile.fileName } - : { tableName, recordId, fieldName, imageUrl, alt }; + // Paso 2: subir el nuevo via Python (incluye sync a produccion + truncado local). + result = await pythonPost("/api/cms/upload-to-field", { + project: projectSlug, + table: tableName, + num: recordId, + field: fieldName, + imageUrl: imageUrl, + }); + } catch (pyErr) { + // Fallback al flujo directo PHP solo cuando el Python no es accesible. + // En este path queda el bug original (sin sync a produccion en modo test), + // pero es preferible a fallar el tool entero. + console.error(`[replace_record_image] Python server failed (${pyErr.message}), falling back to PHP direct`); + const credentials = await getSessionCredentials(extra.sessionId); + await mcpPost( + credentials, + "deleteRecordUpload", + { uploadId }, + credentials.token, + credentials.tokenHash + ); + const localFile = await resolveLocalImageAsBase64(imageUrl); + const uploadPayload = localFile + ? { tableName, recordId, fieldName, alt, fileBase64: localFile.fileBase64, fileName: localFile.fileName } + : { tableName, recordId, fieldName, imageUrl, alt }; + const response = await mcpPost( + credentials, + "uploadRecordImage", + uploadPayload, + credentials.token, + credentials.tokenHash + ); + const apiError = handleApiResponse(response.data, 'replace_record_image'); + if (apiError) return apiError; + result = { success: true, data: response.data }; + } - const response = await mcpPost( - credentials, - "uploadRecordImage", - uploadPayload, - credentials.token, - credentials.tokenHash - ); - - const apiError = handleApiResponse(response.data, 'replace_record_image'); - if (apiError) return apiError; + if (!result?.success && !result?.data?.success) { + const errMsg = result?.error || result?.data?.error || "Unknown error"; + return { content: [{ type: "text", text: JSON.stringify({ error: errMsg }, null, 2) }], isError: true }; + } + const replaceData = result.data || result; return { content: [{ type: "text", @@ -291,7 +315,7 @@ export function registerUploadRecordImageTool(server) { recordId, fieldName, replacedUploadId: uploadId, - ...response.data + ...replaceData, }, null, 2) }], };