feat: enhance type safety in security API and related tests
This commit is contained in:
@@ -2,7 +2,7 @@ import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'
|
||||
import { useState, useEffect } from 'react'
|
||||
import { useNavigate, Outlet } from 'react-router-dom'
|
||||
import { Shield, ShieldAlert, ShieldCheck, Lock, Activity, ExternalLink } from 'lucide-react'
|
||||
import { getSecurityStatus } from '../api/security'
|
||||
import { getSecurityStatus, type SecurityStatus } from '../api/security'
|
||||
import { useSecurityConfig, useUpdateSecurityConfig, useGenerateBreakGlassToken, useRuleSets } from '../hooks/useSecurity'
|
||||
import { exportCrowdsecConfig, startCrowdsec, stopCrowdsec, statusCrowdsec } from '../api/crowdsec'
|
||||
import { updateSetting } from '../api/settings'
|
||||
@@ -38,21 +38,23 @@ export default function Security() {
|
||||
onMutate: async ({ key, enabled }: { key: string; enabled: boolean }) => {
|
||||
await queryClient.cancelQueries({ queryKey: ['security-status'] })
|
||||
const previous = queryClient.getQueryData(['security-status'])
|
||||
queryClient.setQueryData(['security-status'], (old: any) => {
|
||||
if (!old) return old
|
||||
queryClient.setQueryData(['security-status'], (old: unknown) => {
|
||||
if (!old || typeof old !== 'object') return old
|
||||
const parts = key.split('.')
|
||||
const section = parts[1]
|
||||
const section = parts[1] as keyof SecurityStatus
|
||||
const field = parts[2]
|
||||
const copy = { ...old }
|
||||
if (copy[section]) {
|
||||
copy[section] = { ...copy[section], [field]: enabled }
|
||||
const copy = { ...(old as SecurityStatus) }
|
||||
if (copy[section] && typeof copy[section] === 'object') {
|
||||
copy[section] = { ...copy[section], [field]: enabled } as never
|
||||
}
|
||||
return copy
|
||||
})
|
||||
return { previous }
|
||||
},
|
||||
onError: (_err, _vars, context: any) => {
|
||||
if (context?.previous) queryClient.setQueryData(['security-status'], context.previous)
|
||||
onError: (_err, _vars, context: unknown) => {
|
||||
if (context && typeof context === 'object' && 'previous' in context) {
|
||||
queryClient.setQueryData(['security-status'], context.previous)
|
||||
}
|
||||
const msg = _err instanceof Error ? _err.message : String(_err)
|
||||
toast.error(`Failed to update setting: ${msg}`)
|
||||
},
|
||||
@@ -71,17 +73,19 @@ export default function Security() {
|
||||
await queryClient.cancelQueries({ queryKey: ['security-status'] })
|
||||
const previous = queryClient.getQueryData(['security-status'])
|
||||
if (previous) {
|
||||
queryClient.setQueryData(['security-status'], (old: any) => {
|
||||
const copy = JSON.parse(JSON.stringify(old))
|
||||
if (!copy.cerberus) copy.cerberus = {}
|
||||
queryClient.setQueryData(['security-status'], (old: unknown) => {
|
||||
const copy = JSON.parse(JSON.stringify(old)) as SecurityStatus
|
||||
if (!copy.cerberus) copy.cerberus = { enabled: false }
|
||||
copy.cerberus.enabled = enabled
|
||||
return copy
|
||||
})
|
||||
}
|
||||
return { previous }
|
||||
},
|
||||
onError: (_err, _vars, context: any) => {
|
||||
if (context?.previous) queryClient.setQueryData(['security-status'], context.previous)
|
||||
onError: (_err, _vars, context: unknown) => {
|
||||
if (context && typeof context === 'object' && 'previous' in context) {
|
||||
queryClient.setQueryData(['security-status'], context.previous)
|
||||
}
|
||||
},
|
||||
// onSuccess: already set below
|
||||
onSuccess: () => {
|
||||
|
||||
Reference in New Issue
Block a user