File: /var/dev/farhangmoaser/web/routes/api/1.0/getimage.js
/**
* Express endpoints for /file address
* Version: 0.1
* Author: Babak Vandad
*
* Restful api for addresses:
* GET /getimage/:section/:uuid
* GET /getimage/:section/:uuid/:size
* GET /getimage/:section/:uuid/:size/:options
*/
var express = require('express');
var router = express.Router();
var fs = require('fs');
var gm = require('gm');
var path = require('path');
var consts = require(path.join(BASEDIR, 'consts'));
var authHelper = require(path.join(BASEDIR, 'helpers/auth'));
var UserAccessModel = require(path.join(BASEDIR, 'models/userAccess'));
var authenticate = authHelper.authenticate;
var access = authHelper.access;
/**
* Fail a request by releasing database connection, rollback transaction
* and sending the proper error code and message with 4xx or 5xx status codes.
* @param {object} express response object
* @param {object} db connection
* @param {object} error object from costs.js
* @param {integer} override status code (if you want to send 200 instead of 4xx/5xx)
* @return {function} the function to fail the request.
*/
var fail = function(response, error, status){
return function(){
response.status(status ? status : error.status).json({error: error.code, message: error.message});
};
}
/* load image - full sized */
router.get('/:section/:uuid', authenticate, access('getimage:get-section-uuid', 'دریافت تصویر'), function(req, res, next) {
if(!/.{8}(-.{4}){3}-.{12}/.exec(req.params.uuid) && req.params.uuid!='default')
return fail(res, consts.e.ERR_MALFORMED_REQUEST)();
if(!req.params.section || ['cover', 'avatar'].indexOf(req.params.section)==-1 || /\.\./.exec(req.params.section))
return fail(res, consts.e.ERR_MALFORMED_REQUEST)();
var section = req.params.section;
var filename = path.join(BASEDIR, 'private/'+section, req.params.uuid);
fs.exists(filename, function (exists) {
if(exists)
res
.set('content-disposition', 'Attachment; filename="'+section+'.png"')
.sendFile(filename, {
header: {
'Content-type': 'image/png',
}
});
else
fail(res, consts.e.ERR_MISSING_RECORD)();
});
});
/* load image - specific size: [width]x[height] */
router.get('/:section/:uuid/:size', authenticate, access('getimage:get-section-uuid-size', 'دریافت تصویر با اندازه مشخص'), function(req, res, next) {
if(!/.{8}(-.{4}){3}-.{12}/.exec(req.params.uuid) && req.params.uuid!='default')
return fail(res, consts.e.ERR_MALFORMED_REQUEST)();
if(!/\d+x\d+/.exec(req.params.size))
return fail(res, consts.e.ERR_MALFORMED_REQUEST)();
if(!req.params.section || ['cover', 'avatar'].indexOf(req.params.section)==-1 || /\.\./.exec(req.params.section))
return fail(res, consts.e.ERR_MALFORMED_REQUEST)();
var section = req.params.section;
var filename = path.join(BASEDIR, 'private/'+section, req.params.uuid);
fs.exists(filename, function (exists){
if(exists){
fs.exists(filename+'-'+req.params.size, function(exists){
if(exists)
res
.set('content-disposition', 'Attachment; filename="'+section+'.png"')
.sendFile(filename+'-'+req.params.size, {
header: {
'Content-type': 'image/png',
}
});
else {
var dim = req.params.size.split('x');
var destdim = {
width: parseInt(dim[0]),
height: parseInt(dim[1])
};
var g = gm(filename)
.size(function(err, sorcdim){
var cropdim = {width: sorcdim.width, height: sorcdim.height};
if(sorcdim.width/sorcdim.height > destdim.width/destdim.height)
cropdim.width = sorcdim.height*destdim.width/destdim.height;
else
cropdim.height = sorcdim.width*destdim.height/destdim.width;
g
.gravity('Center')
.crop(cropdim.width, cropdim.height)
.resize(destdim.width, destdim.height)
.setFormat('jpg')
.quality(85)
.write(filename+'-'+req.params.size, function(err){
if(err)
return fail(res, consts.e.ERR_FILE_ERROR)();
res
.set('content-disposition', 'Attachment; filename="'+section+'.png"')
.sendFile(filename+'-'+req.params.size, {
header: {
'Content-type': 'image/png',
}
});
});
});
}
});
}
else
fail(res, consts.e.ERR_MISSING_RECORD)();
});
});
/* load image - specific size: [width]x[height] and specific options */
router.get('/:section/:uuid/:size/:options', authenticate, access('getimage:get-section-uuid-size-options', 'دریافت تصویر با اندازه و ویژگیهای مشخص'), function(req, res, next) {
if(!/.{8}(-.{4}){3}-.{12}/.exec(req.params.uuid))
return fail(res, consts.e.ERR_MALFORMED_REQUEST)();
});
module.exports = router;