mirror of
https://github.com/shuaiplus/nodewarden.git
synced 2026-06-20 21:00:41 +00:00
feat: added logging system
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import type { AdminInvite, AdminUser, ListResponse } from '../types';
|
||||
import type { AdminInvite, AdminUser, AuditLogCategory, AuditLogEntry, AuditLogLevel, AuditLogListResult, AuditLogSettings, ListResponse } from '../types';
|
||||
import { parseJson, type AuthedFetch } from './shared';
|
||||
|
||||
export async function listAdminUsers(authedFetch: AuthedFetch): Promise<AdminUser[]> {
|
||||
@@ -51,3 +51,66 @@ export async function deleteUser(authedFetch: AuthedFetch, userId: string): Prom
|
||||
const resp = await authedFetch(`/api/admin/users/${encodeURIComponent(userId)}`, { method: 'DELETE' });
|
||||
if (!resp.ok) throw new Error('Delete user failed');
|
||||
}
|
||||
|
||||
export interface AuditLogFilters {
|
||||
limit?: number;
|
||||
offset?: number;
|
||||
category?: AuditLogCategory | 'all';
|
||||
level?: AuditLogLevel | 'all';
|
||||
q?: string;
|
||||
from?: string;
|
||||
to?: string;
|
||||
}
|
||||
|
||||
export async function listAuditLogs(authedFetch: AuthedFetch, filters: AuditLogFilters = {}): Promise<AuditLogListResult> {
|
||||
const params = new URLSearchParams();
|
||||
params.set('limit', String(filters.limit || 50));
|
||||
params.set('offset', String(filters.offset || 0));
|
||||
if (filters.category && filters.category !== 'all') params.set('category', filters.category);
|
||||
if (filters.level && filters.level !== 'all') params.set('level', filters.level);
|
||||
if (filters.q?.trim()) params.set('q', filters.q.trim());
|
||||
if (filters.from) params.set('from', filters.from);
|
||||
if (filters.to) params.set('to', filters.to);
|
||||
|
||||
const resp = await authedFetch(`/api/admin/logs?${params.toString()}`);
|
||||
if (!resp.ok) throw new Error('Failed to load audit logs');
|
||||
const body = await parseJson<ListResponse<AuditLogEntry>>(resp);
|
||||
return {
|
||||
logs: body?.data || [],
|
||||
total: body?.total || 0,
|
||||
limit: body?.limit || filters.limit || 50,
|
||||
offset: body?.offset || filters.offset || 0,
|
||||
hasMore: !!body?.hasMore,
|
||||
};
|
||||
}
|
||||
|
||||
export async function getAuditLogSettings(authedFetch: AuthedFetch): Promise<AuditLogSettings> {
|
||||
const resp = await authedFetch('/api/admin/logs/settings');
|
||||
if (!resp.ok) throw new Error('Failed to load audit log settings');
|
||||
const body = await parseJson<AuditLogSettings & { object?: string }>(resp);
|
||||
return {
|
||||
retentionDays: body?.retentionDays ?? null,
|
||||
maxEntries: body?.maxEntries ?? null,
|
||||
};
|
||||
}
|
||||
|
||||
export async function saveAuditLogSettings(authedFetch: AuthedFetch, settings: AuditLogSettings): Promise<AuditLogSettings> {
|
||||
const resp = await authedFetch('/api/admin/logs/settings', {
|
||||
method: 'PUT',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify(settings),
|
||||
});
|
||||
if (!resp.ok) throw new Error('Failed to save audit log settings');
|
||||
const body = await parseJson<AuditLogSettings & { object?: string }>(resp);
|
||||
return {
|
||||
retentionDays: body?.retentionDays ?? null,
|
||||
maxEntries: body?.maxEntries ?? null,
|
||||
};
|
||||
}
|
||||
|
||||
export async function clearAuditLogs(authedFetch: AuthedFetch): Promise<number> {
|
||||
const resp = await authedFetch('/api/admin/logs', { method: 'DELETE' });
|
||||
if (!resp.ok) throw new Error('Failed to clear audit logs');
|
||||
const body = await parseJson<{ deleted?: number }>(resp);
|
||||
return Number(body?.deleted || 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user