Skip to content

Commit 707ffed

Browse files
authored
fix: application feature (#16)
* feat: get position by company * fix: return response get application * feat: get application by user
1 parent 23842f9 commit 707ffed

File tree

6 files changed

+103
-12
lines changed

6 files changed

+103
-12
lines changed

controllers/applicationController.js

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -79,14 +79,14 @@ const getApplicationById = async (req, res) => {
7979
const recruiterId = req.user.uid;
8080
const role = await ProfileModel.getRole(recruiterId);
8181
if (role === 'recruiter' || role === 'admin') {
82-
const company = await ProfileModel.getCompany(recruiterId);
83-
const position = await PositionModel.getPositionById(id);
84-
if (position.companyId !== company) {
85-
return responseError(res, 'Forbidden', 403);
86-
}
8782
const application = await ApplicationModel.getApplicationById(id);
8883
if (application) {
89-
return responseSuccess(res, { id: application.id, ...application.data() }, 'Application retrieved successfully', 200);
84+
const company = await ProfileModel.getCompany(recruiterId);
85+
const position = await PositionModel.getPositionById(application.positionId);
86+
if (position.companyId !== company) {
87+
return responseError(res, 'Forbidden', 403);
88+
}
89+
return responseSuccess(res, { id: application.id, ...application }, 'Application retrieved successfully', 200);
9090
}
9191
return responseError(res, 'Application not found', 404);
9292
}
@@ -112,9 +112,22 @@ const getApplicationByPositionId = async (req, res) => {
112112
return responseError(res, 'Forbidden', 403);
113113
};
114114

115+
const getApplicationByCandidateId = async (req, res) => {
116+
const candidateId = req.user.uid;
117+
if (candidateId === req.params.candidateId) {
118+
const applications = await ApplicationModel.getApplicationByCandidateId(candidateId);
119+
if (applications) {
120+
return responseSuccess(res, applications, 'Applications retrieved successfully', 200);
121+
}
122+
return responseError(res, 'Applications not found', 404);
123+
}
124+
return responseError(res, 'Forbidden', 403);
125+
};
126+
115127
module.exports = {
116128
createApplication,
117129
updateApplication,
118130
getApplicationById,
119131
getApplicationByPositionId,
132+
getApplicationByCandidateId,
120133
};

controllers/positionController.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,15 @@ const getPositionById = async (req, res) => {
4646
return responseSuccess(res, { id, ...position }, 'Position retrieved successfully', 200);
4747
};
4848

49+
const getPositionByCompanyId = async (req, res) => {
50+
const { companyId } = req.params;
51+
const positions = await PositionModel.getPositionByCompanyId(companyId);
52+
if (positions) {
53+
return responseSuccess(res, positions, 'Positions retrieved successfully', 200);
54+
}
55+
return responseError(res, 'Positions retrieval failed', 500);
56+
};
57+
4958
const updatePosition = async (req, res) => {
5059
const id = req.params.positionId;
5160
const recruiterId = req.user.uid;
@@ -105,6 +114,7 @@ module.exports = {
105114
createPosition,
106115
getAllPositions,
107116
getPositionById,
117+
getPositionByCompanyId,
108118
updatePosition,
109119
deletePosition,
110120
};

models/applicationModel.js

Lines changed: 50 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
const { db } = require('../config/firebaseAdmin');
2+
const PositionModel = require('./positionModel');
3+
const ProfileModel = require('./profileModel');
24

35
const collection = db.collection('applications');
46

@@ -11,7 +13,18 @@ class ApplicationModel {
1113
static async getApplicationById(id) {
1214
const application = await collection.doc(id).get();
1315
if (application.exists) {
14-
return application;
16+
const position = await application.data().positionId;
17+
const positionData = await PositionModel.getPositionById(position);
18+
const candidate = await application.data().candidateId;
19+
const candidateData = await ProfileModel.getProfileById(candidate);
20+
const candidateDetails = candidateData.data();
21+
const applicationDetails = application.data();
22+
return {
23+
id: application.id,
24+
...applicationDetails,
25+
candidate: candidateDetails,
26+
position: positionData,
27+
};
1528
}
1629
return null;
1730
}
@@ -21,11 +34,43 @@ class ApplicationModel {
2134
if (applications.empty) {
2235
return null;
2336
}
24-
const applicationList = [];
25-
applications.forEach((application) => {
26-
applicationList.push({ id: application.id, ...application.data() });
37+
const applicationsData = applications.docs.map(async (application) => {
38+
const position = await application.data().positionId;
39+
const positionData = await PositionModel.getPositionById(position);
40+
const candidate = await application.data().candidateId;
41+
const candidateData = await ProfileModel.getProfileById(candidate);
42+
const candidateDetails = candidateData.data();
43+
const applicationDetails = application.data();
44+
return {
45+
id: application.id,
46+
...applicationDetails,
47+
candidate: candidateDetails,
48+
position: positionData,
49+
};
2750
});
28-
return applicationList;
51+
return Promise.all(applicationsData);
52+
}
53+
54+
static async getApplicationByCandidateId(candidateId) {
55+
const applications = await collection.where('candidateId', '==', candidateId).get();
56+
if (applications.empty) {
57+
return null;
58+
}
59+
const applicationsData = applications.docs.map(async (application) => {
60+
const position = await application.data().positionId;
61+
const positionData = await PositionModel.getPositionById(position);
62+
const candidate = await application.data().candidateId;
63+
const candidateData = await ProfileModel.getProfileById(candidate);
64+
const candidateDetails = candidateData.data();
65+
const applicationDetails = application.data();
66+
return {
67+
id: application.id,
68+
...applicationDetails,
69+
candidate: candidateDetails,
70+
position: positionData,
71+
};
72+
});
73+
return Promise.all(applicationsData);
2974
}
3075

3176
static async updateApplication(id, data) {

models/positionModel.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,25 @@ class PositionModel {
4040
return null;
4141
}
4242

43+
static async getPositionByCompanyId(companyId) {
44+
const positions = await collection.where('companyId', '==', companyId).get();
45+
if (positions.empty) {
46+
return null;
47+
}
48+
const positionsData = positions.docs.map(async (position) => {
49+
const company = await position.data().companyId;
50+
const companyData = await CompanyModel.getCompanyById(company);
51+
const companyDetails = companyData.data();
52+
const positionDetails = position.data();
53+
return {
54+
id: position.id,
55+
...positionDetails,
56+
company: companyDetails,
57+
};
58+
});
59+
return Promise.all(positionsData);
60+
}
61+
4362
static async updatePosition(id, data) {
4463
const position = await collection.doc(id).get();
4564
if (position.exists) {

routes/applicationRoutes.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,17 @@ const authenticateToken = require('../middlewares/authenticateToken');
55
const {
66
createApplication,
77
updateApplication,
8-
getApplicationByPositionId,
98
getApplicationById,
9+
getApplicationByPositionId,
10+
getApplicationByCandidateId,
1011
} = require('../controllers/applicationController');
1112

1213
const router = express.Router();
1314
const upload = multer({ storage: multer.memoryStorage() });
1415

1516
router.get('/:applicationId', authenticateToken, getApplicationById);
1617
router.get('/position/:positionId', authenticateToken, getApplicationByPositionId);
18+
router.get('/user/:candidateId', authenticateToken, getApplicationByCandidateId);
1719
router.post('/create', authenticateToken, upload.single('file'), createApplication);
1820
router.patch('/:applicationId', authenticateToken, updateApplication);
1921

routes/positionRoutes.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ const {
55
createPosition,
66
getAllPositions,
77
getPositionById,
8+
getPositionByCompanyId,
89
updatePosition,
910
deletePosition,
1011
} = require('../controllers/positionController');
@@ -13,6 +14,7 @@ const router = express.Router();
1314

1415
router.get('/:positionId', getPositionById);
1516
router.get('', getAllPositions);
17+
router.get('/company/:companyId', getPositionByCompanyId);
1618
router.post('', authenticateToken, createPosition);
1719
router.patch('/:positionId', authenticateToken, updatePosition);
1820
router.delete('/:positionId', authenticateToken, deletePosition);

0 commit comments

Comments
 (0)