foxxy
Version:
Foxx framework based on RiotJS + ArangoDB/Foxx
147 lines (138 loc) • 4.61 kB
JavaScript
;
const db = require('@arangodb').db
const joi = require('joi')
const _ = require('lodash')
const createRouter = require('@arangodb/foxx/router')
const router = createRouter()
const querystring = require('querystring')
const crypt = require('@arangodb/crypto')
const fs = require("fs")
const sessionsMiddleware = require('@arangodb/foxx/sessions')
const jwtStorage = require('@arangodb/foxx/sessions/storages/jwt')
const request = require('@arangodb/request')
const _settings = db._collection('foxxy_settings').firstExample()
const sessions = sessionsMiddleware({
storage: jwtStorage(_settings.jwt_secret),
transport: 'header'
})
module.context.use(sessions)
module.context.use(router)
module.context.use(function (req, res, next) {
if (!req.session.uid) res.throw('unauthorized')
res.setHeader("Access-Control-Expose-Headers", "X-Session-Id")
next()
})
// -----------------------------------------------------------------------------
// GET /uploads/:key/:type/:field
router.get('/:key/:type/:field', function (req, res) {
var obj = {
field: req.pathParams.field,
object_id: req.pathParams.key + '/' + req.pathParams.type
}
var uploads = db._query(`
FOR u IN uploads
FILTER u.field == @field
FILTER u.object_id == @object_id
SORT u.pos
RETURN u
`, obj).toArray()
res.send(uploads)
})
.header('foxx-locale')
.header('X-Session-Id')
.description("Get all files for a specific id and field")
// -----------------------------------------------------------------------------
// GET /uploads/:key/:type/:field/:lang
router.get('/:key/:type/:field/:lang', function (req, res) {
var obj = {
field: req.pathParams.field,
object_id: req.pathParams.key + '/' + req.pathParams.type
}
if (req.pathParams.lang) obj['lang'] = req.pathParams.lang
res.send(db.uploads.byExample(obj).toArray())
})
.header('foxx-locale')
.header('X-Session-Id')
.description("Get all files for a specific id and field")
// -----------------------------------------------------------------------------
// POST /uploads/:key/:type/:field
router.post('/:key/:type/:field', function (req, res) {
let docs = []
_.each(req.body, function (data) {
const uuid = crypt.genRandomAlphaNumbers(40)
let filename = querystring.parse(
data.headers["Content-Disposition"].split(';')[2].trim().replace(/"/g, '')
).filename
const ext = _.last(filename.split('.')).toLowerCase()
const filedest = _settings.upload_path + uuid + "." + ext
let urldest = _settings.upload_url + uuid + "/" + ext
fs.write(filedest, data.data)
const image_exts = ['png', 'jpg', 'jpeg']
if (_settings.resize_ovh && _.includes(image_exts, ext)) {
// upload to resize.ovh service
var res = request.post('https://resize.ovh/upload_http', {
form: {
image: urldest,
key: _settings.resize_ovh
}
})
var _uuid = JSON.parse(res.body).filename
urldest = `https://resize.ovh/o/${_uuid}`
}
var upload = {
path: filedest,
url: urldest,
filename: filename,
length: data.data.length,
mime: data.headers["Content-Type"],
object_id: req.pathParams.type + '/' + req.pathParams.key,
field: req.pathParams.field,
lang: req.headers['foxx-locale'],
pos: 1000
}
docs.push(
db.uploads.save(upload)
)
})
res.send(docs)
})
.body(['multipart/form-data'])
.header('foxx-locale')
.header('X-Session-Id')
.description("Upload a file")
// -----------------------------------------------------------------------------
// POST /uploads/reorder
router.post('/reorder', function (req, res) {
db._query(`
FOR data IN @data
UPDATE { _key: data.k, pos: data.c } IN uploads
`, {
data: req.body.ids
})
res.send({
success: true
})
})
.header('X-Session-Id')
.body(joi.object({
ids: joi.array().required()
}), 'data')
.description("Reorder elements")
// -----------------------------------------------------------------------------
// DELETE /uploads/:key
router.delete('/:key', function (req, res) {
let upload = db.uploads.document(req.pathParams.key)
// Remove file
try {
fs.remove(upload.path)
} catch (e) {
// Maybe the file is not there anymore
}
// Delete document
db.uploads.remove(req.pathParams.key)
res.send({
success: true
})
})
.header('X-Session-Id')
.description("Delete an upload")