101 lines
3.4 KiB
JavaScript
101 lines
3.4 KiB
JavaScript
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 }; |