Introduce ESLint and Prettier

This commit is contained in:
Zaid Abdulla committed 2018-08-24 05:31:22 -07:00
1 parent 9c943d0bbf
commit e494bdca8a
26 files changed
+1585 -1594

No files matched your search

+226 -216
View File
@@ -31,22 +31,22 @@ const cache = require("./cache");
const VERSION = require("../package.json").version;
const DEVICE_TASKS_REGEX = /^\/devices\/([a-zA-Z0-9\-\_\%]+)\/tasks\/?$/;
const TASKS_REGEX = /^\/tasks\/([a-zA-Z0-9\-\_\%]+)(\/[a-zA-Z_]*)?$/;
const TAGS_REGEX = /^\/devices\/([a-zA-Z0-9\-\_\%]+)\/tags\/([a-zA-Z0-9\-\_\%]+)\/?$/;
const PRESETS_REGEX = /^\/presets\/([a-zA-Z0-9\-\_\%]+)\/?$/;
const OBJECTS_REGEX = /^\/objects\/([a-zA-Z0-9\-\_\%]+)\/?$/;
const FILES_REGEX = /^\/files\/([a-zA-Z0-9\%\!\*\'\(\)\;\:\@\&\=\+\$\,\?\#\[\]\-\_\.\~]+)\/?$/;
const PING_REGEX = /^\/ping\/([a-zA-Z0-9\-\_\.\:]+)\/?$/;
const DEVICE_TASKS_REGEX = /^\/devices\/([a-zA-Z0-9\-_%]+)\/tasks\/?$/;
const TASKS_REGEX = /^\/tasks\/([a-zA-Z0-9\-_%]+)(\/[a-zA-Z_]*)?$/;
const TAGS_REGEX = /^\/devices\/([a-zA-Z0-9\-_%]+)\/tags\/([a-zA-Z0-9\-_%]+)\/?$/;
const PRESETS_REGEX = /^\/presets\/([a-zA-Z0-9\-_%]+)\/?$/;
const OBJECTS_REGEX = /^\/objects\/([a-zA-Z0-9\-_%]+)\/?$/;
const FILES_REGEX = /^\/files\/([a-zA-Z0-9%!*'();:@&=+$,?#[\]\-_.~]+)\/?$/;
const PING_REGEX = /^\/ping\/([a-zA-Z0-9\-_.:]+)\/?$/;
const QUERY_REGEX = /^\/([a-zA-Z0-9_]+)\/?$/;
const DELETE_DEVICE_REGEX = /^\/devices\/([a-zA-Z0-9\-\_\%]+)\/?$/;
const PROVISIONS_REGEX = /^\/provisions\/([a-zA-Z0-9\-\_\%]+)\/?$/;
const VIRTUAL_PARAMETERS_REGEX = /^\/virtual_parameters\/([a-zA-Z0-9\-\_\%]+)\/?$/;
const FAULTS_REGEX = /^\/faults\/([a-zA-Z0-9\-\_\%\:]+)\/?$/;
const DELETE_DEVICE_REGEX = /^\/devices\/([a-zA-Z0-9\-_%]+)\/?$/;
const PROVISIONS_REGEX = /^\/provisions\/([a-zA-Z0-9\-_%]+)\/?$/;
const VIRTUAL_PARAMETERS_REGEX = /^\/virtual_parameters\/([a-zA-Z0-9\-_%]+)\/?$/;
const FAULTS_REGEX = /^\/faults\/([a-zA-Z0-9\-_%:]+)\/?$/;
function throwError(err, httpResponse) {
if (httpResponse) {
httpResponse.writeHead(500, {"Connection": "close"});
httpResponse.writeHead(500, { Connection: "close" });
httpResponse.end(`${err.name}: ${err.message}`);
}
throw err;
@@ -57,7 +57,7 @@ function listener(request, response) {
let bytes = 0;
response.setHeader("GenieACS-Version", VERSION);
request.addListener("data", (chunk) => {
request.addListener("data", chunk => {
chunks.push(chunk);
bytes += chunk.length;
});
@@ -77,75 +77,73 @@ function listener(request, response) {
const body = getBody();
const urlParts = url.parse(request.url, true);
if (PRESETS_REGEX.test(urlParts.pathname)) {
const presetName = querystring.unescape(PRESETS_REGEX.exec(urlParts.pathname)[1]);
const presetName = querystring.unescape(
PRESETS_REGEX.exec(urlParts.pathname)[1]
);
if (request.method === "PUT") {
const preset = JSON.parse(body);
preset._id = presetName;
db.presetsCollection.save(preset, (err) => {
if (err)
return throwError(err, response);
db.presetsCollection.save(preset, err => {
if (err) return throwError(err, response);
cache.del("presets_hash", (err) => {
if (err)
return throwError(err, response);
cache.del("presets_hash", err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
});
});
} else if (request.method === "DELETE") {
db.presetsCollection.remove({"_id": presetName}, (err) => {
if (err)
return throwError(err, response);
db.presetsCollection.remove({ _id: presetName }, err => {
if (err) return throwError(err, response);
cache.del("presets_hash", (err) => {
if (err)
return throwError(err, response);
cache.del("presets_hash", err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
});
});
} else {
response.writeHead(405, {"Allow": "PUT, DELETE"});
response.writeHead(405, { Allow: "PUT, DELETE" });
response.end("405 Method Not Allowed");
}
} else if (OBJECTS_REGEX.test(urlParts.pathname)) {
const objectName = querystring.unescape(OBJECTS_REGEX.exec(urlParts.pathname)[1]);
const objectName = querystring.unescape(
OBJECTS_REGEX.exec(urlParts.pathname)[1]
);
if (request.method === "PUT") {
const object = JSON.parse(body);
object._id = objectName;
db.objectsCollection.save(object, (err) => {
if (err)
return throwError(err, response);
db.objectsCollection.save(object, err => {
if (err) return throwError(err, response);
cache.del("presets_hash", (err) => {
if (err)
return throwError(err, response);
cache.del("presets_hash", err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
});
});
} else if (request.method === "DELETE") {
db.objectsCollection.remove({"_id": objectName}, (err) => {
if (err)
return throwError(err, response);
db.objectsCollection.remove({ _id: objectName }, err => {
if (err) return throwError(err, response);
cache.del("presets_hash", (err) => {
if (err)
return throwError(err, response);
cache.del("presets_hash", err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
});
});
} else {
response.writeHead(405, {"Allow": "PUT, DELETE"});
response.writeHead(405, { Allow: "PUT, DELETE" });
response.end("405 Method Not Allowed");
}
} else if (PROVISIONS_REGEX.test(urlParts.pathname)) {
const provisionName = querystring.unescape(PROVISIONS_REGEX.exec(urlParts.pathname)[1]);
const provisionName = querystring.unescape(
PROVISIONS_REGEX.exec(urlParts.pathname)[1]
);
if (request.method === "PUT") {
const object = {
_id: provisionName,
@@ -160,37 +158,35 @@ function listener(request, response) {
return;
}
db.provisionsCollection.save(object, (err) => {
if (err)
return throwError(err, response);
db.provisionsCollection.save(object, err => {
if (err) return throwError(err, response);
cache.del("presets_hash", (err) => {
if (err)
return throwError(err, response);
cache.del("presets_hash", err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
});
});
} else if (request.method === "DELETE") {
db.provisionsCollection.remove({"_id": provisionName}, (err) => {
if (err)
return throwError(err, response);
db.provisionsCollection.remove({ _id: provisionName }, err => {
if (err) return throwError(err, response);
cache.del("presets_hash", (err) => {
if (err)
return throwError(err, response);
cache.del("presets_hash", err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
});
});
} else {
response.writeHead(405, {"Allow": "PUT, DELETE"});
response.writeHead(405, { Allow: "PUT, DELETE" });
response.end("405 Method Not Allowed");
}
} else if (VIRTUAL_PARAMETERS_REGEX.test(urlParts.pathname)) {
const virtualParameterName = querystring.unescape(VIRTUAL_PARAMETERS_REGEX.exec(urlParts.pathname)[1]);
const virtualParameterName = querystring.unescape(
VIRTUAL_PARAMETERS_REGEX.exec(urlParts.pathname)[1]
);
if (request.method === "PUT") {
const object = {
_id: virtualParameterName,
@@ -205,33 +201,32 @@ function listener(request, response) {
return;
}
db.virtualParametersCollection.save(object, (err) => {
if (err)
return throwError(err, response);
db.virtualParametersCollection.save(object, err => {
if (err) return throwError(err, response);
cache.del("presets_hash", (err) => {
if (err)
return throwError(err, response);
cache.del("presets_hash", err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
});
});
} else if (request.method === "DELETE") {
db.virtualParametersCollection.remove({"_id": virtualParameterName}, (err) => {
if (err)
return throwError(err, response);
db.virtualParametersCollection.remove(
{ _id: virtualParameterName },
err => {
if (err) return throwError(err, response);
cache.del("presets_hash", (err) => {
if (err)
return throwError(err, response);
cache.del("presets_hash", err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
});
});
response.writeHead(200);
response.end();
});
}
);
} else {
response.writeHead(405, {"Allow": "PUT, DELETE"});
response.writeHead(405, { Allow: "PUT, DELETE" });
response.end("405 Method Not Allowed");
}
} else if (TAGS_REGEX.test(urlParts.pathname)) {
@@ -240,51 +235,48 @@ function listener(request, response) {
const tag = querystring.unescape(r[2]);
if (request.method === "POST") {
db.devicesCollection.update(
{"_id": deviceId},
{"$addToSet": {"_tags": tag}},
{safe: true},
(err) => {
if (err)
return throwError(err, response);
{ _id: deviceId },
{ $addToSet: { _tags: tag } },
{ safe: true },
err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
}
);
} else if (request.method === "DELETE") {
db.devicesCollection.update(
{"_id": deviceId},
{"$pull": {"_tags": tag}},
{safe: true},
(err) => {
if (err)
return throwError(err, response);
{ _id: deviceId },
{ $pull: { _tags: tag } },
{ safe: true },
err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
}
);
} else {
response.writeHead(405, {"Allow": "POST, DELETE"});
response.writeHead(405, { Allow: "POST, DELETE" });
response.end("405 Method Not Allowed");
}
} else if (FAULTS_REGEX.test(urlParts.pathname)) {
if (request.method === "DELETE") {
const faultId = querystring.unescape(FAULTS_REGEX.exec(urlParts.pathname)[1]);
const faultId = querystring.unescape(
FAULTS_REGEX.exec(urlParts.pathname)[1]
);
const deviceId = faultId.split(":", 1)[0];
const channel = faultId.slice(deviceId.length + 1);
db.faultsCollection.remove({_id: faultId}, (err) => {
if (err)
return throwError(err, response);
db.faultsCollection.remove({ _id: faultId }, err => {
if (err) return throwError(err, response);
if (channel.startsWith("task_")) {
const objId = new mongodb.ObjectID(channel.slice(5));
return db.tasksCollection.remove({_id: objId}, (err) => {
if (err)
return throwError(err, response);
return db.tasksCollection.remove({ _id: objId }, err => {
if (err) return throwError(err, response);
cache.del(`${deviceId}_tasks_faults_operations`, (err) => {
if (err)
return throwError(err, response);
cache.del(`${deviceId}_tasks_faults_operations`, err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
@@ -292,67 +284,81 @@ function listener(request, response) {
});
}
cache.del(`${deviceId}_tasks_faults_operations`, (err) => {
if (err)
return throwError(err, response);
cache.del(`${deviceId}_tasks_faults_operations`, err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
});
});
} else {
response.writeHead(405, {"Allow": "DELETE"});
response.writeHead(405, { Allow: "DELETE" });
response.end("405 Method Not Allowed");
}
} else if (DEVICE_TASKS_REGEX.test(urlParts.pathname)) {
if (request.method === "POST") {
const deviceId = querystring.unescape(DEVICE_TASKS_REGEX.exec(urlParts.pathname)[1]);
const deviceId = querystring.unescape(
DEVICE_TASKS_REGEX.exec(urlParts.pathname)[1]
);
if (body.length) {
const task = JSON.parse(body);
task.device = deviceId;
apiFunctions.insertTasks(task, (err) => {
if (err)
return throwError(err, response);
apiFunctions.insertTasks(task, err => {
if (err) return throwError(err, response);
cache.del(`${deviceId}_tasks_faults_operations`, (err) => {
if (err)
return throwError(err, response);
cache.del(`${deviceId}_tasks_faults_operations`, err => {
if (err) return throwError(err, response);
if (urlParts.query.connection_request != null) {
apiFunctions.connectionRequest(deviceId, (err) => {
apiFunctions.connectionRequest(deviceId, err => {
if (err) {
response.writeHead(202, err.message, {"Content-Type": "application/json"});
response.writeHead(202, err.message, {
"Content-Type": "application/json"
});
response.end(JSON.stringify(task));
return;
}
const DEVICE_ONLINE_THRESHOLD = config.get("DEVICE_ONLINE_THRESHOLD", deviceId);
apiFunctions.watchTask(deviceId, task._id, DEVICE_ONLINE_THRESHOLD, (err, status) => {
if (err)
return throwError(err, response);
const DEVICE_ONLINE_THRESHOLD = config.get(
"DEVICE_ONLINE_THRESHOLD",
deviceId
);
apiFunctions.watchTask(
deviceId,
task._id,
DEVICE_ONLINE_THRESHOLD,
(err, status) => {
if (err) return throwError(err, response);
if (status === "timeout") {
response.writeHead(202, "Task queued but not processed", {
"Content-Type": "application/json"
});
response.end(JSON.stringify(task));
} else if (status === "fault") {
db.tasksCollection.findOne({_id: task._id}, (err, task) => {
if (err)
return throwError(err, response);
if (status === "timeout") {
response.writeHead(
202,
"Task queued but not processed",
{
"Content-Type": "application/json"
}
);
response.end(JSON.stringify(task));
} else if (status === "fault") {
db.tasksCollection.findOne(
{ _id: task._id },
(err, task2) => {
if (err) return throwError(err, response);
response.writeHead(202, "Task faulted", {
response.writeHead(202, "Task faulted", {
"Content-Type": "application/json"
});
response.end(JSON.stringify(task2));
}
);
} else {
response.writeHead(200, {
"Content-Type": "application/json"
});
response.end(JSON.stringify(task));
});
} else {
response.writeHead(200, {
"Content-Type": "application/json"
});
response.end(JSON.stringify(task));
}
}
});
);
});
} else {
response.writeHead(202, {
@@ -364,7 +370,7 @@ function listener(request, response) {
});
} else if (urlParts.query.connection_request != null) {
// No task, send connection request only
apiFunctions.connectionRequest(deviceId, (err) => {
apiFunctions.connectionRequest(deviceId, err => {
if (err) {
response.writeHead(504);
response.end(`${err.name}: ${err.message}`);
@@ -378,7 +384,7 @@ function listener(request, response) {
response.end();
}
} else {
response.writeHead(405, {"Allow": "POST"});
response.writeHead(405, { Allow: "POST" });
response.end("405 Method Not Allowed");
}
} else if (TASKS_REGEX.test(urlParts.pathname)) {
@@ -388,63 +394,70 @@ function listener(request, response) {
if (!action || action === "/") {
if (request.method === "DELETE") {
db.tasksCollection.findOne(
{"_id": new mongodb.ObjectID(taskId)},
{"device": 1}, (err, task) => {
if (err)
return throwError(err, response);
{ _id: new mongodb.ObjectID(taskId) },
{ device: 1 },
(err, task) => {
if (err) return throwError(err, response);
if (!task) {
response.writeHead(404);
response.end("Task not found");
return;
if (!task) {
response.writeHead(404);
response.end("Task not found");
return;
}
const deviceId = task.device;
db.tasksCollection.remove(
{ _id: new mongodb.ObjectID(taskId) },
err => {
if (err) return throwError(err, response);
db.faultsCollection.remove(
{ _id: `${deviceId}:task_${taskId}` },
err => {
if (err) return throwError(err, response);
cache.del(`${deviceId}_tasks_faults_operations`, err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
});
}
);
}
);
}
const deviceId = task.device;
db.tasksCollection.remove(
{"_id": new mongodb.ObjectID(taskId)}, (err) => {
if (err)
return throwError(err, response);
db.faultsCollection.remove({_id: `${deviceId}:task_${taskId}`}, (err) => {
if (err)
return throwError(err, response);
cache.del(`${deviceId}_tasks_faults_operations`, (err) => {
if (err)
return throwError(err, response);
response.writeHead(200);
response.end();
});
});
});
});
);
} else {
response.writeHead(405, {"Allow": "PUT DELETE"});
response.writeHead(405, { Allow: "PUT DELETE" });
response.end("405 Method Not Allowed");
}
} else if (action === "/retry") {
if (request.method === "POST") {
db.tasksCollection.findOne({"_id": new mongodb.ObjectID(taskId)}, {"device": 1}, (err, task) => {
if (err)
return throwError(err, response);
db.tasksCollection.findOne(
{ _id: new mongodb.ObjectID(taskId) },
{ device: 1 },
(err, task) => {
if (err) return throwError(err, response);
const deviceId = task.device;
db.faultsCollection.remove({_id: `${deviceId}:task_${taskId}`}, (err) => {
if (err)
return throwError(err, response);
const deviceId = task.device;
db.faultsCollection.remove(
{ _id: `${deviceId}:task_${taskId}` },
err => {
if (err) return throwError(err, response);
cache.del(`${deviceId}_tasks_faults_operations`, (err) => {
if (err)
return throwError(err, response);
cache.del(`${deviceId}_tasks_faults_operations`, err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
});
});
});
response.writeHead(200);
response.end();
});
}
);
}
);
} else {
response.writeHead(405, {"Allow": "POST"});
response.writeHead(405, { Allow: "POST" });
response.end("405 Method Not Allowed");
}
} else {
@@ -452,7 +465,9 @@ function listener(request, response) {
response.end();
}
} else if (FILES_REGEX.test(urlParts.pathname)) {
const filename = querystring.unescape(FILES_REGEX.exec(urlParts.pathname)[1]);
const filename = querystring.unescape(
FILES_REGEX.exec(urlParts.pathname)[1]
);
if (request.method === "PUT") {
const metadata = {
fileType: request.headers.filetype,
@@ -463,17 +478,14 @@ function listener(request, response) {
const gs = new mongodb.GridStore(db.mongoDb, filename, filename, "w", {
metadata: metadata
});
gs.open((err, gs) => {
if (err)
return throwError(err, response);
gs.open(err => {
if (err) return throwError(err, response);
gs.write(body, (err) => {
if (err)
return throwError(err, response);
gs.write(body, err => {
if (err) return throwError(err, response);
gs.close((err) => {
if (err)
return throwError(err, response);
gs.close(err => {
if (err) return throwError(err, response);
response.writeHead(201);
response.end();
@@ -481,22 +493,21 @@ function listener(request, response) {
});
});
} else if (request.method === "DELETE") {
mongodb.GridStore.unlink(db.mongoDb, filename, (err) => {
if (err)
return throwError(err, response);
mongodb.GridStore.unlink(db.mongoDb, filename, err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
});
} else {
response.writeHead(405, {"Allow": "PUT, DELETE"});
response.writeHead(405, { Allow: "PUT, DELETE" });
response.end("405 Method Not Allowed");
}
} else if (PING_REGEX.test(urlParts.pathname)) {
const host = querystring.unescape(PING_REGEX.exec(urlParts.pathname)[1]);
childProcess.exec(`ping -w 1 -i 0.2 -c 3 ${host}`, (err, stdout) => {
if (err) {
response.writeHead(404, {"Cache-Control": "no-cache"});
response.writeHead(404, { "Cache-Control": "no-cache" });
response.end(`${err.name}: ${err.message}`);
return;
}
@@ -509,15 +520,16 @@ function listener(request, response) {
});
} else if (DELETE_DEVICE_REGEX.test(urlParts.pathname)) {
if (request.method !== "DELETE") {
response.writeHead(405, {"Allow": "DELETE"});
response.writeHead(405, { Allow: "DELETE" });
response.end("405 Method Not Allowed");
return;
}
const deviceId = querystring.unescape(DELETE_DEVICE_REGEX.exec(urlParts.pathname)[1]);
apiFunctions.deleteDevice(deviceId, (err) => {
if (err)
return throwError(err, response);
const deviceId = querystring.unescape(
DELETE_DEVICE_REGEX.exec(urlParts.pathname)[1]
);
apiFunctions.deleteDevice(deviceId, err => {
if (err) return throwError(err, response);
response.writeHead(200);
response.end();
@@ -528,13 +540,15 @@ function listener(request, response) {
// Convert to camel case
let i = collectionName.indexOf("_");
while (i++ >= 0) {
const up = i < collectionName.length ? collectionName[i].toUpperCase() : "";
collectionName = collectionName.slice(0, i - 1) + up + collectionName.slice(i + 1);
const up =
i < collectionName.length ? collectionName[i].toUpperCase() : "";
collectionName =
collectionName.slice(0, i - 1) + up + collectionName.slice(i + 1);
i = collectionName.indexOf("_", i);
}
if (request.method !== "GET" && request.method !== "HEAD") {
response.writeHead(405, {"Allow": "GET, HEAD"});
response.writeHead(405, { Allow: "GET, HEAD" });
response.end("405 Method Not Allowed");
return;
}
@@ -563,14 +577,14 @@ function listener(request, response) {
break;
case "tasks":
q = query.sanitizeQueryTypes(q, {
_id: (v) => new mongodb.ObjectID(v),
timestamp: (v) => new Date(v),
_id: v => new mongodb.ObjectID(v),
timestamp: v => new Date(v),
retries: Number
});
break;
case "faults":
q = query.sanitizeQueryTypes(q, {
timestamp: (v) => new Date(v),
timestamp: v => new Date(v),
retries: Number
});
}
@@ -582,7 +596,7 @@ function listener(request, response) {
projection[p.trim()] = 1;
}
const cur = collection.find(q, projection, {batchSize: 50});
const cur = collection.find(q, projection, { batchSize: 50 });
if (urlParts.query.sort) {
const s = JSON.parse(urlParts.query.sort);
@@ -590,27 +604,24 @@ function listener(request, response) {
for (let [k, v] of Object.entries(s)) {
if (k[k.lastIndexOf(".") + 1] !== "_" && collectionName === "devices")
sort[`${k}._value`] = v;
else
sort[k] = v;
else sort[k] = v;
}
cur.sort(sort);
}
if (urlParts.query.skip)
cur.skip(parseInt(urlParts.query.skip));
if (urlParts.query.skip) cur.skip(parseInt(urlParts.query.skip));
let limit;
if (urlParts.query.limit)
cur.limit(limit = parseInt(urlParts.query.limit));
cur.limit((limit = parseInt(urlParts.query.limit)));
cur.count(false, (err, total) => {
if (err)
return throwError(err);
if (err) return throwError(err);
response.writeHead(200, {
"Content-Type": "application/json",
"total": total
total: total
});
if (request.method === "HEAD") {
@@ -627,8 +638,7 @@ function listener(request, response) {
}
if (item) {
if (i++)
response.write(",\n");
if (i++) response.write(",\n");
response.write(JSON.stringify(item));
}