feat(ui): tanstack query hooks for outbound connections
Types are hand-authored (matching codebase admin-query convention); schema.d.ts regeneration deferred until backend dev server is available. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
128
ui/src/api/queries/admin/outboundConnections.ts
Normal file
128
ui/src/api/queries/admin/outboundConnections.ts
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
|
||||||
|
import { adminFetch } from './admin-api';
|
||||||
|
|
||||||
|
// ── Types ──────────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export type OutboundMethod = 'POST' | 'PUT' | 'PATCH';
|
||||||
|
export type OutboundAuthKind = 'NONE' | 'BEARER' | 'BASIC';
|
||||||
|
export type TrustMode = 'SYSTEM_DEFAULT' | 'TRUST_ALL' | 'TRUST_PATHS';
|
||||||
|
|
||||||
|
// Jackson DEDUCTION mode picks subtype by which fields are present.
|
||||||
|
// None = {}, Bearer = { tokenCiphertext }, Basic = { username, passwordCiphertext }.
|
||||||
|
// Using a flat optional shape for pragmatic TypeScript compatibility.
|
||||||
|
export type OutboundAuth = {
|
||||||
|
tokenCiphertext?: string;
|
||||||
|
username?: string;
|
||||||
|
passwordCiphertext?: string;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Server returns this shape (`OutboundConnectionDto` in Java)
|
||||||
|
export interface OutboundConnectionDto {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
description: string | null;
|
||||||
|
url: string;
|
||||||
|
method: OutboundMethod;
|
||||||
|
defaultHeaders: Record<string, string>;
|
||||||
|
defaultBodyTmpl: string | null;
|
||||||
|
tlsTrustMode: TrustMode;
|
||||||
|
tlsCaPemPaths: string[];
|
||||||
|
hmacSecretSet: boolean;
|
||||||
|
authKind: OutboundAuthKind;
|
||||||
|
allowedEnvironmentIds: string[];
|
||||||
|
createdAt: string;
|
||||||
|
createdBy: string;
|
||||||
|
updatedAt: string;
|
||||||
|
updatedBy: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Client sends this shape for create/update (`OutboundConnectionRequest` in Java)
|
||||||
|
export interface OutboundConnectionRequest {
|
||||||
|
name: string;
|
||||||
|
description?: string | null;
|
||||||
|
url: string;
|
||||||
|
method: OutboundMethod;
|
||||||
|
defaultHeaders?: Record<string, string>;
|
||||||
|
defaultBodyTmpl?: string | null;
|
||||||
|
tlsTrustMode: TrustMode;
|
||||||
|
tlsCaPemPaths?: string[];
|
||||||
|
hmacSecret?: string | null;
|
||||||
|
auth: OutboundAuth;
|
||||||
|
allowedEnvironmentIds?: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server returns this from POST /{id}/test
|
||||||
|
export interface OutboundConnectionTestResult {
|
||||||
|
status: number;
|
||||||
|
latencyMs: number;
|
||||||
|
responseSnippet: string | null;
|
||||||
|
tlsProtocol: string | null;
|
||||||
|
tlsCipherSuite: string | null;
|
||||||
|
peerCertificateSubject: string | null;
|
||||||
|
peerCertificateExpiresAtEpochMs: number | null;
|
||||||
|
error: string | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Query Hooks ────────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export function useOutboundConnections() {
|
||||||
|
return useQuery({
|
||||||
|
queryKey: ['admin', 'outbound-connections'],
|
||||||
|
queryFn: () => adminFetch<OutboundConnectionDto[]>('/outbound-connections'),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useOutboundConnection(id: string | undefined) {
|
||||||
|
return useQuery({
|
||||||
|
queryKey: ['admin', 'outbound-connections', id],
|
||||||
|
queryFn: () => adminFetch<OutboundConnectionDto>(`/outbound-connections/${id}`),
|
||||||
|
enabled: !!id,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// ── Mutation Hooks ─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
export function useCreateOutboundConnection() {
|
||||||
|
const qc = useQueryClient();
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: (req: OutboundConnectionRequest) =>
|
||||||
|
adminFetch<OutboundConnectionDto>('/outbound-connections', {
|
||||||
|
method: 'POST',
|
||||||
|
body: JSON.stringify(req),
|
||||||
|
}),
|
||||||
|
onSuccess: () => qc.invalidateQueries({ queryKey: ['admin', 'outbound-connections'] }),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useUpdateOutboundConnection(id: string) {
|
||||||
|
const qc = useQueryClient();
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: (req: OutboundConnectionRequest) =>
|
||||||
|
adminFetch<OutboundConnectionDto>(`/outbound-connections/${id}`, {
|
||||||
|
method: 'PUT',
|
||||||
|
body: JSON.stringify(req),
|
||||||
|
}),
|
||||||
|
onSuccess: () => {
|
||||||
|
qc.invalidateQueries({ queryKey: ['admin', 'outbound-connections'] });
|
||||||
|
qc.invalidateQueries({ queryKey: ['admin', 'outbound-connections', id] });
|
||||||
|
},
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useDeleteOutboundConnection() {
|
||||||
|
const qc = useQueryClient();
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: (id: string) =>
|
||||||
|
adminFetch<void>(`/outbound-connections/${id}`, { method: 'DELETE' }),
|
||||||
|
onSuccess: () => qc.invalidateQueries({ queryKey: ['admin', 'outbound-connections'] }),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function useTestOutboundConnection() {
|
||||||
|
return useMutation({
|
||||||
|
mutationFn: (id: string) =>
|
||||||
|
adminFetch<OutboundConnectionTestResult>(`/outbound-connections/${id}/test`, {
|
||||||
|
method: 'POST',
|
||||||
|
}),
|
||||||
|
});
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user