From 344700e29ee2a1d106697a7ef8ebc002511e8fc1 Mon Sep 17 00:00:00 2001 From: hsiegeln <37154749+hsiegeln@users.noreply.github.com> Date: Tue, 14 Apr 2026 16:46:40 +0200 Subject: [PATCH] feat: add React Query hooks for claim mapping rules API Co-Authored-By: Claude Sonnet 4.6 --- ui/src/api/queries/admin/claim-mappings.ts | 101 +++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 ui/src/api/queries/admin/claim-mappings.ts diff --git a/ui/src/api/queries/admin/claim-mappings.ts b/ui/src/api/queries/admin/claim-mappings.ts new file mode 100644 index 00000000..8f32e417 --- /dev/null +++ b/ui/src/api/queries/admin/claim-mappings.ts @@ -0,0 +1,101 @@ +import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'; +import { adminFetch } from './admin-api'; + +// ── Types ────────────────────────────────────────────────────────────── + +export interface ClaimMappingRule { + id: string; + claim: string; + matchType: 'equals' | 'contains' | 'regex'; + matchValue: string; + action: 'assignRole' | 'addToGroup'; + target: string; + priority: number; + createdAt: string; +} + +export interface CreateRuleRequest { + claim: string; + matchType: string; + matchValue: string; + action: string; + target: string; + priority: number; +} + +export interface MatchedRuleResponse { + ruleId: string; + priority: number; + claim: string; + matchType: string; + matchValue: string; + action: string; + target: string; +} + +export interface TestResponse { + matchedRules: MatchedRuleResponse[]; + effectiveRoles: string[]; + effectiveGroups: string[]; + fallback: boolean; +} + +// ── Query Hooks ──────────────────────────────────────────────────────── + +export function useClaimMappingRules() { + return useQuery({ + queryKey: ['admin', 'claim-mappings'], + queryFn: () => adminFetch('/claim-mappings'), + }); +} + +// ── Mutation Hooks ───────────────────────────────────────────────────── + +export function useCreateClaimMappingRule() { + const qc = useQueryClient(); + return useMutation({ + mutationFn: (req: CreateRuleRequest) => + adminFetch('/claim-mappings', { + method: 'POST', + body: JSON.stringify(req), + }), + onSuccess: () => { + qc.invalidateQueries({ queryKey: ['admin', 'claim-mappings'] }); + }, + }); +} + +export function useUpdateClaimMappingRule() { + const qc = useQueryClient(); + return useMutation({ + mutationFn: ({ id, ...req }: CreateRuleRequest & { id: string }) => + adminFetch(`/claim-mappings/${id}`, { + method: 'PUT', + body: JSON.stringify(req), + }), + onSuccess: () => { + qc.invalidateQueries({ queryKey: ['admin', 'claim-mappings'] }); + }, + }); +} + +export function useDeleteClaimMappingRule() { + const qc = useQueryClient(); + return useMutation({ + mutationFn: (id: string) => + adminFetch(`/claim-mappings/${id}`, { method: 'DELETE' }), + onSuccess: () => { + qc.invalidateQueries({ queryKey: ['admin', 'claim-mappings'] }); + }, + }); +} + +export function useTestClaimMappingRules() { + return useMutation({ + mutationFn: (claims: Record) => + adminFetch('/claim-mappings/test', { + method: 'POST', + body: JSON.stringify(claims), + }), + }); +}