Prashikshak / API /src /util /activity.util.ts
Abhisingh-18's picture
Initial commit: Prashikshak - disaster management training platform
9a92a42
Raw
History Blame Contribute Delete
2.69 kB
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;
}
/**
* Log user activity to the database
*/
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);
// 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<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
};