Files
makemd/server/src/services/AuditWorker.ts

56 lines
1.8 KiB
TypeScript
Raw Normal View History

import { Worker } from 'bullmq';
import { logger } from '../utils/logger';
import { AuditLogEntry } from './AuditService';
import db from '../config/database';
/**
* @description Worker (CORE_DEV_04)
*/
export const startAuditWorker = () => {
const worker = new Worker('audit-log', async (job) => {
const entry: AuditLogEntry = job.data;
try {
// 1. 持久化到数据库 (V22.1)
await db('cf_operation_log').insert({
tenant_id: entry.tenantId,
shop_id: entry.shopId,
task_id: entry.taskId,
trace_id: entry.traceId,
user_id: entry.userId,
role_code: entry.roleCode,
module: entry.module,
action: entry.action,
resource_type: entry.resourceType,
resource_id: entry.resourceId,
before_snapshot: entry.beforeSnapshot ? JSON.stringify(entry.beforeSnapshot) : null,
after_snapshot: entry.afterSnapshot ? JSON.stringify(entry.afterSnapshot) : null,
result: entry.result,
error_code: entry.errorCode,
error_message: entry.errorMessage,
client_ip: entry.clientIp,
user_agent: entry.userAgent,
source: entry.source,
created_at: new Date(entry.timestamp)
});
logger.info(`[AuditWorker] Successfully processed operation log: ${entry.action}`);
} catch (err: any) {
logger.error(`[AuditWorker] Failed to persist audit log: ${err.message}`);
throw err; // 触发 BullMQ 的重试机制
}
}, {
connection: {
host: process.env.REDIS_HOST || '127.0.0.1',
port: parseInt(process.env.REDIS_PORT || '6379'),
},
concurrency: 5 // 限制并发数
});
worker.on('failed', (job, err) => {
logger.error(`[AuditWorker] Job ${job?.id} failed: ${err.message}`);
});
return worker;
};