import prisma from '../prisma/client.js';
import { sendEmail } from '../utils/sendEmail.js';
import { getEmailsByType } from '../utils/getEmailByTypes.js';
// CREATE CANDIDATE
export const createCandidate = async (req, res) => {
try {
const { fullName, mobile, email, subject, coverLetter, careerId } = req.body;
if (!fullName || !mobile || !email || !careerId) {
return res.status(400).json({
success: false,
message: 'Required fields missing',
});
}
const candidate = await prisma.candidate.create({
data: {
fullName,
mobile,
email,
subject,
coverLetter,
careerId: Number(careerId),
},
include: {
career: true,
},
});
try {
const emailList = await getEmailsByType('CANDIDATE');
if (emailList && emailList.length > 0) {
await sendEmail({
to: emailList,
subject: 'New Job Application Received',
html: `
GG Hospital
New Job Application Received
Candidate Details
| Name: |
${fullName} |
| Phone: |
${mobile} |
| Email: |
${email} |
Application Details
| Applied For: |
${candidate.career?.post || '-'} |
| Designation: |
${candidate.career?.designation || '-'} |
| Subject: |
${subject || '-'} |
Cover Letter
${coverLetter ? coverLetter.replace(/\n/g, '
') : '-'}
This application was submitted via the GG Hospital careers page.
`,
});
}
} catch (err) {
console.error('Candidate email failed:', err);
}
res.status(201).json({
success: true,
message: 'Application submitted successfully',
data: candidate,
});
} catch (error) {
console.error(error);
res.status(500).json({
success: false,
message: 'Failed to create candidate',
});
}
};
// GET ALL CANDIDATES
export const getCandidates = async (req, res) => {
try {
const candidates = await prisma.candidate.findMany({
include: {
career: true,
},
orderBy: {
createdAt: 'desc',
},
});
res.status(200).json({
success: true,
data: candidates,
});
} catch (error) {
console.error(error);
res.status(500).json({
success: false,
message: 'Failed to fetch candidates',
});
}
};
// GET SINGLE CANDIDATE
export const getCandidate = async (req, res) => {
try {
const { id } = req.params;
const candidate = await prisma.candidate.findUnique({
where: {
id: Number(id),
},
include: {
career: true,
},
});
if (!candidate) {
return res.status(404).json({
success: false,
message: 'Candidate not found',
});
}
res.status(200).json({
success: true,
data: candidate,
});
} catch (error) {
console.error(error);
res.status(500).json({
success: false,
message: 'Failed to fetch candidate',
});
}
};
// GET CANDIDATES BY CAREER
export const getCandidatesByCareer = async (req, res) => {
try {
const { careerId } = req.params;
const candidates = await prisma.candidate.findMany({
where: {
careerId: Number(careerId),
},
include: {
career: true,
},
orderBy: {
createdAt: 'desc',
},
});
res.status(200).json({
success: true,
data: candidates,
});
} catch (error) {
console.error(error);
res.status(500).json({
success: false,
message: 'Failed to fetch candidates',
});
}
};
// UPDATE CANDIDATE
export const updateCandidate = async (req, res) => {
try {
const { id } = req.params;
const candidate = await prisma.candidate.update({
where: {
id: Number(id),
},
data: req.body,
});
res.status(200).json({
success: true,
message: 'Candidate updated successfully',
data: candidate,
});
} catch (error) {
console.error(error);
res.status(500).json({
success: false,
message: 'Failed to update candidate',
});
}
};
// DELETE CANDIDATE
export const deleteCandidate = async (req, res) => {
try {
const { id } = req.params;
await prisma.candidate.delete({
where: {
id: Number(id),
},
});
res.status(200).json({
success: true,
message: 'Candidate deleted successfully',
});
} catch (error) {
console.error(error);
res.status(500).json({
success: false,
message: 'Failed to delete candidate',
});
}
};