import UserActivity, { ActivityAction, ActivityCategory } from '../model/userActivity.model'; import { Types } from 'mongoose'; import { Request } from 'express'; interface LogActivityParams { userId: Types.ObjectId | string; action: ActivityAction; category: ActivityCategory; description: string; metadata?: { ipAddress?: string; userAgent?: string; eventId?: Types.ObjectId; formId?: Types.ObjectId; organizationId?: Types.ObjectId; trainerId?: Types.ObjectId; changes?: Record; errorMessage?: string; statusCode?: number; location?: { type: "Point"; coordinates: [number, number]; }; duration?: number; method?: string; endpoint?: string; queryParams?: Record; responseSize?: number; }; sessionId?: string; success?: boolean; } /** * Log user activity to the database */ export const logActivity = async (params: LogActivityParams): Promise => { try { await UserActivity.create({ user: params.userId, action: params.action, category: params.category, description: params.description, metadata: params.metadata || {}, sessionId: params.sessionId, success: params.success !== undefined ? params.success : true, timestamp: new Date() }); } catch (error) { console.error('Error logging activity:', error); // Don't throw - activity logging should not break the main flow } }; /** * Extract metadata from Express request */ export const extractRequestMetadata = (req: Request) => { return { ipAddress: req.ip || req.socket.remoteAddress, userAgent: req.get('user-agent'), method: req.method, endpoint: req.originalUrl || req.url }; }; /** * Log activity from Express request */ export const logActivityFromRequest = async ( req: Request, action: ActivityAction, category: ActivityCategory, description: string, additionalMetadata?: Record, success: boolean = true ): Promise => { if (!req.user) { console.warn('Cannot log activity: No user in request'); return; } const metadata = { ...extractRequestMetadata(req), ...additionalMetadata }; await logActivity({ userId: req.user._id, action, category, description, metadata, success }); }; export default { logActivity, extractRequestMetadata, logActivityFromRequest };