// License: LGPL-3.0-or-later const flyd = require('flyd') const R = require('ramda') // local const request = require('./super-agent-frp') const postFormData = require('./post-form-data') // Pass in a stream of Input Nodes with type file // Make a post request to our server to start the import // Will create a backgrounded job and email the user when // completed // Returns a stream of {uri: 'uri of uploaded file on s3', formData: 'original form data'} const uploadFile = R.curry(input => { // We need to get an AWS presigned post thing to so we can upload files // Stream of pairs of [formObjData, presignedPostObj] var withPresignedPost$ = flyd.map( resp => [input, resp.body] , request.post('/aws_presigned_posts').perform() ) // Stream of upload responses from s3 return flyd.flatMap( pair => { var [input, presignedPost] = pair var url = `https://${presignedPost.s3_direct_url.host}` var file = input.files[0] var fileUrl = `${url}/tmp/${presignedPost.s3_uuid}/${file.name}` var urlWithPort = `${url}:${presignedPost.s3_direct_url.port}` var payload = R.merge(JSON.parse(presignedPost.s3_presigned_post), {file}) return flyd.map(resp => ({uri: fileUrl, file}), postFormData(url, payload)) } , withPresignedPost$) }) module.exports = uploadFile