]>
git.immae.eu Git - perso/Immae/Projets/Nodejs/Surfer.git/blob - src/files.js
3 var fs
= require('fs'),
4 path
= require('path'),
6 debug
= require('debug')('files'),
7 mkdirp
= require('mkdirp'),
8 HttpError
= require('connect-lastmile').HttpError
,
9 HttpSuccess
= require('connect-lastmile').HttpSuccess
;
13 exports
= module
.exports = function (basePath
) {
23 // http://stackoverflow.com/questions/11293857/fastest-way-to-copy-file-in-node-js
24 function copyFile(source
, target
, cb
) {
28 mkdirp(path
.dirname(target
), function (error
) {
29 if (error
) return cb(error
);
31 var rd
= fs
.createReadStream(source
);
32 rd
.on("error", function(err
) {
36 var wr
= fs
.createWriteStream(target
);
37 wr
.on("error", function(err
) {
41 wr
.on("close", function(ex
) {
56 function getAbsolutePath(filePath
) {
57 var absoluteFilePath
= path
.resolve(gBasePath
, filePath
);
59 if (absoluteFilePath
.indexOf(gBasePath
) !== 0) return null;
60 return absoluteFilePath
;
63 function get(req
, res
, next
) {
64 var filePath
= req
.params
[0];
65 var absoluteFilePath
= getAbsolutePath(filePath
);
66 if (!absoluteFilePath
) return next(new HttpError(403, 'Path not allowed'));
68 fs
.stat(absoluteFilePath
, function (error
, result
) {
69 if (error
) return next(new HttpError(404, error
));
71 debug('get', absoluteFilePath
);
73 if (result
.isFile()) return res
.sendFile(absoluteFilePath
);
74 if (result
.isDirectory()) return res
.status(200).send({ entries: fs
.readdirSync(absoluteFilePath
) });
76 return next(new HttpError(500, 'unsupported type'));
80 function put(req
, res
, next
) {
81 var filePath
= req
.params
[0];
83 if (!req
.files
.file
) return next(new HttpError(400, 'missing file'));
85 var absoluteFilePath
= getAbsolutePath(filePath
);
86 if (!absoluteFilePath
) return next(new HttpError(403, 'Path not allowed'));
88 fs
.stat(absoluteFilePath
, function (error
, result
) {
89 if (error
&& error
.code
!== 'ENOENT') return next(new HttpError(500, error
));
91 debug('put', absoluteFilePath
, req
.files
.file
);
93 if (result
&& result
.isDirectory()) return next(new HttpError(409, 'cannot put on directories'));
94 if (!result
|| result
.isFile()) {
95 return copyFile(req
.files
.file
.path
, absoluteFilePath
, function (error
) {
96 if (error
) return next(new HttpError(500, error
));
97 next(new HttpSuccess(201, {}));
101 return next(new HttpError(500, 'unsupported type'));
105 function del(req
, res
, next
) {
106 var filePath
= req
.params
[0];
107 var absoluteFilePath
= getAbsolutePath(filePath
);
108 if (!absoluteFilePath
) return next(new HttpError(404, 'Not found'));
109 if (absoluteFilePath
.slice(gBasePath
.length
) === '') return next(new HttpError(403, 'Forbidden'));
111 fs
.stat(absoluteFilePath
, function (error
, result
) {
112 if (error
) return next(new HttpError(404, error
));
114 rm(absoluteFilePath
, function (error
, result
) {
115 if (error
) return next(new HttpError(500, 'Unable to remove'));
116 next(new HttpSuccess(200, { entries: result
}));