]>
git.immae.eu Git - perso/Immae/Projets/Nodejs/Surfer.git/blob - src/files.js
55e8978ac59908b78a5ffbac2ea2b40e7b76f69c
3 var fs
= require('fs'),
4 path
= require('path'),
6 rimraf
= require('rimraf'),
7 HttpError
= require('connect-lastmile').HttpError
,
8 HttpSuccess
= require('connect-lastmile').HttpSuccess
;
10 exports
= module
.exports
= {
16 var FILE_BASE
= path
.resolve(__dirname
, '../files');
18 // http://stackoverflow.com/questions/11293857/fastest-way-to-copy-file-in-node-js
19 function copyFile(source
, target
, cb
) {
22 var rd
= fs
.createReadStream(source
);
23 rd
.on("error", function(err
) {
27 var wr
= fs
.createWriteStream(target
);
28 wr
.on("error", function(err
) {
32 wr
.on("close", function(ex
) {
46 function render(view
, options
) {
47 return ejs
.render(fs
.readFileSync(view
, 'utf8'), options
);
50 function getAbsolutePath(filePath
) {
51 var absoluteFilePath
= path
.resolve(FILE_BASE
, filePath
);
53 if (absoluteFilePath
.indexOf(FILE_BASE
) !== 0) return null;
54 return absoluteFilePath
;
57 function get(req
, res
, next
) {
58 var filePath
= req
.params
[0];
59 var absoluteFilePath
= getAbsolutePath(filePath
);
60 if (!absoluteFilePath
) return next(new HttpError(403, 'Path not allowed'));
62 fs
.stat(absoluteFilePath
, function (error
, result
) {
63 if (error
) return next(new HttpError(404, error
));
65 console
.log('get', absoluteFilePath
);
67 if (result
.isFile()) return res
.sendfile(absoluteFilePath
);
68 if (result
.isDirectory()) return res
.status(200).send({ entries: fs
.readdirSync(absoluteFilePath
) });
70 return next(new HttpError(500, 'unsupported type'));
74 function put(req
, res
, next
) {
75 var filePath
= req
.params
[0];
77 if (!req
.files
.file
) return next(new HttpError(400, 'missing file'));
79 var absoluteFilePath
= getAbsolutePath(filePath
);
80 if (!absoluteFilePath
) return next(new HttpError(403, 'Path not allowed'));
82 fs
.stat(absoluteFilePath
, function (error
, result
) {
83 if (error
&& error
.code
!== 'ENOENT') return next(new HttpError(500, error
));
85 console
.log('put', absoluteFilePath
, req
.files
.file
);
87 if (result
&& result
.isDirectory()) return next(new HttpError(409, 'cannot put on directories'));
88 if (!result
|| result
.isFile()) {
89 return copyFile(req
.files
.file
.path
, absoluteFilePath
, function (error
) {
90 if (error
) return next(new HttpError(500, error
));
91 next(new HttpSuccess(201, {}));
95 return next(new HttpError(500, 'unsupported type'));
99 function del(req
, res
, next
) {
100 var filePath
= req
.params
[0];
101 var absoluteFilePath
= getAbsolutePath(filePath
);
102 if (!absoluteFilePath
) return next(new HttpError(403, 'Path not allowed'));
104 fs
.stat(absoluteFilePath
, function (error
, result
) {
105 if (error
) return next(new HttpError(404, error
));
107 rimraf(absoluteFilePath
, function (error
) {
108 if (error
) return next(new HttpError(500, 'Unable to remove'));
109 next(new HttpSuccess(200, {}));