3
0
Fork 0
mirror of https://github.com/ZeppelinBot/Zeppelin.git synced 2025-05-10 20:35:02 +00:00

Add rudimentary user management to dashboard

This commit is contained in:
Dragory 2021-09-05 16:42:35 +03:00
parent 48c4b3578d
commit 3b09d2d679
No known key found for this signature in database
GPG key ID: 5F387BA66DF8AAC1
12 changed files with 395 additions and 81 deletions

View file

@ -12,6 +12,7 @@ export const AuthStore: Module<AuthState, RootState> = {
apiKey: null,
loadedInitialAuth: false,
authRefreshInterval: null,
userId: null,
},
actions: {
@ -23,7 +24,7 @@ export const AuthStore: Module<AuthState, RootState> = {
try {
const result = await post("auth/validate-key", { key: storedKey });
if (result.valid) {
await dispatch("setApiKey", storedKey);
await dispatch("setApiKey", { key: storedKey, userId: result.userId });
return;
}
} catch {} // tslint:disable-line
@ -35,9 +36,9 @@ export const AuthStore: Module<AuthState, RootState> = {
commit("markInitialAuthLoaded");
},
setApiKey({ commit, state, dispatch }, newKey: string) {
localStorage.setItem("apiKey", newKey);
commit("setApiKey", newKey);
setApiKey({ commit, state, dispatch }, { key, userId }) {
localStorage.setItem("apiKey", key);
commit("setApiKey", { key, userId });
dispatch("startAuthAutoRefresh");
},
@ -64,7 +65,7 @@ export const AuthStore: Module<AuthState, RootState> = {
await dispatch("endAuthAutoRefresh");
localStorage.removeItem("apiKey");
commit("setApiKey", null);
commit("setApiKey", { key: null, userId: null });
},
async logout({ dispatch }) {
@ -79,8 +80,9 @@ export const AuthStore: Module<AuthState, RootState> = {
},
mutations: {
setApiKey(state: AuthState, key) {
setApiKey(state: AuthState, { key, userId }) {
state.apiKey = key;
state.userId = userId;
},
setAuthRefreshInterval(state: AuthState, interval: IntervalType | null) {

View file

@ -11,7 +11,6 @@ export const GuildStore: Module<GuildState, RootState> = {
availableGuildsLoadStatus: LoadStatus.None,
available: new Map(),
configs: {},
myPermissions: {},
guildPermissionAssignments: {},
},
@ -48,9 +47,14 @@ export const GuildStore: Module<GuildState, RootState> = {
await post(`guilds/${guildId}/config`, { config });
},
async checkPermission({ commit }, { guildId, permission }) {
const result = await post(`guilds/${guildId}/check-permission`, { permission });
commit("setMyPermission", { guildId, permission, value: result.result });
async loadMyPermissionAssignments({ commit }) {
const myPermissionAssignments = await get(`guilds/my-permissions`);
for (const permissionAssignment of myPermissionAssignments) {
commit("setGuildPermissionAssignments", {
guildId: permissionAssignment.guild_id,
permissionAssignments: [permissionAssignment],
});
}
},
async loadGuildPermissionAssignments({ commit }, guildId) {
@ -58,8 +62,9 @@ export const GuildStore: Module<GuildState, RootState> = {
commit("setGuildPermissionAssignments", { guildId, permissionAssignments });
},
async setTargetPermissions({ commit }, { guildId, targetId, type, permissions }) {
commit("setTargetPermissions", { guildId, targetId, type, permissions });
async setTargetPermissions({ commit }, { guildId, targetId, type, permissions, expiresAt }) {
await post(`guilds/${guildId}/set-target-permissions`, { guildId, targetId, type, permissions, expiresAt });
commit("setTargetPermissions", { guildId, targetId, type, permissions, expiresAt });
},
},
@ -77,12 +82,11 @@ export const GuildStore: Module<GuildState, RootState> = {
Vue.set(state.configs, guildId, config);
},
setMyPermission(state: GuildState, { guildId, permission, value }) {
Vue.set(state.myPermissions, guildId, state.myPermissions[guildId] || {});
Vue.set(state.myPermissions[guildId], permission, value);
},
setGuildPermissionAssignments(state: GuildState, { guildId, permissionAssignments }) {
if (!state.guildPermissionAssignments) {
Vue.set(state, "guildPermissionAssignments", {});
}
Vue.set(
state.guildPermissionAssignments,
guildId,
@ -93,12 +97,29 @@ export const GuildStore: Module<GuildState, RootState> = {
);
},
setTargetPermissions(state: GuildState, { guildId, targetId, type, permissions }) {
setTargetPermissions(state: GuildState, { guildId, targetId, type, permissions, expiresAt }) {
const guildPermissionAssignments = state.guildPermissionAssignments[guildId] || [];
const itemToEdit = guildPermissionAssignments.find(p => p.target_id === targetId && p.type === type);
if (!itemToEdit) return;
if (permissions.length === 0) {
// No permissions -> remove permission assignment
guildPermissionAssignments.splice(
guildPermissionAssignments.findIndex(p => p.target_id === targetId && p.type === type),
1,
);
} else {
// Update/add permission assignment
const itemToEdit = guildPermissionAssignments.find(p => p.target_id === targetId && p.type === type);
if (itemToEdit) {
itemToEdit.permissions = new Set(permissions);
} else {
state.guildPermissionAssignments[guildId].push({
type,
target_id: targetId,
permissions: new Set(permissions),
expires_at: expiresAt,
});
}
}
itemToEdit.permissions = permissions;
state.guildPermissionAssignments = { ...state.guildPermissionAssignments };
},
},

View file

@ -1,5 +1,4 @@
import { ApiPermissions } from "@shared/apiPermissions";
import { ApiPermissionTypes } from "../../../backend/src/data/ApiPermissionAssignments";
export enum LoadStatus {
None = 1,
@ -14,6 +13,14 @@ export interface AuthState {
apiKey: string | null;
loadedInitialAuth: boolean;
authRefreshInterval: IntervalType | null;
userId: string | null;
}
export interface GuildPermissionAssignment {
type: string;
target_id: string;
permissions: Set<ApiPermissions>;
expires_at: string | null;
}
export interface GuildState {
@ -29,17 +36,8 @@ export interface GuildState {
configs: {
[key: string]: string;
};
myPermissions: {
[guildId: string]: {
[K in ApiPermissions]?: boolean;
};
};
guildPermissionAssignments: {
[guildId: string]: Array<{
target_id: string;
type: ApiPermissionTypes;
permissions: Set<ApiPermissions>;
}>;
[guildId: string]: GuildPermissionAssignment[];
};
}