Add rudimentary user management to dashboard
This commit is contained in:
parent
48c4b3578d
commit
3b09d2d679
12 changed files with 395 additions and 81 deletions
|
@ -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) {
|
||||
|
|
|
@ -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 };
|
||||
},
|
||||
},
|
||||
|
|
|
@ -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[];
|
||||
};
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue