feat: implement comprehensive admin dashboard for server management and user oversight
This commit is contained in:
@@ -401,9 +401,14 @@ ipcMain.handle('login-to-server', async () => {
|
||||
const saveServerAuth = (token: string) => {
|
||||
if (captured) return; captured = true;
|
||||
let serverSteamId = undefined;
|
||||
try { const payload = JSON.parse(Buffer.from(token.split('.')[1]!, 'base64').toString()); serverSteamId = payload.steamId; } catch (e) {}
|
||||
let isAdmin = false;
|
||||
try {
|
||||
const payload = JSON.parse(Buffer.from(token.split('.')[1]!, 'base64').toString());
|
||||
serverSteamId = payload.steamId;
|
||||
isAdmin = !!payload.isAdmin;
|
||||
} catch (e) {}
|
||||
const current = store.get('serverConfig');
|
||||
store.set('serverConfig', { ...current, token, serverSteamId, enabled: true });
|
||||
store.set('serverConfig', { ...current, token, serverSteamId, isAdmin, enabled: true });
|
||||
initBackend();
|
||||
authWindow.close();
|
||||
resolve(true);
|
||||
@@ -502,6 +507,14 @@ ipcMain.handle('revoke-all-account-access', async (event, steamId: string) => {
|
||||
|
||||
ipcMain.handle('get-community-accounts', async () => { initBackend(); return backend ? await backend.getCommunityAccounts() : []; });
|
||||
ipcMain.handle('get-server-users', async () => { initBackend(); return backend ? await backend.getServerUsers() : []; });
|
||||
|
||||
// --- Admin IPC ---
|
||||
ipcMain.handle('admin-get-stats', async () => { initBackend(); return backend ? await backend.getAdminStats() : null; });
|
||||
ipcMain.handle('admin-get-users', async () => { initBackend(); return backend ? await backend.getAdminUsers() : []; });
|
||||
ipcMain.handle('admin-delete-user', async (event, userId: string) => { initBackend(); if (backend) await backend.deleteUser(userId); return true; });
|
||||
ipcMain.handle('admin-get-accounts', async () => { initBackend(); return backend ? await backend.getAdminAccounts() : []; });
|
||||
ipcMain.handle('admin-remove-account', async (event, steamId: string) => { initBackend(); if (backend) await backend.forceRemoveAccount(steamId); return true; });
|
||||
|
||||
ipcMain.handle('switch-account', async (event, loginName: string) => await handleSwitchAccount(loginName));
|
||||
ipcMain.handle('open-external', (event, url: string) => shell.openExternal(url));
|
||||
|
||||
|
||||
@@ -22,6 +22,13 @@ contextBridge.exposeInMainWorld('electronAPI', {
|
||||
getCommunityAccounts: () => ipcRenderer.invoke('get-community-accounts'),
|
||||
getServerUsers: () => ipcRenderer.invoke('get-server-users'),
|
||||
|
||||
// Admin API
|
||||
adminGetStats: () => ipcRenderer.invoke('admin-get-stats'),
|
||||
adminGetUsers: () => ipcRenderer.invoke('admin-get-users'),
|
||||
adminDeleteUser: (userId: string) => ipcRenderer.invoke('admin-delete-user', userId),
|
||||
adminGetAccounts: () => ipcRenderer.invoke('admin-get-accounts'),
|
||||
adminRemoveAccount: (steamId: string) => ipcRenderer.invoke('admin-remove-account', steamId),
|
||||
|
||||
onAccountsUpdated: (callback: (accounts: any[]) => void) => {
|
||||
const subscription = (_event: IpcRendererEvent, accounts: any[]) => callback(accounts);
|
||||
ipcRenderer.on('accounts-updated', subscription);
|
||||
|
||||
@@ -119,4 +119,48 @@ export class BackendService {
|
||||
throw new Error(e.response?.data?.message || 'Failed to revoke all access');
|
||||
}
|
||||
}
|
||||
|
||||
// --- Admin API ---
|
||||
|
||||
public async getAdminStats() {
|
||||
if (!this.token) return null;
|
||||
try {
|
||||
const response = await axios.get(`${this.url}/api/admin/stats`, { headers: this.headers });
|
||||
return response.data;
|
||||
} catch (e) { return null; }
|
||||
}
|
||||
|
||||
public async getAdminUsers() {
|
||||
if (!this.token) return [];
|
||||
try {
|
||||
const response = await axios.get(`${this.url}/api/admin/users`, { headers: this.headers });
|
||||
return response.data;
|
||||
} catch (e) { return []; }
|
||||
}
|
||||
|
||||
public async deleteUser(userId: string) {
|
||||
if (!this.token) return;
|
||||
try {
|
||||
await axios.delete(`${this.url}/api/admin/users/${userId}`, { headers: this.headers });
|
||||
} catch (e: any) {
|
||||
throw new Error(e.response?.data?.message || 'Failed to delete user');
|
||||
}
|
||||
}
|
||||
|
||||
public async getAdminAccounts() {
|
||||
if (!this.token) return [];
|
||||
try {
|
||||
const response = await axios.get(`${this.url}/api/admin/accounts`, { headers: this.headers });
|
||||
return response.data;
|
||||
} catch (e) { return []; }
|
||||
}
|
||||
|
||||
public async forceRemoveAccount(steamId: string) {
|
||||
if (!this.token) return;
|
||||
try {
|
||||
await axios.delete(`${this.url}/api/admin/accounts/${steamId}`, { headers: this.headers });
|
||||
} catch (e: any) {
|
||||
throw new Error(e.response?.data?.message || 'Failed to remove account');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user