|
|
|
@ -2,8 +2,9 @@ const Papa = require('papaparse'); |
|
|
|
|
|
|
|
|
|
// exporter maybe is broken since Gridfs introduced, add fs and path
|
|
|
|
|
export class Exporter { |
|
|
|
|
constructor(boardId) { |
|
|
|
|
constructor(boardId, attachmentId) { |
|
|
|
|
this._boardId = boardId; |
|
|
|
|
this._attachmentId = attachmentId; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
build() { |
|
|
|
@ -33,6 +34,62 @@ export class Exporter { |
|
|
|
|
}, |
|
|
|
|
}), |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
// [Old] for attachments we only export IDs and absolute url to original doc
|
|
|
|
|
// [New] Encode attachment to base64
|
|
|
|
|
|
|
|
|
|
const getBase64Data = function(doc, callback) { |
|
|
|
|
let buffer = Buffer.allocUnsafe(0); |
|
|
|
|
buffer.fill(0); |
|
|
|
|
|
|
|
|
|
// callback has the form function (err, res) {}
|
|
|
|
|
const tmpFile = path.join( |
|
|
|
|
os.tmpdir(), |
|
|
|
|
`tmpexport${process.pid}${Math.random()}`, |
|
|
|
|
); |
|
|
|
|
const tmpWriteable = fs.createWriteStream(tmpFile); |
|
|
|
|
const readStream = doc.createReadStream(); |
|
|
|
|
readStream.on('data', function(chunk) { |
|
|
|
|
buffer = Buffer.concat([buffer, chunk]); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
readStream.on('error', function() { |
|
|
|
|
callback(null, null); |
|
|
|
|
}); |
|
|
|
|
readStream.on('end', function() { |
|
|
|
|
// done
|
|
|
|
|
fs.unlink(tmpFile, () => { |
|
|
|
|
//ignored
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
callback(null, buffer.toString('base64')); |
|
|
|
|
}); |
|
|
|
|
readStream.pipe(tmpWriteable); |
|
|
|
|
}; |
|
|
|
|
const getBase64DataSync = Meteor.wrapAsync(getBase64Data); |
|
|
|
|
const byBoardAndAttachment = this._attachmentId |
|
|
|
|
? { boardId: this._boardId, _id: this._attachmentId } |
|
|
|
|
: byBoard; |
|
|
|
|
result.attachments = Attachments.find(byBoardAndAttachment) |
|
|
|
|
.fetch() |
|
|
|
|
.map(attachment => { |
|
|
|
|
let filebase64 = null; |
|
|
|
|
filebase64 = getBase64DataSync(attachment); |
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
_id: attachment._id, |
|
|
|
|
cardId: attachment.cardId, |
|
|
|
|
//url: FlowRouter.url(attachment.url()),
|
|
|
|
|
file: filebase64, |
|
|
|
|
name: attachment.original.name, |
|
|
|
|
type: attachment.original.type, |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
//When has a especific valid attachment return the single element
|
|
|
|
|
if (this._attachmentId) { |
|
|
|
|
return result.attachments.length > 0 ? result.attachments[0] : {}; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
result.lists = Lists.find(byBoard, noBoardId).fetch(); |
|
|
|
|
result.cards = Cards.find(byBoardNoLinked, noBoardId).fetch(); |
|
|
|
|
result.swimlanes = Swimlanes.find(byBoard, noBoardId).fetch(); |
|
|
|
@ -84,54 +141,6 @@ export class Exporter { |
|
|
|
|
); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
// [Old] for attachments we only export IDs and absolute url to original doc
|
|
|
|
|
// [New] Encode attachment to base64
|
|
|
|
|
|
|
|
|
|
const getBase64Data = function(doc, callback) { |
|
|
|
|
let buffer = Buffer.allocUnsafe(0); |
|
|
|
|
buffer.fill(0); |
|
|
|
|
|
|
|
|
|
// callback has the form function (err, res) {}
|
|
|
|
|
const tmpFile = path.join( |
|
|
|
|
os.tmpdir(), |
|
|
|
|
`tmpexport${process.pid}${Math.random()}`, |
|
|
|
|
); |
|
|
|
|
const tmpWriteable = fs.createWriteStream(tmpFile); |
|
|
|
|
const readStream = doc.createReadStream(); |
|
|
|
|
readStream.on('data', function(chunk) { |
|
|
|
|
buffer = Buffer.concat([buffer, chunk]); |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
readStream.on('error', function() { |
|
|
|
|
callback(null, null); |
|
|
|
|
}); |
|
|
|
|
readStream.on('end', function() { |
|
|
|
|
// done
|
|
|
|
|
fs.unlink(tmpFile, () => { |
|
|
|
|
//ignored
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
callback(null, buffer.toString('base64')); |
|
|
|
|
}); |
|
|
|
|
readStream.pipe(tmpWriteable); |
|
|
|
|
}; |
|
|
|
|
const getBase64DataSync = Meteor.wrapAsync(getBase64Data); |
|
|
|
|
result.attachments = Attachments.find(byBoard) |
|
|
|
|
.fetch() |
|
|
|
|
.map(attachment => { |
|
|
|
|
let filebase64 = null; |
|
|
|
|
filebase64 = getBase64DataSync(attachment); |
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
_id: attachment._id, |
|
|
|
|
cardId: attachment.cardId, |
|
|
|
|
//url: FlowRouter.url(attachment.url()),
|
|
|
|
|
file: filebase64, |
|
|
|
|
name: attachment.original.name, |
|
|
|
|
type: attachment.original.type, |
|
|
|
|
}; |
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
// we also have to export some user data - as the other elements only
|
|
|
|
|
// include id but we have to be careful:
|
|
|
|
|
// 1- only exports users that are linked somehow to that board
|
|
|
|
|