File size: 5,413 Bytes
e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 3704bd1 e7c08a9 | 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 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 | const { PDFParse } = require("pdf-parse")
const { generateInterviewReport, generateResumePdf } = require("../services/ai.service")
const interviewReportModel = require("../models/interviewReport.model")
/**
* @description Controller to generate interview report based on user self description, resume and job description.
* @access Private
*/
async function generateInterViewReportController(req, res) {
try {
if (!req.file) {
return res.status(400).json({ message: "Please upload a resume PDF file." })
}
const pdfDoc = new PDFParse(Uint8Array.from(req.file.buffer))
const resumeData = await pdfDoc.getText()
const resumeContent = resumeData.text || ""
const { selfDescription, jobDescription } = req.body
if (!jobDescription) {
return res.status(400).json({ message: "Job description is required." })
}
const interViewReportByAi = await generateInterviewReport({
resume: resumeContent,
selfDescription: selfDescription || "",
jobDescription
})
const interviewReport = await interviewReportModel.create({
user: req.user.id,
resume: resumeContent,
selfDescription: selfDescription || "",
jobDescription,
...interViewReportByAi
})
res.status(201).json({
message: "Interview report generated successfully.",
interviewReport
})
} catch (err) {
console.error("generateInterViewReportController error:", err)
res.status(500).json({ message: "Failed to generate interview report. Please try again.", error: err.message })
}
}
/**
* @description Controller to get interview report by interviewId.
* @access Private
*/
async function getInterviewReportByIdController(req, res) {
try {
const { interviewId } = req.params
const interviewReport = await interviewReportModel.findOne({ _id: interviewId, user: req.user.id })
if (!interviewReport) {
return res.status(404).json({
message: "Interview report not found."
})
}
res.status(200).json({
message: "Interview report fetched successfully.",
interviewReport
})
} catch (err) {
console.error("getInterviewReportByIdController error:", err)
res.status(500).json({ message: "Failed to fetch interview report." })
}
}
/**
* @description Controller to get all interview reports of logged in user.
* @access Private
*/
async function getAllInterviewReportsController(req, res) {
try {
const interviewReports = await interviewReportModel
.find({ user: req.user.id })
.sort({ createdAt: -1 })
.select("-resume -selfDescription -jobDescription -__v -technicalQuestions -behavioralQuestions -technicalQuiz -skillGaps -preparationPlan")
res.status(200).json({
message: "Interview reports fetched successfully.",
interviewReports
})
} catch (err) {
console.error("getAllInterviewReportsController error:", err)
res.status(500).json({ message: "Failed to fetch interview reports." })
}
}
/**
* @description Controller to generate resume PDF based on user self description, resume and job description.
* @access Private
*/
async function generateResumePdfController(req, res) {
try {
const { interviewReportId } = req.params
const { candidateAnswers = [] } = req.body
const interviewReport = await interviewReportModel.findById(interviewReportId)
if (!interviewReport) {
return res.status(404).json({
message: "Interview report not found."
})
}
const { resume, jobDescription, selfDescription } = interviewReport
const pdfBuffer = await generateResumePdf({ resume, jobDescription, selfDescription, candidateAnswers })
res.set({
"Content-Type": "application/pdf",
"Content-Disposition": `attachment; filename=resume_${interviewReportId}.pdf`
})
res.send(pdfBuffer)
} catch (err) {
console.error("generateResumePdfController error:", err)
res.status(500).json({ message: "Failed to generate resume PDF.", error: err.message })
}
}
/**
* @description Controller to evaluate candidate's answer for a specific question.
* @access Private
*/
async function evaluateAnswerController(req, res) {
try {
const { question, answer } = req.body
if (!question || !answer) {
return res.status(400).json({ message: "Question and answer are required." })
}
const { evaluateCandidateAnswer } = require("../services/ai.service")
const evaluation = await evaluateCandidateAnswer({ question, answer })
res.status(200).json({
message: "Answer evaluated successfully.",
evaluation
})
} catch (err) {
console.error("evaluateAnswerController error:", err)
res.status(500).json({ message: "Failed to evaluate answer. Please try again." })
}
}
module.exports = {
generateInterViewReportController,
getInterviewReportByIdController,
getAllInterviewReportsController,
generateResumePdfController,
evaluateAnswerController
} |