/* eslint max-len: ["error", { "code": 180 }]*/ const got = require('got'); const axios = require('axios'); const UserError = require('vn-loopback/util/user-error'); const FormData = require('form-data'); const fs = require('fs-extra'); module.exports = Self => { Self.remoteMethodCtx('download', { description: 'Download an docuware PDF', accessType: 'READ', accepts: [ { arg: 'id', type: 'number', description: 'The id', http: {source: 'path'} }, { arg: 'fileCabinet', type: 'string', description: 'The id', http: {source: 'path'} }, { arg: 'dialog', type: 'string', description: 'The id', http: {source: 'path'} } ], returns: [ { arg: 'body', type: 'file', root: true }, { arg: 'Content-Type', type: 'string', http: {target: 'header'} }, { arg: 'Content-Disposition', type: 'string', http: {target: 'header'} } ], http: { path: `/:id/download/:fileCabinet/:dialog`, verb: 'GET' } }); Self.download = async function(ctx, id, fileCabinet, dialog) { const myUserId = ctx.req.accessToken.userId; if (!myUserId) throw new UserError(`You don't have enough privileges`); const models = Self.app.models; const docuwareConfig = await models.DocuwareConfig.findOne(); const docuwareInfo = await models.Docuware.findOne({ where: { code: fileCabinet, dialogName: dialog } }); const docuwareUrl = docuwareConfig.url; const cookie = docuwareConfig.token; const fileCabinetName = docuwareInfo.fileCabinetName; const find = docuwareInfo.find; const options = { 'headers': { 'Accept': 'application/json', 'Content-Type': 'application/json', 'Cookie': cookie } }; const searchFilter = { condition: [ { DBName: find, Value: [id] } ] }; try { // get fileCabinetId const fileCabinetResponse = await got.get(`${docuwareUrl}/FileCabinets`, options); const fileCabinetJson = JSON.parse(fileCabinetResponse.body).FileCabinet; const fileCabinetId = fileCabinetJson.find(dialogs => dialogs.Name === fileCabinetName).Id; // get dialog const dialogResponse = await got.get(`${docuwareUrl}/FileCabinets/${fileCabinetId}/dialogs`, options); console.log(`${docuwareUrl}/FileCabinets/${fileCabinetId}/dialogs`); const dialogJson = JSON.parse(dialogResponse.body).Dialog; const dialogId = dialogJson.find(dialogs => dialogs.DisplayName === 'find').Id; // get docuwareID Object.assign(options, {'body': JSON.stringify(searchFilter)}); const response = await got.post(`${docuwareUrl}/FileCabinets/${fileCabinetId}/Query/DialogExpression?dialogId=${dialogId}`, options); const docuwareId = JSON.parse(response.body).Items[0].Id; // download & save file const fileName = `filename="${id}.pdf"`; const contentType = 'application/pdf'; const downloadUri = `${docuwareUrl}/FileCabinets/${fileCabinetId}/Documents/${docuwareId}/FileDownload?targetFileType=Auto&keepAnnotations=false`; const downloadOptions = { 'headers': { 'Cookie': cookie } }; // const stream = got.stream(downloadUri, downloadOptions); const uploadUri = `${docuwareUrl}/FileCabinets/${fileCabinetId}/Documents?storeDialogId=1f665772-c936-4e13-aa2a-f209b1a7070e`; const form = new FormData(); const file = await fs.readFile('back/methods/docuware/10.pdf'); form.append('file', file, '10.pdf'); const uploadOptions = { 'headers': { 'Cookie': cookie, } }; const fileData = { formData: { 'document': { value: JSON.stringify({Fields: {}}), options: { filename: 'document.json', contentType: 'application/json', }, }, 'file[]': { value: fs.createReadStream('back/methods/docuware/10.pdf'), options: { filename: '10.pdf', contentType: null } } } }; Object.assign(uploadOptions, fileData); try { const upload = await axios.post(uploadUri, file, uploadOptions); console.log('UPLOAD FINISHED'); } catch (e) { console.log('ERROR CATCHED:', e); console.log('ERROR CATCHED'); return; } // return [stream, contentType, fileName]; return; } catch (error) { if (error.code === 'ENOENT') throw new UserError('The DOCUWARE PDF document does not exists'); throw error; } }; };