]>
git.immae.eu Git - perso/Immae/Projets/Nodejs/Surfer.git/blob - src/files.js
3 var fs
= require('fs'),
4 path
= require('path'),
7 debug
= require('debug')('files'),
8 mkdirp
= require('mkdirp'),
9 HttpError
= require('connect-lastmile').HttpError
,
10 HttpSuccess
= require('connect-lastmile').HttpSuccess
;
14 exports
= module
.exports = function (basePath
) {
24 // http://stackoverflow.com/questions/11293857/fastest-way-to-copy-file-in-node-js
25 function copyFile(source
, target
, cb
) {
29 mkdirp(path
.dirname(target
), function (error
) {
30 if (error
) return cb(error
);
32 var rd
= fs
.createReadStream(source
);
33 rd
.on("error", function(err
) {
37 var wr
= fs
.createWriteStream(target
);
38 wr
.on("error", function(err
) {
42 wr
.on("close", function(ex
) {
57 function render(view
, options
) {
58 return ejs
.render(fs
.readFileSync(view
, 'utf8'), options
);
61 function getAbsolutePath(filePath
) {
62 var absoluteFilePath
= path
.resolve(gBasePath
, filePath
);
64 if (absoluteFilePath
.indexOf(gBasePath
) !== 0) return null;
65 return absoluteFilePath
;
68 function get(req
, res
, next
) {
69 var filePath
= req
.params
[0];
70 var absoluteFilePath
= getAbsolutePath(filePath
);
71 if (!absoluteFilePath
) return next(new HttpError(403, 'Path not allowed'));
73 fs
.stat(absoluteFilePath
, function (error
, result
) {
74 if (error
) return next(new HttpError(404, error
));
76 debug('get', absoluteFilePath
);
78 if (result
.isFile()) return res
.sendfile(absoluteFilePath
);
79 if (result
.isDirectory()) return res
.status(200).send({ entries: fs
.readdirSync(absoluteFilePath
) });
81 return next(new HttpError(500, 'unsupported type'));
85 function put(req
, res
, next
) {
86 var filePath
= req
.params
[0];
88 if (!req
.files
.file
) return next(new HttpError(400, 'missing file'));
90 var absoluteFilePath
= getAbsolutePath(filePath
);
91 if (!absoluteFilePath
) return next(new HttpError(403, 'Path not allowed'));
93 fs
.stat(absoluteFilePath
, function (error
, result
) {
94 if (error
&& error
.code
!== 'ENOENT') return next(new HttpError(500, error
));
96 debug('put', absoluteFilePath
, req
.files
.file
);
98 if (result
&& result
.isDirectory()) return next(new HttpError(409, 'cannot put on directories'));
99 if (!result
|| result
.isFile()) {
100 return copyFile(req
.files
.file
.path
, absoluteFilePath
, function (error
) {
101 if (error
) return next(new HttpError(500, error
));
102 next(new HttpSuccess(201, {}));
106 return next(new HttpError(500, 'unsupported type'));
110 function del(req
, res
, next
) {
111 var filePath
= req
.params
[0];
112 var absoluteFilePath
= getAbsolutePath(filePath
);
113 if (!absoluteFilePath
) return next(new HttpError(404, 'Not found'));
114 if (absoluteFilePath
.slice(gBasePath
.length
) === '') return next(new HttpError(403, 'Forbidden'));
116 fs
.stat(absoluteFilePath
, function (error
, result
) {
117 if (error
) return next(new HttpError(404, error
));
119 rm(absoluteFilePath
, function (error
, result
) {
120 if (error
) return next(new HttpError(500, 'Unable to remove'));
121 next(new HttpSuccess(200, { entries: result
}));