Refactor User and Role into data classes (#531)

Use the JSON data class pattern for User, Role, and PlayerStats and move
them into lib/src/data.  This means that User is purely data now and
can't reference role objects directly.  To make it possible easily check
permissions attached to roles and store data only visible on the
controller on user objects a ControllerUser type is introduced which is
linked with the UserManager and can therefore reference role objects
directly.

Resolves #525.
This commit is contained in:
Hornwitser authored and GitHub committed 2023-12-02 01:41:43 +01:00
1 parent f802e6ba67
commit e453a80155
37 files changed
+629 -613

No files matched your search

+35
View File
@@ -0,0 +1,35 @@
"use strict";
const assert = require("assert").strict;
const { ControllerUser, UserManager } = require("@clusterio/controller");
describe("controller/src/UserManager", function() {
describe("class ControllerUser", function() {
const userManager = new UserManager({});
it("should track online users", function() {
let user = ControllerUser.fromJSON({ name: "admin", roles: [1] });
userManager.users.set(user.name, user);
assert(!userManager.onlineUsers.has(user));
assert.deepEqual(user.instances, new Set());
userManager.notifyJoin(user, 12);
assert(userManager.onlineUsers.has(user));
assert.deepEqual(user.instances, new Set([12]));
userManager.notifyJoin(user, 8);
assert(userManager.onlineUsers.has(user));
assert.deepEqual(user.instances, new Set([12, 8]));
userManager.notifyLeave(user, 11);
assert(userManager.onlineUsers.has(user));
assert.deepEqual(user.instances, new Set([12, 8]));
userManager.notifyLeave(user, 12);
assert(userManager.onlineUsers.has(user));
assert.deepEqual(user.instances, new Set([8]));
userManager.notifyLeave(user, 8);
assert(!userManager.onlineUsers.has(user));
assert.deepEqual(user.instances, new Set());
});
});
});