mirror of https://gitee.com/bigwinds/arangodb
upload applications via web interface
This commit is contained in:
parent
93dc981252
commit
ae6b4be148
|
@ -45,10 +45,10 @@ var docus = new (require("lib/swagger").Swagger)();
|
||||||
* available for mounting.
|
* available for mounting.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
controller.post("/foxxes/fetch", function (req, res) {
|
controller.post("/foxxes/inspect", function (req, res) {
|
||||||
var content = JSON.parse(req.requestBody),
|
var content = JSON.parse(req.requestBody),
|
||||||
path = content.filename;
|
path = content.filename;
|
||||||
res.json(foxxes.fetch(path));
|
res.json(foxxes.inspect(path));
|
||||||
});
|
});
|
||||||
|
|
||||||
// .............................................................................
|
// .............................................................................
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*jslint indent: 2, nomen: true, maxlen: 100, sloppy: true, vars: true, white: true, plusplus: true */
|
/*jslint indent: 2, nomen: true, maxlen: 100, sloppy: true, vars: true, white: true, plusplus: true */
|
||||||
/*global Backbone, EJS, $, window, arangoHelper, templateEngine, _ */
|
/*global Backbone, EJS, $, window, arangoHelper, templateEngine, _, console */
|
||||||
|
|
||||||
window.ApplicationsView = Backbone.View.extend({
|
window.ApplicationsView = Backbone.View.extend({
|
||||||
el: '#content',
|
el: '#content',
|
||||||
|
@ -42,11 +42,30 @@ window.ApplicationsView = Backbone.View.extend({
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
async: false,
|
async: false,
|
||||||
url: "/_admin/aardvark/foxxes/fetch",
|
url: "/_admin/aardvark/foxxes/inspect",
|
||||||
data: res.responseText,
|
data: res.responseText,
|
||||||
contentType: "application/json"
|
contentType: "application/json"
|
||||||
}).done(function(res) {
|
}).done(function(res) {
|
||||||
|
// TODO: remove logs, report errors etc.
|
||||||
console.log("Pos:", res);
|
console.log("Pos:", res);
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
type: "POST",
|
||||||
|
async: false,
|
||||||
|
url: '/_admin/foxx/fetch',
|
||||||
|
data: JSON.stringify({
|
||||||
|
name: res.name,
|
||||||
|
version: res.version,
|
||||||
|
filename: res.filename
|
||||||
|
}),
|
||||||
|
processData: false
|
||||||
|
}).done(function (res) {
|
||||||
|
console.log(res);
|
||||||
|
// TODO: reload UI
|
||||||
|
}).fail(function (res) {
|
||||||
|
console.log(res);
|
||||||
|
});
|
||||||
|
|
||||||
}).fail(function(err) {
|
}).fail(function(err) {
|
||||||
console.log("Neg:", err);
|
console.log("Neg:", err);
|
||||||
});
|
});
|
||||||
|
|
|
@ -128,17 +128,111 @@ exports.Foxxes = function () {
|
||||||
return success;
|
return success;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Fetch a foxx from tmp zip file
|
// TODO: merge with functionality js/client/modules/org/arangodb/foxx/manager.js
|
||||||
this.fetch = function (path) {
|
this.repackZipFile = function (path) {
|
||||||
|
if (! fs.exists(path) || ! fs.isDirectory(path)) {
|
||||||
|
throw "'" + String(path) + "' is not a directory";
|
||||||
|
}
|
||||||
|
|
||||||
|
var tree = fs.listTree(path);
|
||||||
|
var files = [];
|
||||||
|
var i;
|
||||||
|
|
||||||
|
for (i = 0; i < tree.length; ++i) {
|
||||||
|
var filename = fs.join(path, tree[i]);
|
||||||
|
|
||||||
|
if (fs.isFile(filename)) {
|
||||||
|
files.push(tree[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (files.length === 0) {
|
||||||
|
throw "Directory '" + String(path) + "' is empty";
|
||||||
|
}
|
||||||
|
|
||||||
|
var tempFile = fs.getTempFile("downloads", false);
|
||||||
|
|
||||||
|
fs.zipFile(tempFile, path, files);
|
||||||
|
|
||||||
|
return tempFile;
|
||||||
|
};
|
||||||
|
|
||||||
|
// TODO: merge with functionality js/client/modules/org/arangodb/foxx/manager.js
|
||||||
|
this.inspectUploadedFile = function (filename) {
|
||||||
|
if (! fs.isFile(filename)) {
|
||||||
|
throw "Unable to find zip file";
|
||||||
|
}
|
||||||
|
|
||||||
|
var i;
|
||||||
|
var path = fs.getTempFile("zip", false);
|
||||||
|
|
||||||
|
fs.unzipFile(filename, path, false, true);
|
||||||
|
|
||||||
|
// .............................................................................
|
||||||
|
// locate the manifest file
|
||||||
|
// .............................................................................
|
||||||
|
|
||||||
|
var tree = fs.listTree(path).sort(function(a,b) {
|
||||||
|
return a.length - b.length;
|
||||||
|
});
|
||||||
|
|
||||||
|
var found;
|
||||||
|
var mf = "manifest.json";
|
||||||
|
var re = /[\/\\\\]manifest\.json$/; // Windows!
|
||||||
|
|
||||||
|
for (i = 0; i < tree.length && found === undefined; ++i) {
|
||||||
|
var tf = tree[i];
|
||||||
|
|
||||||
|
if (re.test(tf) || tf === mf) {
|
||||||
|
found = tf;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof found === "undefined") {
|
||||||
|
fs.removeDirectoryRecursive(path);
|
||||||
|
throw "Cannot find manifest file in zip file";
|
||||||
|
}
|
||||||
|
|
||||||
|
var mp;
|
||||||
|
|
||||||
|
if (found === mf) {
|
||||||
|
mp = ".";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mp = found.substr(0, found.length - mf.length - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
var manifest = JSON.parse(fs.read(fs.join(path, found)));
|
||||||
|
|
||||||
|
var absolutePath = this.repackZipFile(fs.join(path, mp));
|
||||||
|
|
||||||
|
var result = {
|
||||||
|
name : manifest.name,
|
||||||
|
version: manifest.version,
|
||||||
|
filename: absolutePath.substr(fs.getTempPath().length + 1)
|
||||||
|
};
|
||||||
|
|
||||||
|
fs.removeDirectoryRecursive(path);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Inspect a foxx in tmp zip file
|
||||||
|
this.inspect = function (path) {
|
||||||
var fullPath = fs.join(fs.getTempPath(), path);
|
var fullPath = fs.join(fs.getTempPath(), path);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return foxxmanager.fetch("zip", fullPath);
|
var result = this.inspectUploadedFile(fullPath);
|
||||||
} catch (e) {
|
fs.remove(fullPath);
|
||||||
require("console").log(e);
|
return result;
|
||||||
|
}
|
||||||
|
catch (e) {
|
||||||
|
require("console").log(e); // TODO
|
||||||
return {
|
return {
|
||||||
error: true,
|
error: true,
|
||||||
status: 500,
|
status: 500,
|
||||||
message: "Could not import the app."
|
message: "Could not import the app." // TODO: add more detailed error message. TODO: return an error
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue