Files
resume-builder-mern/backend/controllers/resumeController.js
2025-07-07 00:52:41 +05:30

205 lines
4.6 KiB
JavaScript

const fs = require("node:fs");
const path = require("node:path");
const Resume = require("../models/Resume");
// @desc Create a new resume
// @route POST /api/resumes
// @access Private
const createResume = async (req, res) => {
try {
const { title } = req.body;
// Default template
const defaultResumeData = {
profileInfo: {
profileImg: null,
previewUrl: "",
fullName: "",
designation: "",
summary: "",
},
contactInfo: {
email: "",
phone: "",
location: "",
linkedin: "",
github: "",
website: "",
},
workExperience: [
{
company: "",
role: "",
startDate: "",
endDate: "",
description: "",
},
],
education: [
{
degree: "",
institution: "",
startDate: "",
endDate: "",
},
],
skills: [
{
name: "",
progress: 0,
},
],
projects: [
{
title: "",
description: "",
github: "",
liveDemo: "",
},
],
certifications: [
{
title: "",
issuer: "",
year: "",
},
],
languages: [
{
name: "",
progress: 0,
},
],
interests: [""],
};
const newResume = await Resume.create({
userId: req.user._id,
title,
...defaultResumeData,
});
res.status(201).json(newResume);
} catch (error) {
res
.status(500)
.json({ message: "Failed to create resume", error: error.message });
}
};
// @desc Get all resumes for logged-in user
// @route GET /api/resumes
// @access Private
const getUserResumes = async (req, res) => {
try {
const resumes = await Resume.find({ userId: req.user._id }).sort({
updatedAt: -1,
});
res.json(resumes);
} catch (error) {
res
.status(500)
.json({ message: "Failed to create resume", error: error.message });
}
};
// @desc Get single resume by ID
// @route GET /api/resumes/:id
// @access Private
const getResumeById = async (req, res) => {
try {
const resume = await Resume.findOne({ _id: req.params.id, userId: req.user._id });
if (!resume) {
return res.status(404).json({ message: "Resume not found" });
}
res.json(resume);
} catch (error) {
res
.status(500)
.json({ message: "Failed to create resume", error: error.message });
}
};
// @desc Update a resume
// @route PUT /api/resumes/:id
// @access Private
const updateResume = async (req, res) => {
try {
const resume = await Resume.findOne({
_id: req.params.id,
userId: req.user._id,
});
if (!resume) {
return res.status(404).json({ message: "Resume not found or unauthorized" });
}
// Merge updates from req.body into existing resume
Object.assign(resume, req.body);
// Save updated resume
const savedResume = await resume.save();
res.json(savedResume);
} catch (error) {
res
.status(500)
.json({ message: "Failed to create resume", error: error.message });
}
};
// @desc Delete a resume
// @route DELETE /api/resumes/:id
// @access Private
const deleteResume = async (req, res) => {
try {
const resume = await Resume.findOne({
_id: req.params.id,
userId: req.user._id,
});
if (!resume) {
return res.status(404).json({ message: "Resume not found or unauthorized" });
}
// Delete thumbnailLink and profilePreviewUrl images from uploads folder
const uploadsFolder = path.join(__dirname, '..', 'uploads');
const baseUrl = `${req.protocol}://${req.get("host")}`;
if(resume.thumbnailLink){
const oldThumbnail = path.join(uploadsFolder, path.basename(resume.thumbnailLink));
if (fs.existsSync(oldThumbnail)) fs.unlinkSync(oldThumbnail);
}
if(resume.profileInfo?.profilePreviewUrl){
const oldProfile = path.join(uploadsFolder, path.basename(resume.profileInfo.profilePreviewUrl));
if (fs.existsSync(oldProfile)) fs.unlinkSync(oldProfile);
}
const deleted = await Resume.findOneAndDelete({
_id: req.params.id,
userId: req.user._id,
});
if (!deleted) {
return res.status(404).json({ message: "Resume not found or unauthorized" });
}
res.json({ message: "Resume deleted successfully" });
} catch (error) {
res
.status(500)
.json({ message: "Failed to create resume", error: error.message });
}
};
module.exports = {
createResume,
getUserResumes,
getResumeById,
updateResume,
deleteResume,
};