feat: add audit log viewing for vendor and tenant personas
All checks were successful
CI / build (push) Successful in 52s
CI / docker (push) Successful in 40s

Vendor sees all audit events with tenant filter at /vendor/audit.
Tenant admin sees only their own events at /tenant/audit.
Both support pagination, action/result filters, and text search.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-04-10 13:07:18 +02:00
parent 1750fe64a2
commit 8b94937d38
13 changed files with 557 additions and 3 deletions

View File

@@ -1,6 +1,6 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { api } from './client';
import type { DashboardData, TenantLicenseData, TenantSettings } from '../types/api';
import type { DashboardData, TenantLicenseData, TenantSettings, AuditLogPage, AuditLogFilters } from '../types/api';
export function useTenantDashboard() {
return useQuery<DashboardData>({
@@ -61,3 +61,19 @@ export function useTenantSettings() {
queryFn: () => api.get('/tenant/settings'),
});
}
export function useTenantAuditLog(filters: Omit<AuditLogFilters, 'tenantId'>) {
const params = new URLSearchParams();
if (filters.action) params.set('action', filters.action);
if (filters.result) params.set('result', filters.result);
if (filters.search) params.set('search', filters.search);
if (filters.from) params.set('from', filters.from);
if (filters.to) params.set('to', filters.to);
params.set('page', String(filters.page ?? 0));
params.set('size', String(filters.size ?? 25));
return useQuery<AuditLogPage>({
queryKey: ['tenant', 'audit', filters],
queryFn: () => api.get(`/tenant/audit?${params.toString()}`),
});
}

View File

@@ -1,6 +1,6 @@
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { api } from './client';
import type { VendorTenantSummary, VendorTenantDetail, CreateTenantRequest, TenantResponse, LicenseResponse } from '../types/api';
import type { VendorTenantSummary, VendorTenantDetail, CreateTenantRequest, TenantResponse, LicenseResponse, AuditLogPage, AuditLogFilters } from '../types/api';
export function useVendorTenants() {
return useQuery<VendorTenantSummary[]>({
@@ -57,3 +57,20 @@ export function useRenewLicense() {
onSuccess: (_, tenantId) => qc.invalidateQueries({ queryKey: ['vendor', 'tenants', tenantId] }),
});
}
export function useVendorAuditLog(filters: AuditLogFilters) {
const params = new URLSearchParams();
if (filters.tenantId) params.set('tenantId', filters.tenantId);
if (filters.action) params.set('action', filters.action);
if (filters.result) params.set('result', filters.result);
if (filters.search) params.set('search', filters.search);
if (filters.from) params.set('from', filters.from);
if (filters.to) params.set('to', filters.to);
params.set('page', String(filters.page ?? 0));
params.set('size', String(filters.size ?? 25));
return useQuery<AuditLogPage>({
queryKey: ['vendor', 'audit', filters],
queryFn: () => api.get(`/vendor/audit?${params.toString()}`),
});
}