narinder1231's picture
improve error logging and error messages
d747060
import { Request, Response } from 'express';
import { Op, FindOptions } from 'sequelize';
import AuditLog from '../models/auditLogs';
import { logger } from '../utils/logger';
import { AuditLogInterface } from '../shared/interfaces/auditLog.interface';
import User from '../models/users';
const buildAuditLogWhereClause = (filter: Record<string, any>): any => {
const whereClause: any = {};
if (filter) {
if (filter.date) {
const date = new Date(filter.date);
if (!isNaN(date.getTime())) {
const startOfDay = new Date(date);
startOfDay.setHours(0, 0, 0, 0);
const endOfDay = new Date(date);
endOfDay.setHours(23, 59, 59, 999);
whereClause.created_at = {
[Op.gte]: startOfDay,
[Op.lte]: endOfDay
};
}
}
if (filter.action_by) {
whereClause.action_by = { [Op.eq]: filter.action_by };
}
if (filter.invoice_id) {
whereClause.invoice_id = { [Op.eq]: filter.invoice_id };
}
if (filter.created_before) {
const beforeDate = new Date(filter.created_before);
if (!isNaN(beforeDate.getTime())) {
whereClause.created_at = { ...whereClause.created_at, [Op.lte]: beforeDate };
}
}
if (filter.created_after) {
const afterDate = new Date(filter.created_after);
if (!isNaN(afterDate.getTime())) {
whereClause.created_at = { ...whereClause.created_at, [Op.gte]: afterDate };
}
}
}
return whereClause;
};
const getAuditLogs = async (req: Request, res: Response) => {
try {
const { sort_by, sort_order, page, limit } = req.query;
const filter = req.query.filter as Record<string, any>;
const allowedSortColumns = ['id','action_by', 'invoice_id', 'created_at']
const whereClause = buildAuditLogWhereClause(filter);
const currentPage = parseInt(page as string) || 1;
const pageSize = parseInt(limit as string) || 10;
const options: FindOptions = {
where: whereClause,
limit: pageSize,
offset: (currentPage - 1) * pageSize,
order: []
};
if (sort_by && allowedSortColumns.includes(sort_by as string)) {
options.order = [[sort_by as string, sort_order === 'desc' ? 'DESC' : 'ASC']];
} else {
options.order = [['id', 'ASC']];
}
const [auditLogs, totalAuditLogs] = await Promise.all([
AuditLog.findAll({...options, include: [
{ model: User,
as: 'actionBy',
attributes: { exclude: ['password']}
},
]}),
AuditLog.count({ where: whereClause }),
]);
const responseData = {
page: currentPage,
limit: pageSize,
total: totalAuditLogs,
data: auditLogs
};
return res.status(200).json(responseData);
} catch (error) {
logger.error('Error fetching audit logs:');
logger.error(error);
return res.status(500).json({ error: 'Error fetching audit logs.' });
}
};
const getAuditLogById = async (req: Request, res: Response) => {
try {
const { id } = req.params;
const auditLog = await AuditLog.findByPk(id);
if (!auditLog) {
return res.status(404).json({ error: 'Audit log not found.' });
}
return res.status(200).json(auditLog);
} catch (error) {
logger.error('Error fetching audit log:');
logger.error(error);
return res.status(500).json({ error: 'Error fetching audit log.' });
}
}
const createAuditLog = async (auditLogData: AuditLogInterface) => {
try {
const newAuditLog = await AuditLog.create({
action_by: auditLogData.action_by,
invoice_id: auditLogData.invoice_id,
action: auditLogData.action,
details: auditLogData.details
});
} catch (error) {
logger.error('Error creating audit log:');
logger.error(error);
}
};
export { getAuditLogs, getAuditLogById, createAuditLog }