refactor: rename safe and audit frontend resources

This commit is contained in:
2026-07-27 14:42:14 +08:00
parent 4e1f8a13e3
commit f3fcec72b5
14 changed files with 154 additions and 57 deletions

View File

@@ -4,20 +4,22 @@ import test from 'node:test';
import { auditPlatform, scanInternalIdLeaks } from './audit-check.mjs';
const resourcesSource = readFileSync('src/api/resources.ts', 'utf8');
const legacySafetyPrefix = ['sa', 'f_'].join('');
const legacyAuditPrefix = ['au', 'd_'].join('');
test('资源定义使用 safe 和 audit 前缀', () => {
assert.match(resourcesSource, /define\('safe_rule', '\/safety\/safe_rule'/);
assert.match(resourcesSource, /define\('safe_event', '\/safety\/safe_event'/);
assert.match(resourcesSource, /define\('safe_inspection', '\/safety\/safe_inspection'/);
assert.match(resourcesSource, /define\('safe_event_disposal', '\/safety\/safe_event\/:identity\/disposals'/);
assert.match(resourcesSource, /define\('audit_operation_log', '\/audit\/audit_operation_log'/);
assert.match(resourcesSource, /define\('audit_export_log', '\/audit\/audit_export_log'/);
assert.match(resourcesSource, /define\('audit_approval', '\/audit\/audit_approval'/);
assert.match(resourcesSource, /define\(\s*'safe_rule',\s*'\/safety\/safe_rule'/);
assert.match(resourcesSource, /define\(\s*'safe_event',\s*'\/safety\/safe_event'/);
assert.match(resourcesSource, /define\(\s*'safe_inspection',\s*'\/safety\/safe_inspection'/);
assert.match(resourcesSource, /define\(\s*'safe_event_disposal',\s*'\/safety\/safe_event\/:identity\/disposals'/);
assert.match(resourcesSource, /define\(\s*'audit_operation_log',\s*'\/audit\/audit_operation_log'/);
assert.match(resourcesSource, /define\(\s*'audit_export_log',\s*'\/audit\/audit_export_log'/);
assert.match(resourcesSource, /define\(\s*'audit_approval',\s*'\/audit\/audit_approval'/);
assert.doesNotMatch(resourcesSource, /define\('saf_(?:rule|event|inspection|event_disposal)',/);
assert.doesNotMatch(resourcesSource, /action\('saf_event_disposal',/);
assert.doesNotMatch(resourcesSource, /define\('aud_(?:operation_log|export_log|approval)',/);
assert.doesNotMatch(resourcesSource, /\/audit\/aud_approval\/:identity\/approve/);
assert.doesNotMatch(resourcesSource, new RegExp(`define\\('${legacySafetyPrefix}(?:rule|event|inspection|event_disposal)',`));
assert.doesNotMatch(resourcesSource, new RegExp(`action\\('${legacySafetyPrefix}event_disposal',`));
assert.doesNotMatch(resourcesSource, new RegExp(`define\\('${legacyAuditPrefix}(?:operation_log|export_log|approval)',`));
assert.doesNotMatch(resourcesSource, new RegExp(`/audit/${legacyAuditPrefix}approval/:identity/approve`));
});
test('只读页面将状态变更视为违规写操作', () => {
@@ -79,20 +81,20 @@ test('每个资源必须由带菜单元数据的路由实际加载对应页面',
test('仅追加处置必须挂在安全事件详情动作且不得有独立页面', () => {
const failures = auditPlatform({
manifest: { resources: [{ domain: 'safety', name: 'saf_event_disposal', path: '/safety/saf_event/:identity/disposals', mode: 'append_only', pageKind: 'list' }], routes: [
{ method: 'GET', path: '/safety/saf_event/:identity/disposals' },
{ method: 'POST', path: '/safety/saf_event/:identity/disposals' },
manifest: { resources: [{ domain: 'safety', name: 'safe_event_disposal', path: '/safety/safe_event/:identity/disposals', mode: 'append_only', pageKind: 'list' }], routes: [
{ method: 'GET', path: '/safety/safe_event/:identity/disposals' },
{ method: 'POST', path: '/safety/safe_event/:identity/disposals' },
] },
resources: [{ name: 'saf_event_disposal', resource: '/safety/saf_event/:identity/disposals', mode: 'append_only', pageKind: 'list', title: '事件处置', fields: [{ key: 'action', label: '处置动作' }] }],
resources: [{ name: 'safe_event_disposal', resource: '/safety/safe_event/:identity/disposals', mode: 'append_only', pageKind: 'list', title: '事件处置', fields: [{ key: 'action', label: '处置动作' }] }],
readOnlyPage: '',
routeSources: [],
viewSources: new Map([['src/views/safety/saf_event_disposal/ListPage.vue', '<template />']]),
viewSources: new Map([['src/views/safety/safe_event_disposal/ListPage.vue', '<template />']]),
apiSources: new Map(),
});
assert.deepEqual(failures, [
'safety/saf_event_disposal: missing saf_event detail action',
'safety/saf_event_disposal: independent page exposed',
'safety/safe_event_disposal: missing safe_event detail action',
'safety/safe_event_disposal: independent page exposed',
]);
});