feat: add platform audit export

This commit is contained in:
Codex
2026-06-30 05:41:30 +08:00
parent c74432ce98
commit b9957d18d5
13 changed files with 422 additions and 69 deletions

View File

@@ -1233,6 +1233,26 @@ async function testPlatformTenantOperationsAndAudit() {
assert.ok(actions.has('platform.tenant.billing_profile_upserted'), 'platform audit should include billing profile update');
assert.ok(actions.has('platform.tenant.status_updated'), 'platform audit should include status update');
const auditExport = await request('/api/platform-admin/audit-logs/export', {
tenantId: false,
userId: false,
headers: adminHeaders,
query: { tenantId, format: 'csv', limit: 50 },
});
assert.equal(auditExport.item?.format, 'csv', 'platform audit export should support csv');
assert.equal(auditExport.item?.rowCount >= 3, true, 'platform audit export should include tenant audit rows');
assert.ok(auditExport.item?.sha256, 'platform audit export should include content hash');
assert.ok(Buffer.from(auditExport.item?.contentBase64 || '', 'base64').toString('utf8').includes('platform.tenant.created'), 'platform audit export should contain audit actions');
const invalidAuditExportFormat = await request('/api/platform-admin/audit-logs/export', {
tenantId: false,
userId: false,
headers: adminHeaders,
query: { tenantId, format: 'xlsx' },
expectStatus: 400,
});
assert.equal(invalidAuditExportFormat.code, 'INVALID_EXPORT_FORMAT', 'platform audit export should reject invalid formats');
const candidates = await request('/api/platform-admin/invoices/subscription-candidates', {
tenantId: false,
userId: false,
@@ -1421,6 +1441,13 @@ async function testPlatformTenantOperationsAndAudit() {
});
assert.equal(studentAuditDenied.code, 'PLATFORM_ADMIN_REQUIRED', 'student must not read platform audit logs');
const studentAuditExportDenied = await request('/api/platform-admin/audit-logs/export', {
tenantId: false,
userId: USER_ID,
expectStatus: 403,
});
assert.equal(studentAuditExportDenied.code, 'PLATFORM_ADMIN_REQUIRED', 'student must not export platform audit logs');
const studentReminderDenied = await request('/api/platform-admin/invoices/reminders', {
tenantId: false,
userId: USER_ID,