frontend/src/models/user.ts

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);
}
}