import jwt from "jsonwebtoken"; import { VAModel, LeavesModel } from "../../../models/vaModel.js"; // Get all leave lists applied by VA async function va_leave_list_function(req, res) { try { const accessToken = req.headers.token; if (!accessToken) { return res.status(401).json({ success: false, message: "Missing token" }); } const decoded = jwt.verify(accessToken, process.env.JWT_SECRET_ACCESS_TOKEN); if (!decoded || !decoded.email) { return res.status(401).json({ success: false, message: "Invalid token" }); } const vaEmail = decoded.email; const vaUser = await VAModel.findOne({ "userDetails.email": vaEmail }); if (!vaUser) { return res.status(404).json({ success: false, message: "VA not found" }); } const vaId = vaUser._id; // Get parameters from route params (they are optional) const { status, type } = req.params; // Get sorting from query params (optional) const { sortBy = 'createdAt', sortOrder = 'desc' } = req.query; // Build filter object const filter = { vaId }; // Handle status filter from params if (status && status !== 'ALL') { filter.status = status.toUpperCase(); } // Handle type filter from params (using 'type' instead of 'leaveType') if (type && type !== 'ALL') { filter.leaveType = type.toUpperCase(); } // Validate sort parameters const validSortFields = ['createdAt', 'dateFrom', 'dateTo', 'status', 'leaveType']; const sortField = validSortFields.includes(sortBy) ? sortBy : 'createdAt'; const sortDirection = sortOrder.toLowerCase() === 'asc' ? 1 : -1; // Get all leaves without pagination const leaves = await LeavesModel.find(filter) .sort({ [sortField]: sortDirection }) .select('-__v') .lean(); // Format the response data const formattedLeaves = leaves.map(leave => ({ leaveId: leave._id, dateFrom: leave.dateFrom.toISOString().split('T')[0], dateTo: leave.dateTo.toISOString().split('T')[0], totalDays: parseInt(leave.days), leaveType: leave.leaveType, comment: leave.comment, status: leave.status, appliedOn: leave.createdAt, reviewedAt: leave.reviewedAt || null, rejectionReason: leave.rejectionReason || null })); return res.status(200).json({ success: true, message: "Leave list retrieved successfully", data: { leaves: formattedLeaves, totalCount: formattedLeaves.length } }); } catch (error) { console.error("Leave list error:", error); if (error.name === 'JsonWebTokenError') { return res.status(401).json({ success: false, message: "Invalid token" }); } if (error.name === 'TokenExpiredError') { return res.status(401).json({ success: false, message: "Token expired" }); } return res.status(500).json({ success: false, message: "Internal Server Error", error: error.message }); } } export { va_leave_list_function };