ai-adventure-labs/server/database/index.js
2025-08-17 17:55:23 +03:00

90 lines
2.3 KiB
JavaScript

const { Sequelize } = require("sequelize");
const dbModel = require("./dbModel");
const logger = require("../logger");
class DatabaseCache {
async users (rows, table) {
// Add root user only where root user is activated
if (global.config.rootuser.activated) {
const isRootHasOnDB = rows.find(x => x.username === global.config.rootuser.login);
const rootLevel = 5; // TODO: replace it to AccessLevel.root in future
if (!isRootHasOnDB) {
await table.create({
username: global.config.rootuser.login,
accessLevel: rootLevel,
password: "",
});
return await this.users((
await table.findAll()
), table);
} else if (!rows.find(x => x.username === global.config.rootuser.login && x.accessLevel.code === rootLevel)) {
throw new Error(`Username ${
global.config.rootuser.login
} is busy`);
}
}
this.users.rows = rows;
this.users.byUsername = new Object();
this.users.byId = new Object();
for (let row of rows) {
this.users.byUsername[row.username] = row;
this.users.byId[row.id] = row;
}
// Add user info
this.users.add = async (row, isCreate = false) => {
if (isCreate)
await table.create(row);
let addedData = null;
if (row.username)
addedData = await table.findAll({
where: {
username: row.username
}
})[0];
else if (row.id)
addedData = await table.findAll({
where: {
id: row.id
}
})[0];
if (!addedData) throw new Error("Invalid row information");
this.users.rows.push(addedData);
// By keys
this.users.byUsername[addedData.username] = addedData;
this.users.byId[addedData.id] = addedData;
}
}
}
class Database {
constructor(sequlizeData) {
this.sequlize = new Sequelize(sequlizeData);
}
async init(fromHandler = false) {
global.server.toggleLock(true);
this.cache = new DatabaseCache();
await dbModel(this.sequlize, this);
global.server.toggleLock(false);
if (!fromHandler)
global.server.on("config.update", async ({
oldConfig, newConfig
}) => {
if (JSON.stringify(oldConfig.database) !== JSON.stringify(newConfig.database))
await this.init(true);
});
}
// Return ROW of 'users' table by username
async getUserRowByName (name) {
return this.cache.users.byUsername[name];
}
}
module.exports = Database;