smart-interview-genius-AI / Backend /src /controllers /interview.controller.js
Rajiv
Deploy to Hugging Face
e7c08a9
Raw
History Blame Contribute Delete
5.41 kB
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
}