File size: 4,334 Bytes
720932b
 
 
2c97468
4e912ee
5256dce
720932b
b5dcc75
 
 
 
331064e
b5dcc75
331064e
 
 
 
 
 
 
 
 
 
b5dcc75
 
331064e
b5dcc75
 
 
331064e
b5dcc75
 
 
75f9a22
 
 
 
 
 
 
 
 
 
 
 
 
 
b5dcc75
75f9a22
b5dcc75
 
 
350299f
 
720932b
 
 
 
86a5fc6
720932b
b5dcc75
720932b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5256dce
 
 
 
 
 
720932b
 
 
5968265
720932b
 
 
5968265
720932b
5968265
720932b
d747060
 
720932b
 
 
350299f
 
 
 
 
 
 
 
 
 
 
 
 
d747060
 
350299f
 
 
 
 
b52eb95
4e912ee
 
 
 
 
 
 
 
d747060
 
4e912ee
 
 
b52eb95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
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 }