63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
import logger from '@utils/logger';
|
|
|
|
export type ActivityEntry = {
|
|
requestId: string;
|
|
type: 'created' | 'assignment' | 'approval' | 'rejection' | 'status_change' | 'comment' | 'reminder' | 'document_added' | 'sla_warning';
|
|
user?: { userId: string; name?: string; email?: string };
|
|
timestamp: string;
|
|
action: string;
|
|
details: string;
|
|
metadata?: any;
|
|
};
|
|
|
|
class ActivityService {
|
|
private byRequest: Map<string, ActivityEntry[]> = new Map();
|
|
|
|
async log(entry: ActivityEntry) {
|
|
const list = this.byRequest.get(entry.requestId) || [];
|
|
list.push(entry);
|
|
this.byRequest.set(entry.requestId, list);
|
|
|
|
// Persist to database
|
|
try {
|
|
const { Activity } = require('@models/Activity');
|
|
const userName = entry.user?.name || entry.user?.email || null;
|
|
|
|
const activityData = {
|
|
requestId: entry.requestId,
|
|
userId: entry.user?.userId || null,
|
|
userName: userName,
|
|
activityType: entry.type,
|
|
activityDescription: entry.details,
|
|
activityCategory: null,
|
|
severity: null,
|
|
metadata: entry.metadata || null,
|
|
isSystemEvent: !entry.user,
|
|
ipAddress: null,
|
|
userAgent: null,
|
|
};
|
|
|
|
logger.info(`[Activity] Creating activity:`, {
|
|
requestId: entry.requestId,
|
|
userName,
|
|
userId: entry.user?.userId,
|
|
type: entry.type
|
|
});
|
|
|
|
await Activity.create(activityData);
|
|
|
|
logger.info(`[Activity] Successfully logged activity for request ${entry.requestId} by user: ${userName}`);
|
|
} catch (error) {
|
|
logger.error('[Activity] Failed to persist activity:', error);
|
|
}
|
|
}
|
|
|
|
get(requestId: string): ActivityEntry[] {
|
|
return this.byRequest.get(requestId) || [];
|
|
}
|
|
}
|
|
|
|
export const activityService = new ActivityService();
|
|
|
|
|