Add files page
This commit is contained in:
1 parent
f1c3e21ba3
commit
41229ffb85
12 files changed
+521
-8
No files matched your search
@@ -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;
|
||||
@@ -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
@@ -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 => {
|
||||
|
||||
@@ -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;
|
||||
@@ -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());
|
||||
|
||||
|
||||
Reference in new issue
Block a user