104 lines
2.5 KiB
TypeScript
104 lines
2.5 KiB
TypeScript
import { pond } from "protobuf-ts/pond";
|
|
import { or } from "../utils/types";
|
|
import { cloneDeep } from "lodash";
|
|
|
|
const adminActions = [
|
|
"provision",
|
|
"upload-firmware",
|
|
"remove-devices",
|
|
"copy-token",
|
|
"recluse",
|
|
"pause-data"
|
|
];
|
|
|
|
const adminFeatures = [
|
|
"beta",
|
|
"billing",
|
|
"security",
|
|
"dev-channel",
|
|
"docs",
|
|
"maps",
|
|
"sleep",
|
|
"support",
|
|
"json",
|
|
"tasks",
|
|
"teams",
|
|
"developer",
|
|
"installer"
|
|
];
|
|
|
|
export class User {
|
|
public settings: pond.UserSettings = pond.UserSettings.create();
|
|
public status: pond.UserStatus = pond.UserStatus.create();
|
|
public permissions: pond.Permission[] = [];
|
|
public preferences: pond.UserPreferences = pond.UserPreferences.create();
|
|
|
|
public static create(pb?: pond.User): User {
|
|
let my = new User();
|
|
if (pb) {
|
|
my.settings = pond.UserSettings.fromObject(cloneDeep(or(pb.settings, {})));
|
|
my.status = pond.UserStatus.fromObject(cloneDeep(or(pb.status, {})));
|
|
my.permissions = cloneDeep(pb.permissions);
|
|
my.preferences = pond.UserPreferences.fromObject(cloneDeep(or(pb.preferences, {})));
|
|
}
|
|
return my;
|
|
}
|
|
|
|
public static any(data: any): User {
|
|
return User.create(pond.User.fromObject(cloneDeep(data)));
|
|
}
|
|
|
|
public empty(): boolean {
|
|
return this.id() === "";
|
|
}
|
|
|
|
public id(): string {
|
|
return this.settings.id;
|
|
}
|
|
|
|
public name(): string {
|
|
return this.settings.name !== "" ? this.settings.name : "User " + this.settings.id;
|
|
}
|
|
|
|
public static clone(other?: User): User {
|
|
if (other) {
|
|
return User.create(
|
|
pond.User.fromObject({
|
|
settings: pond.UserSettings.fromObject(cloneDeep(or(other.settings, {}))),
|
|
status: pond.UserStatus.fromObject(cloneDeep(or(other.status, {}))),
|
|
permissions: cloneDeep(other.permissions),
|
|
preferences: pond.UserPreferences.fromObject(cloneDeep(or(other.preferences, {})))
|
|
})
|
|
);
|
|
}
|
|
return User.create();
|
|
}
|
|
|
|
public protobuf(): pond.User {
|
|
return pond.User.fromObject({
|
|
settings: this.settings,
|
|
status: this.status
|
|
});
|
|
}
|
|
|
|
public hasAdmin(): boolean {
|
|
if (this.settings.features.includes("admin")) {
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public allowedTo(action: string): boolean {
|
|
if (this.hasAdmin() && adminActions.includes(action)) {
|
|
return true;
|
|
}
|
|
return this.settings.actions.includes(action);
|
|
}
|
|
|
|
public hasFeature(flag: string): boolean {
|
|
if (this.hasAdmin() && adminFeatures.includes(flag)) {
|
|
return true;
|
|
}
|
|
return this.settings.features.includes(flag);
|
|
}
|
|
}
|