refactor(audit): split list detail flows
This commit is contained in:
101
web/src/views/scripts/useAuditRiskRuleJsonEditor.js
Normal file
101
web/src/views/scripts/useAuditRiskRuleJsonEditor.js
Normal file
@@ -0,0 +1,101 @@
|
||||
import {
|
||||
fetchAgentAssetRuleJson,
|
||||
saveAgentAssetRuleJson
|
||||
} from '../../services/agentAssets.js'
|
||||
import {
|
||||
applyRiskRuleJsonState,
|
||||
resolveRiskRuleDescription
|
||||
} from './auditViewModel.js'
|
||||
|
||||
function readJsonPayload(payload) {
|
||||
return payload?.payload && typeof payload.payload === 'object' ? payload.payload : payload
|
||||
}
|
||||
|
||||
function downloadTextFile({ content, fileName, type }) {
|
||||
const blob = new Blob([content], { type })
|
||||
const objectUrl = URL.createObjectURL(blob)
|
||||
const link = document.createElement('a')
|
||||
link.href = objectUrl
|
||||
link.download = fileName
|
||||
link.click()
|
||||
URL.revokeObjectURL(objectUrl)
|
||||
}
|
||||
|
||||
export function useAuditRiskRuleJsonEditor({
|
||||
selectedSkill,
|
||||
canEditMarkdown,
|
||||
actionState,
|
||||
toast
|
||||
}) {
|
||||
async function loadRiskRuleJson(assetId) {
|
||||
if (!assetId || !selectedSkill.value?.usesJsonRiskRule) {
|
||||
return
|
||||
}
|
||||
|
||||
const payload = await fetchAgentAssetRuleJson(assetId)
|
||||
selectedSkill.value = applyRiskRuleJsonState(
|
||||
selectedSkill.value,
|
||||
readJsonPayload(payload),
|
||||
payload
|
||||
)
|
||||
}
|
||||
|
||||
async function saveRiskRuleJson() {
|
||||
if (!selectedSkill.value?.id || !canEditMarkdown.value) {
|
||||
return
|
||||
}
|
||||
|
||||
actionState.value = 'save-risk-json'
|
||||
try {
|
||||
const parsed = JSON.parse(String(selectedSkill.value.riskRuleJsonText || '{}'))
|
||||
const saved = await saveAgentAssetRuleJson(selectedSkill.value.id, { payload: parsed })
|
||||
selectedSkill.value = applyRiskRuleJsonState(
|
||||
selectedSkill.value,
|
||||
readJsonPayload(saved),
|
||||
saved
|
||||
)
|
||||
toast('风险规则 JSON 已保存。')
|
||||
} catch (error) {
|
||||
toast(error?.message || '风险规则 JSON 保存失败。')
|
||||
} finally {
|
||||
actionState.value = ''
|
||||
}
|
||||
}
|
||||
|
||||
function formatRiskRuleJson() {
|
||||
if (!selectedSkill.value?.usesJsonRiskRule) {
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
const parsed = JSON.parse(String(selectedSkill.value.riskRuleJsonText || '{}'))
|
||||
selectedSkill.value = applyRiskRuleJsonState(selectedSkill.value, parsed, {
|
||||
name: selectedSkill.value.name,
|
||||
description: resolveRiskRuleDescription(parsed)
|
||||
})
|
||||
} catch (error) {
|
||||
toast(error?.message || 'JSON 格式无效,无法格式化。')
|
||||
}
|
||||
}
|
||||
|
||||
function downloadRiskRuleJson() {
|
||||
if (!selectedSkill.value?.usesJsonRiskRule) {
|
||||
return
|
||||
}
|
||||
|
||||
downloadTextFile({
|
||||
content: String(selectedSkill.value.riskRuleJsonText || '{}'),
|
||||
fileName:
|
||||
selectedSkill.value.ruleDocument?.file_name ||
|
||||
`${selectedSkill.value.code || 'risk-rule'}.json`,
|
||||
type: 'application/json;charset=utf-8'
|
||||
})
|
||||
}
|
||||
|
||||
return {
|
||||
loadRiskRuleJson,
|
||||
saveRiskRuleJson,
|
||||
formatRiskRuleJson,
|
||||
downloadRiskRuleJson
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user