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>
80 lines
2.5 KiB
TypeScript
80 lines
2.5 KiB
TypeScript
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
|
import { api } from './client';
|
|
import type { DashboardData, TenantLicenseData, TenantSettings, AuditLogPage, AuditLogFilters } from '../types/api';
|
|
|
|
export function useTenantDashboard() {
|
|
return useQuery<DashboardData>({
|
|
queryKey: ['tenant', 'dashboard'],
|
|
queryFn: () => api.get('/tenant/dashboard'),
|
|
refetchInterval: 30_000,
|
|
});
|
|
}
|
|
|
|
export function useTenantLicense() {
|
|
return useQuery<TenantLicenseData>({
|
|
queryKey: ['tenant', 'license'],
|
|
queryFn: () => api.get('/tenant/license'),
|
|
});
|
|
}
|
|
|
|
export function useTenantOidc() {
|
|
return useQuery<Record<string, unknown>>({
|
|
queryKey: ['tenant', 'oidc'],
|
|
queryFn: () => api.get('/tenant/oidc'),
|
|
});
|
|
}
|
|
|
|
export function useUpdateOidc() {
|
|
const qc = useQueryClient();
|
|
return useMutation<void, Error, Record<string, unknown>>({
|
|
mutationFn: (config) => api.post('/tenant/oidc', config),
|
|
onSuccess: () => qc.invalidateQueries({ queryKey: ['tenant', 'oidc'] }),
|
|
});
|
|
}
|
|
|
|
export function useTenantTeam() {
|
|
return useQuery<Array<Record<string, unknown>>>({
|
|
queryKey: ['tenant', 'team'],
|
|
queryFn: () => api.get('/tenant/team'),
|
|
});
|
|
}
|
|
|
|
export function useInviteTeamMember() {
|
|
const qc = useQueryClient();
|
|
return useMutation<{ userId: string }, Error, { email: string; roleId: string }>({
|
|
mutationFn: (body) => api.post('/tenant/team/invite', body),
|
|
onSuccess: () => qc.invalidateQueries({ queryKey: ['tenant', 'team'] }),
|
|
});
|
|
}
|
|
|
|
export function useRemoveTeamMember() {
|
|
const qc = useQueryClient();
|
|
return useMutation<void, Error, string>({
|
|
mutationFn: (userId) => api.delete(`/tenant/team/${userId}`),
|
|
onSuccess: () => qc.invalidateQueries({ queryKey: ['tenant', 'team'] }),
|
|
});
|
|
}
|
|
|
|
export function useTenantSettings() {
|
|
return useQuery<TenantSettings>({
|
|
queryKey: ['tenant', 'settings'],
|
|
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()}`),
|
|
});
|
|
}
|