|
| 1 | +const mongoose = require('mongoose'); |
1 | 2 | const Form = require('../models/JobFormsModel'); |
2 | 3 | const Response = require('../models/jobApplicationsModel'); |
| 4 | +const upload = require('../middleware/multerMiddleware'); |
3 | 5 | const QuestionSet = require('../models/questionSet'); |
4 | 6 | const { |
5 | 7 | canManageJobForms, |
@@ -161,6 +163,94 @@ exports.updateFormFormat = async (req, res) => { |
161 | 163 | } |
162 | 164 | }; |
163 | 165 |
|
| 166 | +// Submit a job application for a form (public — applicants) |
| 167 | +exports.submitJobApplication = async (req, res) => { |
| 168 | + try { |
| 169 | + const { formId } = req.params; |
| 170 | + let payload = {}; |
| 171 | + try { |
| 172 | + payload = JSON.parse(req.body.payload || '{}'); |
| 173 | + } catch (parseError) { |
| 174 | + return res.status(400).json({ message: 'Invalid application payload.' }); |
| 175 | + } |
| 176 | + |
| 177 | + const form = await Form.findById(formId); |
| 178 | + if (!form) { |
| 179 | + return res.status(404).json({ message: 'Form not found.' }); |
| 180 | + } |
| 181 | + |
| 182 | + const { applicantName, applicantEmail, answers: answersPayload = [], profile = {} } = payload; |
| 183 | + if (!applicantEmail || !String(applicantEmail).trim()) { |
| 184 | + return res.status(400).json({ message: 'Email is required.' }); |
| 185 | + } |
| 186 | + |
| 187 | + const fileByField = {}; |
| 188 | + (req.files || []).forEach((file) => { |
| 189 | + fileByField[file.fieldname] = file; |
| 190 | + }); |
| 191 | + |
| 192 | + const builtAnswers = answersPayload.map(({ questionId, answer }) => { |
| 193 | + const qIdStr = questionId ? String(questionId) : ''; |
| 194 | + const uploaded = qIdStr ? fileByField[`questionFile_${qIdStr}`] : null; |
| 195 | + if (uploaded) { |
| 196 | + return { |
| 197 | + questionId: questionId || new mongoose.Types.ObjectId(), |
| 198 | + answer: { |
| 199 | + fileName: uploaded.originalname, |
| 200 | + mimeType: uploaded.mimetype, |
| 201 | + size: uploaded.size, |
| 202 | + }, |
| 203 | + }; |
| 204 | + } |
| 205 | + return { |
| 206 | + questionId: questionId || new mongoose.Types.ObjectId(), |
| 207 | + answer, |
| 208 | + }; |
| 209 | + }); |
| 210 | + |
| 211 | + const { resume } = fileByField; |
| 212 | + if (resume) { |
| 213 | + builtAnswers.push({ |
| 214 | + questionId: new mongoose.Types.ObjectId(), |
| 215 | + answer: { |
| 216 | + type: 'resume', |
| 217 | + fileName: resume.originalname, |
| 218 | + mimeType: resume.mimetype, |
| 219 | + size: resume.size, |
| 220 | + }, |
| 221 | + }); |
| 222 | + } |
| 223 | + |
| 224 | + builtAnswers.push({ |
| 225 | + questionId: new mongoose.Types.ObjectId(), |
| 226 | + answer: { |
| 227 | + type: 'applicantProfile', |
| 228 | + applicantName, |
| 229 | + applicantEmail, |
| 230 | + ...profile, |
| 231 | + }, |
| 232 | + }); |
| 233 | + |
| 234 | + const submission = new Response({ |
| 235 | + formId, |
| 236 | + respondent: String(applicantEmail).trim(), |
| 237 | + answers: builtAnswers, |
| 238 | + }); |
| 239 | + |
| 240 | + await submission.save(); |
| 241 | + |
| 242 | + res.status(201).json({ |
| 243 | + message: 'Application submitted successfully.', |
| 244 | + responseId: submission._id, |
| 245 | + }); |
| 246 | + } catch (error) { |
| 247 | + console.error('Error submitting job application:', error); |
| 248 | + res.status(500).json({ message: 'Error submitting application.', error: error.message }); |
| 249 | + } |
| 250 | +}; |
| 251 | + |
| 252 | +exports.submitJobApplicationMiddleware = upload.any(); |
| 253 | + |
164 | 254 | // Get all responses of a form |
165 | 255 | exports.getFormResponses = async (req, res) => { |
166 | 256 | try { |
|
0 commit comments