diff options
| author | Jules Laplace <julescarbon@gmail.com> | 2018-05-28 20:18:20 +0200 |
|---|---|---|
| committer | Jules Laplace <julescarbon@gmail.com> | 2018-05-28 20:18:20 +0200 |
| commit | 84aca1791d43ae5a65bd88747636e418b380ad64 (patch) | |
| tree | f56687c992bb6dc3956e8744be8030a48f00d95e /app/server/util | |
| parent | c248031739699775477c838f8e836fedf243c720 (diff) | |
reconsidering datasets component... stub in api client
Diffstat (limited to 'app/server/util')
| -rw-r--r-- | app/server/util/api.js | 100 | ||||
| -rw-r--r-- | app/server/util/upload.js | 80 |
2 files changed, 180 insertions, 0 deletions
diff --git a/app/server/util/api.js b/app/server/util/api.js new file mode 100644 index 0000000..2b2a9e4 --- /dev/null +++ b/app/server/util/api.js @@ -0,0 +1,100 @@ +const db = require('../db') + +export function api (app, type) { + const type_s = '/' + type + 's/' + const type_id = type_s + ':id' + + const model = db.models[type] + + // index + app.get(type_s, (req, res) => { + console.log('index', type) + model.index(req.query).then( data => res.json(data) ) + }) + + // show + app.get(type_id, (req, res) => { + console.log('show', type, req.params.id) + model.show(req.params.id).then( (data) => { + res.json(data) + }) + }) + + // create + app.post(type_s, (req, res) => { + console.log('create', type) + model.create(req.body).then( (data) => { + res.json(data) + })// .catch( () => res.sendStatus(500) ) + }) + + // update + app.put(type_id, (req, res) => { + console.log('update', type, req.params.id) + model.update(req.body.id, req.body).then( (data) => { + res.json(data) + })// .catch( () => res.sendStatus(500) ) + }) + + // destroy + app.delete(type_id, (req, res) => { + console.log('destroy', type, req.params.id) + model.destroy(req.params.id).then( (data) => { + res.json(data) + })// .catch( () => res.sendStatus(500) ) + }) + + return model +} + +const upload = require('./upload') + +export function uploadFile(req, res, next) { + if (! req.file) { + res.json({ error: "no files" }) + return + } + var dirname = '/cortex/' + req.params.tool + '/' + upload.put({ + file: req.file, + dirname: dirname, + preserveFilename: true, + unacceptable: function(err){ + res.sendStatus({ error: 'Problem uploading file.' }) + }, + success: function(url){ + res.urls = url + next() + } + }) +} + +export function uploadFiles(req, res, next){ + if (! req.files || ! req.files.length) { + res.json({ error: "no files" }) + return + } + var dirname = '/cortex/' + req.params.tool + '/' + var promises = req.files.map((file) => { + return new Promise( (resolve, reject) => { + upload.put({ + file: file, + dirname: dirname, + preserveFilename: true, + unacceptable: function(err){ + reject(err) + }, + success: function(url){ + console.log("file >", url) + resolve(url) + } + }) + }) + }) + Promise.all(promises).then(values => { + res.urls = urls + next() + }).catch(err => { + console.log(err) + }) +}
\ No newline at end of file diff --git a/app/server/util/upload.js b/app/server/util/upload.js new file mode 100644 index 0000000..9e15748 --- /dev/null +++ b/app/server/util/upload.js @@ -0,0 +1,80 @@ + +var knox = require('knox') +var uuid = require('uuid/v1') + +var s3 = knox.createClient({ + key: process.env.S3_KEY, + secret: process.env.S3_SECRET, + bucket: process.env.S3_BUCKET, +}) + +var acceptableuploadTypes = { + 'image/gif': 'gif', + 'image/jpeg': 'jpg', + 'image/jpg': 'jpg', + 'image/png': 'png', +} + +module.exports = {} + +module.exports.client = function(){ + return s3 +} + +module.exports.put = function (opt) { + var filename + var err + var now = new Date() + + var file = opt.file + + var types = opt.types + var extension = types && types[file.mimetype] + + if (opt.filename) { + filename = opt.filename + } else if (opt.preserveFilename) { + filename = file.originalname + } else { + filename = uuid() + "." + extension; + } + + var remote_path = opt.dirname + filename + + if (types && ! extension) { + err = "Unacceptable filetype." + } + else if (opt.maxSize && file.size > opt.maxSize) { + err = "File too large. Uploads can be a maximum of " + opt.maxSize + " bytes." + } + + if (err) { + console.error(">>>", err) + opt.unacceptable && opt.unacceptable(err) + return + } + + opt.acceptable && opt.acceptable(err) + + console.log("upload >", remote_path) + s3.putBuffer(file.buffer, remote_path, { + 'Content-Length': file.size, + 'Content-Type': file.mimetype, + 'x-amz-acl': 'public-read' + }, function(err, s3res) { + if (err || s3res.statusCode !== 200) { + console.error(err); + if (s3res && s3res.resume) { + s3res.resume() + } + return; + } + + var file_url = s3res.url || s3res.req.url + + opt.success && opt.success(file_url) + }).on('error', function(err, s3res){ + console.error(err) + s3res && s3res.resume && s3res.resume() + }) +} |
