205 lines
4.6 KiB
JavaScript
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,
|
|
};
|