Add files page

This commit is contained in:
Shweelan Samson authored and Zaid Abdulla committed 2018-12-26 00:22:07 -08:00
1 parent f1c3e21ba3
commit 41229ffb85
12 files changed
+521 -8

No files matched your search

+19
View File
@@ -335,9 +335,28 @@ function putResource(resource, id, data) {
});
}
function putFile(id, metadata, fileStream) {
return new Promise((resolve, reject) => {
let options = url.parse(
`${config.server.nbi}files/${encodeURIComponent(id)}`
);
options.method = "PUT";
options.headers = Object.assign({}, metadata);
let _http = options.protocol === "https:" ? https : http;
let req = _http.request(options, res => {
res.resume();
if (res.statusCode === 201) return resolve();
else return reject(new Error(`Unexpected status code ${res.statusCode}`));
});
fileStream.pipe(req);
});
}
exports.postTasks = postTasks;
exports.deleteResource = deleteResource;
exports.putResource = putResource;
exports.updateTags = updateTags;
exports.filterToMongoQuery = filterToMongoQuery;
exports.ping = ping;
exports.putFile = putFile;
+55
View File
@@ -351,6 +351,61 @@ for (let [resource, flags] of Object.entries(resources)) {
});
}
router.put("/files/:id", async (ctx, next) => {
const resource = "files";
const id = ctx.params.id;
const log = {
message: `Upload ${resource}`,
context: ctx,
id: id
};
const authorizer = ctx.state.authorizer;
if (!authorizer.hasAccess(resource, 3)) {
logUnauthorizedWarning(log);
return next();
}
let metadata = {
fileType: ctx.request.headers["metadata.filetype"] || "",
oui: ctx.request.headers["metadata.oui"] || "",
productClass: ctx.request.headers["metadata.productclass"] || "",
version: ctx.request.headers["metadata.version"] || ""
};
const validate = authorizer.getValidator(resource, metadata);
if (!validate("put")) {
logUnauthorizedWarning(log);
return (ctx.status = 403);
}
let err = await apiFunctions.putFile(id, metadata, ctx.req);
if (err) {
log.message += " failed";
logger.accessWarn(log);
ctx.body = err;
return (ctx.status = 400);
}
log.metadata = metadata;
logger.accessInfo(log);
db.putAudit({
username: ctx.state.user.username,
action: "put",
objectType: resource,
objectId: id
}).catch(err => {
setTimeout(() => {
throw err;
}, 0);
});
ctx.body = "";
});
router.post("/devices/:id/tasks", async (ctx, next) => {
const log = {
message: "Commit tasks",
+7 -1
View File
@@ -17,7 +17,9 @@ const RESOURCE_DB = {
files: "genieacs"
};
const RESOURCE_COLLECTION = {};
const RESOURCE_COLLECTION = {
files: "fs.files"
};
function getClient() {
if (!_clientPromise)
@@ -91,6 +93,8 @@ function query(resource, filter, options, callback) {
docs = docs.map(d => mongodbFunctions.flattenTask(d));
else if (resource === "presets")
docs = docs.map(d => mongodbFunctions.flattenPreset(d));
else if (resource === "files")
docs = docs.map(d => mongodbFunctions.flattenFile(d));
return resolve(docs);
});
else
@@ -104,6 +108,8 @@ function query(resource, filter, options, callback) {
doc = mongodbFunctions.flattenTask(doc);
else if (resource === "presets")
doc = mongodbFunctions.flattenPreset(doc);
else if (resource === "files")
doc = mongodbFunctions.flattenFile(doc);
callback(doc);
},
err => {
+13
View File
@@ -457,6 +457,18 @@ function flattenPreset(preset) {
return p;
}
function flattenFile(file) {
let f = {};
f["_id"] = file["_id"];
if (file.metadata) {
f["metadata.fileType"] = file.metadata.fileType || "";
f["metadata.oui"] = file.metadata.oui || "";
f["metadata.productClass"] = file.metadata.productClass || "";
f["metadata.version"] = file.metadata.version || "";
}
return f;
}
function preProcessPreset(data) {
let preset = Object.assign({}, data);
preset.precondition = preset.precondition
@@ -512,6 +524,7 @@ exports.flattenDevice = flattenDevice;
exports.flattenFault = flattenFault;
exports.flattenTask = flattenTask;
exports.flattenPreset = flattenPreset;
exports.flattenFile = flattenFile;
exports.preProcessPreset = preProcessPreset;
exports.preProcessProvision = preProcessProvision;
exports.preProcessVirtualParameters = preProcessVirtualParameters;
+7
View File
@@ -128,6 +128,13 @@ router.post("/logout", async ctx => {
});
});
koa.use(async (ctx, next) => {
if (ctx.request.type === "application/octet-stream")
ctx.disableBodyParser = true;
return next();
});
koa.use(koaBodyParser());
router.use("/api", api.routes(), api.allowedMethods());