Skip to content

Commit 2cc2cee

Browse files
author
Joshua Zhou
committed
api route for checking in teams
1 parent d12fdac commit 2cc2cee

4 files changed

Lines changed: 74 additions & 11 deletions

File tree

app.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ app.use("/", indexRouter);
126126
app.use("/api", apiRouter);
127127

128128
//Custom error handler
129-
app.use((err, req, res, next) => {
129+
app.use((err, req, res) => {
130130
// log the error...
131131
const status = err.status ? err.status : 500;
132132
const message = err.message ? err.message : "Internal Server Error";

controllers/checkin.controller.js

Lines changed: 63 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,84 @@
11
"use strict";
22

33
const Services = {
4-
Sheets: require('../services/sheets.service')
4+
Sheets: require('../services/sheets.service'),
5+
Hacker: require('../services/hacker.service'),
6+
Team: require('../services/team.service'),
7+
Account: require('../services/account.service')
58
};
69

710
/**
811
* @function submitCheckin
9-
* @param {{body: {formData: Object}}} req
12+
* @param {{body: {formData: Object}, user: {id: string}}} req
1013
* @param {*} res
1114
* @return {JSON} Success status
1215
* @description Handles the check-in form submission and adds data to Google Sheets
16+
* Automatically fetches team member emails from the logged-in user's team
1317
*/
1418
async function submitCheckin(req, res) {
1519
try {
16-
await Services.Sheets.appendCheckinData(req.body.formData);
20+
// Get logged-in hacker
21+
const hacker = await Services.Hacker.findByAccountId(req.user.id);
22+
23+
if (!hacker) {
24+
return res.status(404).json({
25+
message: "Hacker not found",
26+
data: {}
27+
});
28+
}
29+
30+
// Check hacker has a team
31+
if (!hacker.teamId) {
32+
return res.status(400).json({
33+
message: "You must be part of a team to submit check-in",
34+
data: {}
35+
});
36+
}
37+
38+
// Fetch team data
39+
const team = await Services.Team.findById(hacker.teamId);
40+
41+
if (!team) {
42+
return res.status(404).json({
43+
message: "Team not found",
44+
data: {}
45+
});
46+
}
47+
48+
// Fetch all team member emails
49+
const teamMemberEmails = [];
50+
for (const memberId of team.members) {
51+
const memberHacker = await Services.Hacker.findById(memberId);
52+
if (memberHacker) {
53+
const memberAccount = await Services.Account.findById(memberHacker.accountId);
54+
if (memberAccount) {
55+
teamMemberEmails.push(memberAccount.email);
56+
}
57+
}
58+
}
59+
60+
// Prepare data for Google Sheets with team member emails
61+
const teamIdString = team._id ? team._id.toString() : hacker.teamId.toString();
62+
63+
const checkinData = {
64+
teamMember1: teamMemberEmails[0] || '',
65+
teamMember2: teamMemberEmails[1] || '',
66+
teamMember3: teamMemberEmails[2] || '',
67+
teamMember4: teamMemberEmails[3] || '',
68+
prizeCategories: req.body.formData.prizeCategories,
69+
sponsorChallenges: req.body.formData.sponsorChallenges,
70+
workshopsAttended: req.body.formData.workshopsAttended,
71+
teamId: teamIdString
72+
};
73+
74+
await Services.Sheets.appendCheckinData(checkinData);
75+
1776
return res.status(200).json({
1877
message: "Check-in data successfully submitted",
1978
data: {}
2079
});
2180
} catch (error) {
81+
console.error('Checkin submission error:', error);
2282
return res.status(500).json({
2383
message: "Error submitting check-in data",
2484
data: {}

routes/api/checkin.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,22 @@ const Middleware = {
1616
* @api {post} /api/hacker/checkin Submit check-in form data
1717
* @apiName SubmitCheckin
1818
* @apiGroup Checkin
19-
* @apiVersion 1.0.0
19+
* @apiVersion 2.0.0
20+
*
21+
* @apiDescription Submits check-in form for the logged-in hacker's team.
22+
* Team member emails are automatically fetched from the team.
23+
* Hacker must be part of a team to submit.
2024
*
2125
* @apiParam {Object} formData The check-in form data
22-
* @apiParam {String} formData.teamMember1 First team member's name
23-
* @apiParam {String} [formData.teamMember2] Second team member's name
24-
* @apiParam {String} [formData.teamMember3] Third team member's name
25-
* @apiParam {String} [formData.teamMember4] Fourth team member's name
2626
* @apiParam {String[]} formData.prizeCategories Array of prize categories
2727
* @apiParam {String[]} formData.sponsorChallenges Array of sponsor challenges
2828
* @apiParam {String[]} formData.workshopsAttended Array of workshops attended
2929
*
3030
* @apiSuccess {String} message Success message
3131
*
3232
* @apiError {String} message Error message
33+
* @apiError (400) {String} message "You must be part of a team to submit check-in"
34+
* @apiError (404) {String} message "Hacker not found" or "Team not found"
3335
*/
3436
router.post(
3537
"/checkin",

services/sheets.service.js

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,14 +55,15 @@ class SheetsService {
5555
formData.teamMember4 || '',
5656
Array.isArray(formData.prizeCategories) ? formData.prizeCategories.join(', ') : '',
5757
Array.isArray(formData.sponsorChallenges) ? formData.sponsorChallenges.join(', ') : '',
58-
Array.isArray(formData.workshopsAttended) ? formData.workshopsAttended.join(', ') : ''
58+
Array.isArray(formData.workshopsAttended) ? formData.workshopsAttended.join(', ') : '',
59+
formData.teamId || '' // Add teamId as the 9th column
5960
]];
6061

6162
Logger.info('Formatted data for spreadsheet:', values);
6263

6364
const request = {
6465
spreadsheetId: this.spreadsheetId,
65-
range: 'Sheet1!A:H', // Adjust range as needed
66+
range: 'Sheet1!A:I', // Updated to include column I for teamId
6667
valueInputOption: 'USER_ENTERED',
6768
insertDataOption: 'INSERT_ROWS',
6869
resource: {

0 commit comments

Comments
 (0)