ai-adventure-labs/server/api/utils/user.js
2025-08-17 17:55:23 +03:00

104 lines
2.0 KiB
JavaScript

/*
* Acces Levels:
* * -1 - banned
* * 0 - user
* * 1 - moderator
* * 2 - editor
* * 3 - admin
* * 4 - superadmin
* * 5 - root
*/
const ACCESS_LEVELS = {
"-1": "banned",
0: "user",
1: "helper",
2: "moderator",
3: "admin",
4: "superadmin",
5: "root",
};
class AccessLevel {
static validate (value) {
const access = Object.fromEntries(Object.keys(ACCESS_LEVELS)
.map(level => [level, true]));
return (
Number.isInteger(value) &&
access["" + value] === true
);
}
constructor (accessLevel) {
if (!this.__proto__.constructor.validate(accessLevel))
throw new Error(
`Invalid access level: ${accessLevel}`,
);
this.code = accessLevel;
}
get accessName () {
return ACCESS_LEVELS[""+this.code]
}
}
class User {
constructor (name, accessLevel) {
this.name = name;
if (accessLevel instanceof AccessLevel)
this.accessLevel = accessLevel;
else
this.accessLevel = new AccessLevel(accessLevel);
}
static async getUserByName(name) {
if (User.cache[name]) return User.cache[name];
if (
!!global.config.rootuser?.activated &&
name === global.config.rootuser.login
) {
const user = new User(name, 5);
User.cache[name] = user;
return user;
}
// TODO: Потом добавить чтение из БД
//return null;
const userdata = await global.database.getUserRowByName(name);
if (!userdata)
return null;
const user = new User(userdata.username, userdata.accessLevel);
User.cache[name] = user;
return user;
}
static getByToken(token) {
const user = global.authed.tokens[token];
return user ?? null;
}
getUserForAPI(getFullInfo = false, fields = "*") {
const getted = {
username: this.name,
accessLevel: this.accessLevel.code,
};
if (fields !== "*") {
const selected = Object.fromEntries(fields.split(/\s*,\s*/g).map(field => [field, true]));
for (let field in getted) {
if (!selected[field])
getted[field] = undefined;
}
}
return getted;
}
async getCharacters () {
return [];
}
}
User.cache = {};
module.exports = { User, AccessLevel };