'use strict'; const { getConfig, setError, setSuccess, clearStatus, pickMsgField } = require('../lib/utils'); const { ocsRequest } = require('../lib/ocs'); const bridge = require('../lib/bridge'); const { resolveFileId } = bridge; const { webdavGet, webdavPut } = require('../lib/webdav'); const { convertTo } = require('../lib/collabora'); const { resolveDestNcPath, assertSafeDestination, contentTypeForFormat, normalizeNcPath } = require('../lib/utils'); module.exports = function (RED) { function NcOfficeNode(config) { RED.nodes.createNode(this, config); const node = this; node.configNode = RED.nodes.getNode(config.config); node.operation = config.operation || 'templates:list'; node.on('input', async (msg, send, done) => { send = send || function () { node.send.apply(node, arguments); }; done = done || function (err) { if (err) { node.error(err, msg); } }; clearStatus(node); try { const cfg = getConfig(node); const op = msg.operation || node.operation; let result; switch (op) { case 'templates:list': { const type = pickMsgField(msg, 'templateType') || 'document'; result = await ocsRequest(cfg, { method: 'GET', path: `/ocs/v2.php/apps/richdocuments/api/v1/templates/${type}` }); msg.payload = result.data; break; } case 'templates:create': { result = await ocsRequest(cfg, { method: 'POST', path: '/ocs/v2.php/apps/richdocuments/api/v1/templates/new', body: { templateId: msg.templateId, fileName: msg.fileName || msg.destName, templatePath: msg.templatePath } }); msg.payload = result.data; break; } case 'template:extractFields': { const fileId = await resolveFileId(cfg, msg); result = await ocsRequest(cfg, { method: 'GET', path: `/ocs/v2.php/apps/richdocuments/api/v1/template/fields/extract/${fileId}` }); msg.fileId = fileId; msg.payload = result.data; break; } case 'template:fillFields': { const fileId = await resolveFileId(cfg, msg); const fields = msg.fields || msg.transform; const body = { fields }; if (msg.destNcPath) { body.destination = normalizeNcPath(msg.destNcPath).replace(/^\//, ''); } result = await ocsRequest(cfg, { method: 'POST', path: `/ocs/v2.php/apps/richdocuments/api/v1/template/fields/fill/${fileId}`, body }); msg.fileId = fileId; msg.payload = result.data; break; } case 'document:direct': { const fileId = await resolveFileId(cfg, msg); result = await ocsRequest(cfg, { method: 'POST', path: '/ocs/v2.php/apps/richdocuments/api/v1/document', body: { fileid: fileId } }); msg.fileId = fileId; msg.editorUrl = result.data?.url || result.data; msg.payload = { url: msg.editorUrl, fileId }; break; } case 'document:public': { if (!msg.shareToken) { throw new Error('document:public kräver msg.shareToken'); } result = await ocsRequest(cfg, { method: 'POST', path: '/ocs/v2.php/apps/richdocuments/api/v1/document', body: { shareToken: msg.shareToken } }); msg.editorUrl = result.data?.url || result.data; msg.payload = { url: msg.editorUrl }; break; } case 'files:convert': { const format = (pickMsgField(msg, 'format') || 'pdf').toLowerCase(); const source = msg.ncPath ? await webdavGet(cfg, msg.ncPath) : { buffer: Buffer.from(msg.payload), filename: msg.filename || 'file.bin' }; const converted = await convertTo(cfg, { buffer: source.buffer, filename: source.filename, format }); const dest = assertSafeDestination(resolveDestNcPath(msg, msg.ncPath, format), msg); const put = await webdavPut(cfg, dest, converted.buffer, contentTypeForFormat(format)); msg.destNcPath = put.destNcPath; msg.payload = converted.buffer; msg.format = format; break; } case 'assets:create': { const link = await bridge.createAssetLink(cfg, msg); msg.assetUrl = link.assetUrl; msg.payload = { assetUrl: link.assetUrl, ncPath: link.ncPath }; break; } default: throw new Error(`Okänd nc-office operation: ${op}`); } setSuccess(node, msg, op); send(msg); done(); } catch (err) { setError(node, msg, err); send(msg); done(err); } }); } RED.nodes.registerType('nc-office', NcOfficeNode); };