| 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<string, any>; |
| errorMessage?: string; |
| statusCode?: number; |
| location?: { |
| type: "Point"; |
| coordinates: [number, number]; |
| }; |
| duration?: number; |
| method?: string; |
| endpoint?: string; |
| queryParams?: Record<string, any>; |
| responseSize?: number; |
| }; |
| sessionId?: string; |
| success?: boolean; |
| } |
|
|
| |
| |
| |
| export const logActivity = async (params: LogActivityParams): Promise<void> => { |
| 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); |
| |
| } |
| }; |
|
|
| |
| |
| |
| 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 |
| }; |
| }; |
|
|
| |
| |
| |
| export const logActivityFromRequest = async ( |
| req: Request, |
| action: ActivityAction, |
| category: ActivityCategory, |
| description: string, |
| additionalMetadata?: Record<string, any>, |
| success: boolean = true |
| ): Promise<void> => { |
| 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 |
| }; |
|
|