refactor(rest) add get, put, delete

This commit is contained in:
coderaiser 2014-03-05 07:15:02 -05:00
parent ae4cf5bfb0
commit c8ccbaade9
4 changed files with 221 additions and 181 deletions

View file

@ -16,14 +16,15 @@
var main = global.cloudcmd.main,
fs = main.fs,
path = main.path,
Hash = main.hash,
crypto = main.crypto,
Util = main.util,
pipe = main.pipe,
CloudFunc = main.cloudfunc,
dir = main.dir,
diff = main.diff,
time = main.time,
onFSGet = main.srvrequire('rest/fs/get').onGet,
onFSPut = main.srvrequire('rest/fs/put').onPut,
onDelete = main.srvrequire('rest/fs/delete').onDelete,
JSONDIR = main.JSONDIR,
OK = 200,
sendError = main.sendError,
@ -33,8 +34,6 @@
}),
fse = main.require('fs-extra') || {
remove : fs.rmdir.bind(fs),
mkdirs : fs.mkdir.bind(fs),
copy : function(from, to, callback) {
pipe.create({
from : from,
@ -179,181 +178,6 @@
return ret;
}
function onFSPut(name, query, readStream, callback) {
var func = Util.retExec(callback),
baseName = path.basename(name);
switch(query) {
case 'dir':
fse.mkdirs(name, function(error) {
var msg;
if (!error)
msg = CloudFunc.formatMsg('make dir', name);
func(error, msg);
});
break;
default:
pipe.create({
read : readStream,
to : name,
callback : function(error) {
var msg;
if (!error)
msg = CloudFunc.formatMsg('save', baseName);
func(error, msg);
}
});
break;
case 'patch':
getBody(readStream, function(patch) {
fs.readFile(name, 'utf8', read);
function read(error, data) {
var diffResult;
if (error)
func(error);
else {
error = Util.tryCatchLog(function() {
diffResult = diff.applyPatch(data, patch);
});
if (diffResult && !error)
fs.writeFile(name, diffResult, write);
else {
msg = CloudFunc.formatMsg('patch', baseName, 'fail');
func(null, msg);
}
}
}
function write(name, error) {
var msg;
if (!error)
msg = CloudFunc.formatMsg('patch', baseName);
func(error, msg);
}
});
break;
}
}
function onDelete(name, files, query, callback) {
var i, n, onStat, isDirFunc,
assync = 0,
rmFile = fs.unlink.bind(fs),
rmDir = fse.remove.bind(fse),
func = Util.retExec(callback);
switch(query) {
default:
rmFile(name, func);
break;
case 'dir':
rmDir(name, func);
break;
case 'files':
n = files && files.length,
dir = name;
onIsDir = function(name, error, isDir) {
var log = Util.log.bind(Util);
++assync;
if (error)
func(error);
else {
if (isDir)
rmDir(name, log);
else
rmFile(name, log);
if (assync === n)
func();
}
};
for (i = 0; i < n; i ++) {
name = dir + files[i];
isDirFunc = Util.bind(onIsDir, name);
dir.isDir(name, isDirFunc);
Util.log(name);
}
break;
}
}
function onFSGet(query, name, callback) {
var error, hash,
func = Util.retExec(callback);
switch (query) {
case 'size':
dir.getSize(name, function(error, size) {
if (!error)
size = CloudFunc.getShortSize(size);
func(error, size);
});
break;
case 'time':
time.get(name, function(error, time) {
var timeStr;
if (!error)
timeStr = time.toString();
func(error, timeStr);
});
break;
case 'hash':
hash = Hash.create();
if (!hash) {
error = 'not suported, try update node';
error = CloudFunc.formatMsg('hash', error, 'error');
func(error);
} else
pipe.create({
from : name,
write : hash,
callback : function (error) {
var hex;
if (!error)
hash = hash.get();
func(error, hash);
}
});
break;
default:
dir.isDir(name, function(error, isDir) {
var getDirContent = main.commander.getDirContent;
if (isDir && !error)
getDirContent(name, func);
else
func(error, null, !isDir);
});
break;
}
}
/**
* process data on GET request
*

View file

@ -0,0 +1,60 @@
(function(){
'use strict';
var main = global.cloudcmd.main,
fs = require('fs'),
Util = main.util,
fse = main.require('fs-extra') || {
remove : fs.rmdir.bind(fs),
};
exports.onDelete = onDelete;
function onDelete(name, files, query, callback) {
var i, n, onStat, isDirFunc,
assync = 0,
rmFile = fs.unlink.bind(fs),
rmDir = fse.remove.bind(fse),
func = Util.retExec(callback);
switch(query) {
default:
rmFile(name, func);
break;
case 'dir':
rmDir(name, func);
break;
case 'files':
n = files && files.length,
dir = name;
onIsDir = function(name, error, isDir) {
var log = Util.log.bind(Util);
++assync;
if (error)
func(error);
else {
if (isDir)
rmDir(name, log);
else
rmFile(name, log);
if (assync === n)
func();
}
};
for (i = 0; i < n; i ++) {
name = dir + files[i];
isDirFunc = Util.bind(onIsDir, name);
dir.isDir(name, isDirFunc);
Util.log(name);
}
break;
}
}
})();

73
lib/server/rest/fs/get.js Normal file
View file

@ -0,0 +1,73 @@
(function() {
'use strict';
var main = global.cloudcmd.main,
Hash = main.hash,
dir = main.dir,
time = main.time,
pipe = main.pipe,
CloudFunc = main.cloudfunc,
Util = main.util;
exports.onGet = onGet;
function onGet(query, name, callback) {
var error, hash,
func = Util.retExec(callback);
switch (query) {
case 'size':
dir.getSize(name, function(error, size) {
if (!error)
size = CloudFunc.getShortSize(size);
func(error, size);
});
break;
case 'time':
time.get(name, function(error, time) {
var timeStr;
if (!error)
timeStr = time.toString();
func(error, timeStr);
});
break;
case 'hash':
hash = Hash.create();
if (!hash) {
error = 'not suported, try update node';
error = CloudFunc.formatMsg('hash', error, 'error');
func(error);
} else
pipe.create({
from : name,
write : hash,
callback : function (error) {
var hex;
if (!error)
hash = hash.get();
func(error, hash);
}
});
break;
default:
dir.isDir(name, function(error, isDir) {
var getDirContent = main.commander.getDirContent;
if (isDir && !error)
getDirContent(name, func);
else
func(error, null, !isDir);
});
break;
}
}
})();

83
lib/server/rest/fs/put.js Normal file
View file

@ -0,0 +1,83 @@
(function(){
'use strict';
var main = global.cloudcmd.main,
Util = main.util,
pipe = main.pipe,
path = require('path'),
fs = require('fs'),
diff = main.diff,
CloudFunc = main.cloudfunc,
fse = main.require('fs-extra') || {
mkdirs : fs.mkdir.bind(fs),
};
exports.onPut = onPut;
function onPut(name, query, readStream, callback) {
var func = Util.retExec(callback),
baseName = path.basename(name);
switch(query) {
case 'dir':
fse.mkdirs(name, function(error) {
var msg;
if (!error)
msg = CloudFunc.formatMsg('make dir', name);
func(error, msg);
});
break;
default:
pipe.create({
read : readStream,
to : name,
callback : function(error) {
var msg;
if (!error)
msg = CloudFunc.formatMsg('save', baseName);
func(error, msg);
}
});
break;
case 'patch':
getBody(readStream, function(patch) {
fs.readFile(name, 'utf8', read);
function read(error, data) {
var diffResult;
if (error)
func(error);
else {
error = Util.tryCatchLog(function() {
diffResult = diff.applyPatch(data, patch);
});
if (diffResult && !error)
fs.writeFile(name, diffResult, write);
else {
msg = CloudFunc.formatMsg('patch', baseName, 'fail');
func(null, msg);
}
}
}
function write(name, error) {
var msg;
if (!error)
msg = CloudFunc.formatMsg('patch', baseName);
func(error, msg);
}
});
break;
}
}
})();