we-plugin-file
Version:
We.js file plugin with suport to storages
198 lines (169 loc) • 4.91 kB
JavaScript
module.exports = {
/**
* Upload one file to default storage strategy and save metadata on database
*
* @apiName file.create
* @apiGroup file
*
* @module Controller
*
* @param {Object} req Express.js request
* @param {Object} res Express.js response
* @param {Function} next Express.js callback
*
* @successResponse 201
*/
create(req, res) {
const we = req.we,
// files in upload
files = req.files;
if (!files.file && files.file[0]) return res.badRequest('file.create.file.required');
let file = files.file[0];
if (!we.utils._.isObject(file)) return res.badRequest('file.create.file.invalid');
we.log.verbose('file:create: files.file to save:', file);
file.description = req.body.description;
file.label = req.body.label;
file.mime = file.mimetype;
// set creator
if (req.isAuthenticated()) file.creatorId = req.user.id;
// set default file Name if not set in storage
if (!file.name) file.name = file.originalname;
// set storage name
file.storageName = (res.locals.upload.storageName || we.config.upload.defaultFileStorage);
file.isLocalStorage = res.locals.storageStrategy.isLocalStorage;
file.urls = {};
// set the original url for file upploads
file.urls.original = res.locals.storageStrategy.getUrlFromFile('original', file);
res.locals.Model
.create(file)
.then(function afterCreateAndUpload (record) {
we.log.debug('New file record created:', record.get());
res.created(record);
return null;
})
.catch(res.queryError);
},
edit(req, res) {
const we = req.we;
let fileId = req.params.fileId;
if (!fileId) {
return res.notFound();
}
we.db.models.file
.findOne({
where: { id: fileId }
})
.then(function afterFindOne (r) {
if (!r) return null;
r.description = req.body.description;
return r.save()
.then( (r)=> {
res.send({
file: r
});
});
})
.catch( (err)=> {
we.log.error('Error on update file in BD: ', err, fileId);
return res.serverError(err);
});
},
/**
* Download one file
*
* @apiName file.download
* @apiGroup file
*
* @module Controller
*
* @param {Object} req Express.js request
* @param {Object} res Express.js response
* @param {Function} next Express.js callback
*
* @successResponse 201
*/
download(req, res) {
const we = req.we;
let fileName = req.params.name;
if (!fileName) {
return res.badRequest('file:download: fileName is required')
}
req.we.db.models.file
.findOne({
where: {
name: fileName
}
})
.then(function afterFind (file) {
// file not found
if (!file) {
req.we.log.silly('file:download: file not found:', fileName);
return res.notFound();
}
// if (!file.isLocalStorage) {
// if (!file.urls.original) return res.notFound('original file not found')
// // not is local, then redirect to permanent link
// return res.redirect(file.urls.original)
// }
var storage = we.config.upload.storages[file.storageName];
if (!storage) return res.serverError('we-plugin-file:findOne:storage:not_found');
storage.sendFile(file, req, res);
return null;
})
.catch(res.queryError);
},
/**
* Get we-plugin-view modal content for select files in it
*
* @apiName file.getFormModalContent
* @apiGroup file
*
* @module Controller
*
* @param {Object} req Express.js request
* @param {Object} res Express.js response
* @param {Function} next Express.js callback
*
* @successResponse 200
*/
getFormModalContent(req, res) {
// only works with we-plugin-view
if (!req.we.view) return res.notFound();
res.send(
req.we.view.renderTemplate('form-' + req.params.type + '-modal-content', res.locals.theme, res.locals)
);
},
/**
* Delete one file
*
* @apiName file.destroy
* @apiGroup file
*
* @module Controller
*
* @param {Object} req Express.js request
* @param {Object} res Express.js response
* @param {Function} next Express.js callback
*
* @successResponse 204
*/
destroy(req, res) {
const we = req.we;
we.db.models.file
.findOne({
where: { name: req.params.name }
})
.then(function afterDelete (record) {
if (!record) return res.notFound();
res.locals.deleted = true;
var storage = we.config.upload.storages[record.storageName];
if (!storage) return res.serverError('we-plugin-file:delete:storage:not_found');
storage.destroyFile(record, function afterDeleteFile(err) {
if (err) return res.serverError(err);
return res.deleted();
});
return null;
})
.catch(res.queryError);
}
}