HEX
Server: nginx/1.24.0
System: Linux nowruzgan 6.8.0-57-generic #59-Ubuntu SMP PREEMPT_DYNAMIC Sat Mar 15 17:40:59 UTC 2025 x86_64
User: babak (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
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;