Files
cameleer-saas/ui/src/api/tenant-hooks.ts
hsiegeln 8b94937d38
All checks were successful
CI / build (push) Successful in 52s
CI / docker (push) Successful in 40s
feat: add audit log viewing for vendor and tenant personas
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>
2026-04-10 13:07:18 +02:00

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()}`),
});
}