Logger & server

This commit is contained in:
Gleb Koval 2021-07-07 19:46:26 +01:00
parent 88f6a29aa9
commit cf5b1a2ce2
No known key found for this signature in database
GPG Key ID: 120F2F6DA9D995FB
2 changed files with 89 additions and 28 deletions

View File

@ -1,8 +1,12 @@
export enum Permissions {
ALL = "*",
VIEW_PROFILE = "view_profile",
VIEW = "view",
ADD_PROFILE = "add_profile",
MANAGE_PERMISSIONS = "manage_permissions"
REMOVE_PROFILE = "remove_profile",
VIEW_USERS = "view_users",
ADD_USER = "add_user",
EDIT_USER = "edit_user",
REMOVE_USER = "remove_user"
}
/**

View File

@ -8,10 +8,17 @@ import { hash } from "bcrypt";
import { log } from "./logger";
import { Permissions } from "./lib/permissions";
const { PORT, NODE_ENV, DB_USERNAME, DB_PASSWORD, DB_URL, DB_NAME, API_KEY } =
process.env;
export const {
PORT,
NODE_ENV,
DB_USERNAME,
DB_PASSWORD,
DB_URL,
DB_NAME,
API_KEY
} = process.env;
const dev = NODE_ENV === "development";
const db = arangojs({
export const db = arangojs({
auth: {
username: DB_USERNAME || "root",
password: DB_PASSWORD
@ -19,34 +26,83 @@ const db = arangojs({
url: DB_URL || "http://127.0.0.1:8529",
databaseName: DB_NAME || "sbdatatracker"
});
const saltRounds = 10;
export const saltRounds = 9;
export const accessTokenExpire = 1000 * 60 * 20;
export const refreshTokenExpire = 1000 * 60 * 60 * 24 * 7;
const delay = 3 * 60 * 1000;
const intervalFunc = async (db: Database) => {
const cnf = db.collection("config");
const users = db.collection("users");
const sessions = db.collection("sessions");
if (!(await cnf.exists())) {
await cnf.create();
await cnf.create({
schema: {
rule: {
properties: {
type: { type: "string" },
data: { type: "object" }
},
required: ["type", "data"]
}
}
});
}
if (!(await users.exists())) {
await users.create();
await users.create({
schema: {
rule: {
properties: {
username: { type: "string" },
password: { type: "string" },
permissions: {
type: "array",
items: { type: "string" }
}
},
required: ["username", "permissions"]
}
}
});
await users.save({
username: DB_USERNAME,
username: DB_USERNAME || "root",
password: await hash(DB_PASSWORD || "SBDataTracker", saltRounds),
forceChangePassword: true,
permissions: [Permissions.ALL]
});
await users.save({
username: "_guest",
permissions: [Permissions.VIEW_PROFILE]
permissions: [Permissions.VIEW]
});
}
if (!(await sessions.exists())) {
await sessions.create({
schema: {
rule: {
properties: {
token: { type: "string" },
exp: { type: "number" },
type: { type: "string" },
user: { type: "string" }
},
required: ["token", "exp", "type", "user"]
}
}
});
}
// Delete expired sessions
const now = Date.now();
await db.query(aql`
FOR doc in ${sessions}
FILTER doc.exp <= ${now}
REMOVE doc in ${sessions}
`);
const cursor = await db.query(
aql`
FOR doc IN ${cnf}
FILTER doc.type == "tracker"
RETURN doc
RETURN { _key: doc._key }
`,
{
count: true
@ -65,28 +121,29 @@ const intervalFunc = async (db: Database) => {
let counter = 0;
let interval: NodeJS.Timeout;
const iterate = async () => {
if (++counter >= (cursor.count as number)) clearInterval(interval);
try {
if (++counter >= cursor.count!) clearInterval(interval);
const { _key, profile } = await cursor.next();
if (profile) {
const col = db.collection(`c${profile}`);
if (!(await col.exists())) col.create();
await col.save(await log(API_KEY || "", profile));
} else {
console.warn(
`Configuration entry '${_key}' with type 'tracker' has no "profile" value`
);
const { _key: profile } = await cursor.next();
if (profile) {
const col = db.collection(`c${profile}`);
if (!(await col.exists())) col.create();
console.log(`${new Date()}\tLogging '${profile}'`);
await col.save(await log(API_KEY || "", profile));
} else {
console.warn(
`Configuration entry '${profile}' with type 'tracker' has no "profile" value`
);
}
} catch (e) {
console.error(e);
}
};
// Separated into setInterval and a setTimeout so when the script is started,
// immediately at least one profile is logged. This is useful for debugging
// since you don't have to wait for up to 3 minutes to pass.
if ((cursor.count as number) > 1)
interval = setInterval(
iterate,
delay / ((cursor.count as number) - 1)
);
if (cursor.count! > 1)
interval = setInterval(iterate, delay / (cursor.count! - 1));
setTimeout(iterate);
}
};