diff --git a/client/src/components/exercise/lab6/components/QuestionsHandler.jsx b/client/src/components/exercise/lab6/components/QuestionsHandler.jsx index 3282ea2df..268e71a32 100644 --- a/client/src/components/exercise/lab6/components/QuestionsHandler.jsx +++ b/client/src/components/exercise/lab6/components/QuestionsHandler.jsx @@ -19,7 +19,7 @@ const QuestionsHandler = (props) => { */ function onComplete() { console.log("completed", selectedAnswers); - handleContinue(); + handleContinue(selectedAnswers); } /** diff --git a/client/src/components/exercise/lab6/pages/Applicant/AIAnalysisQuestions.js b/client/src/components/exercise/lab6/pages/Applicant/AIAnalysisQuestions.js index b426a1cea..f49efa0d4 100644 --- a/client/src/components/exercise/lab6/pages/Applicant/AIAnalysisQuestions.js +++ b/client/src/components/exercise/lab6/pages/Applicant/AIAnalysisQuestions.js @@ -4,6 +4,7 @@ import React, { useEffect } from "react"; import { navigate } from "@reach/router"; import { EXERCISE_PLAYING } from "../../../../../constants/lab6"; import QuestionsHandler from "../../components/QuestionsHandler"; +import ExerciseService from "../../../../../services/lab6/ExerciseService"; const AIAnalysisQuestions = (props) => { const { actions } = props; @@ -12,14 +13,9 @@ const AIAnalysisQuestions = (props) => { actions.updateState(EXERCISE_PLAYING); }, [actions]); - function checkValue(e) { - var value = e.target.value; - console.log("You selected " + value); - } - - //changed so it doesn't skip phase 2 - const handleContinue = () => { - navigate("/Lab6/Exercise/EmployerStart"); //How should we handle this (positive or negative) + const handleContinue = (answers) => { + ExerciseService.submitAIAnalysisQuestion(Array.from(answers[0])); + navigate("/Lab6/Exercise/EmployerStart"); }; const aiAnalysisData = [ diff --git a/client/src/components/exercise/lab6/pages/Applicant/AvatarSelection.js b/client/src/components/exercise/lab6/pages/Applicant/AvatarSelection.js index 7c8f644c8..311d8343e 100644 --- a/client/src/components/exercise/lab6/pages/Applicant/AvatarSelection.js +++ b/client/src/components/exercise/lab6/pages/Applicant/AvatarSelection.js @@ -4,6 +4,7 @@ import React, { useEffect, useState } from "react"; import { navigate } from "@reach/router"; import { EXERCISE_PLAYING } from "../../../../../constants/lab6"; import GridImages from "../../../../body/lab/GridImages/GridImages"; +import ExerciseService from "../../../../../services/lab6/ExerciseService"; const AvatarSelection = (props) => { const { actions } = props; @@ -15,7 +16,10 @@ const AvatarSelection = (props) => { }, [actions]); const confirmSelection = () => { - navigate("/Lab6/Exercise/QualificationQuestions"); + if (avatar.length != 0) { + ExerciseService.submitAvatar(avatar); + navigate("/Lab6/Exercise/QualificationQuestions"); + } }; return ( diff --git a/client/src/components/exercise/lab6/pages/Applicant/QualificationQuestions.js b/client/src/components/exercise/lab6/pages/Applicant/QualificationQuestions.js index b0b4c23ae..326b3d6b4 100644 --- a/client/src/components/exercise/lab6/pages/Applicant/QualificationQuestions.js +++ b/client/src/components/exercise/lab6/pages/Applicant/QualificationQuestions.js @@ -1,10 +1,11 @@ /* eslint-disable no-undef */ /* eslint-disable react/prop-types */ /* eslint-disable no-unused-vars */ -import React, { useEffect, useState } from "react"; +import React, { useEffect } from "react"; import { navigate } from "@reach/router"; import { EXERCISE_PLAYING } from "../../../../../constants/lab6"; import QuestionsHandler from "../../components/QuestionsHandler"; +import ExerciseService from "../../../../../services/lab6/ExerciseService"; function QualificationQuestions(props) { const { actions } = props; @@ -13,7 +14,8 @@ function QualificationQuestions(props) { actions.updateState(EXERCISE_PLAYING); }, [actions]); - const handleContinue = () => { + const handleContinue = (answers) => { + ExerciseService.submitQualQuestions(answers); navigate("/Lab6/Exercise/AnalyzeData"); }; diff --git a/client/src/components/exercise/lab6/pages/Employer/AIReasoningQuestions.js b/client/src/components/exercise/lab6/pages/Employer/AIReasoningQuestions.js index c281ae6cd..da7e8909d 100644 --- a/client/src/components/exercise/lab6/pages/Employer/AIReasoningQuestions.js +++ b/client/src/components/exercise/lab6/pages/Employer/AIReasoningQuestions.js @@ -3,6 +3,7 @@ import React, { useEffect } from "react"; import { navigate } from "@reach/router"; import { EXERCISE_PLAYING } from "../../../../../constants/lab6"; import QuestionsHandler from "../../components/QuestionsHandler"; +import ExerciseService from "../../../../../services/lab6/ExerciseService"; const AIReasoningQuestions = (props) => { const { actions } = props; @@ -11,7 +12,8 @@ const AIReasoningQuestions = (props) => { actions.updateState(EXERCISE_PLAYING); }, [actions]); - const handleContinue = () => { + const handleContinue = (answers) => { + ExerciseService.submitAIReasoningQuestion(Array.from(answers[0])); navigate("/Lab6/Exercise/AIReasoning"); }; const aiReasoningData = [ diff --git a/client/src/components/exercise/lab6/pages/Employer/HiringCandidate.js b/client/src/components/exercise/lab6/pages/Employer/HiringCandidate.js index 3f8b47bbc..53147def7 100644 --- a/client/src/components/exercise/lab6/pages/Employer/HiringCandidate.js +++ b/client/src/components/exercise/lab6/pages/Employer/HiringCandidate.js @@ -7,14 +7,10 @@ import { useEffect, useState } from "react"; import { EXERCISE_PLAYING } from "../../../../../constants/lab6"; import GridApplicants from "../../components/GridApplicants"; import { Modal, ModalBody, ModalFooter, Button } from "reactstrap"; - -//need to make sure that only when the AI doesn't recommend them and that when they are selected that the modal appears -//modal doesn't appear for the last hiring candidate selection; needs to -//need to make the bias against the glasses editable, so that when someone edits the table later the bias can change here as well +import ExerciseService from "../../../../../services/lab6/ExerciseService"; const HiringCandidate = (props) => { - //added avatar and accessoriestype modeled after bias.jsx - const { actions, avatar, accessoriesType, biasType } = props; + const { actions } = props; const [roundOfApplicants, setRoundOfApplicants] = useState(0); @@ -35,7 +31,7 @@ const HiringCandidate = (props) => { answers.push(selection); setAnswers(answers); if (roundOfApplicants > 2) { - console.log(userAnswers); + ExerciseService.submitHiredCanidates(answers); navigate("/Lab6/Exercise/AIReasoningQuestions"); } else { setRoundOfApplicants(roundCount + 1); @@ -65,6 +61,7 @@ const HiringCandidate = (props) => { setAnswers(answers); if (roundOfApplicants > 2) { console.log(userAnswers); + ExerciseService.submitHiredCanidates(answers); navigate("/Lab6/Exercise/AIReasoningQuestions"); } else { let roundCount = roundOfApplicants; diff --git a/client/src/services/lab6/ExerciseService.js b/client/src/services/lab6/ExerciseService.js new file mode 100644 index 000000000..8d56c4729 --- /dev/null +++ b/client/src/services/lab6/ExerciseService.js @@ -0,0 +1,65 @@ +/* eslint-disable no-undef */ +import API from "../API"; + +const endpoints = { + SUBMIT_AVATAR: "/lab6/exercise/avatar", + SUBMIT_QUAL_QUESTIONS: "/lab6/exercise/qualquestions", + SUBMIT_AI_ANALYSIS_QUESTION: "/lab6/exercise/aianalysisquestion", + SUBMIT_HIRED_CANIDATES: "/lab6/exercise/hiredcanidates", + SUBMIT_AI_REASONING_QUESTIONS: "/lab6/exercise/aireasoningquestion", + SUBMIT_FIXED_HIRED_CANIDATES: "/lab6/exercise/fixedhiredcanidates", +}; + +const ExerciseService = { + submitAvatar: (avatar) => { + return API.postWithBody( + process.env.REACT_APP_SERVER_URL + endpoints.SUBMIT_AVATAR, + { + avatar, + } + ); + }, + submitQualQuestions: (qualQuestions) => { + return API.postWithBody( + process.env.REACT_APP_SERVER_URL + endpoints.SUBMIT_QUAL_QUESTIONS, + { + qualQuestions, + } + ); + }, + submitAIAnalysisQuestion: (aiAnalysisQuestion) => { + return API.postWithBody( + process.env.REACT_APP_SERVER_URL + endpoints.SUBMIT_AI_ANALYSIS_QUESTION, + { + aiAnalysisQuestion, + } + ); + }, + submitHiredCanidates: (hiredCanidates) => { + return API.postWithBody( + process.env.REACT_APP_SERVER_URL + endpoints.SUBMIT_HIRED_CANIDATES, + { + hiredCanidates, + } + ); + }, + submitAIReasoningQuestion: (aiReasoningQuestion) => { + return API.postWithBody( + process.env.REACT_APP_SERVER_URL + + endpoints.SUBMIT_AI_REASONING_QUESTIONS, + { + aiReasoningQuestion, + } + ); + }, + submitFixedHiredCanidates: (fixedHiredCanidates) => { + return API.postWithBody( + process.env.REACT_APP_SERVER_URL + endpoints.SUBMIT_FIXED_HIRED_CANIDATES, + { + fixedHiredCanidates, + } + ); + }, +}; + +export default ExerciseService; diff --git a/client/src/services/lab6/RepairService.js b/client/src/services/lab6/RepairService.js new file mode 100644 index 000000000..ec0d61aea --- /dev/null +++ b/client/src/services/lab6/RepairService.js @@ -0,0 +1,20 @@ +/* eslint-disable no-undef */ +import API from "../API"; + +const endpoints = { + SUBMIT_REPAIR: "/lab5/repair/submit", +}; + +const RepairService = { + submitRepair: (activity, repair) => { + return API.postWithBody( + process.env.REACT_APP_SERVER_URL + endpoints.SUBMIT_REPAIR, + { + activity, + repair, + } + ); + }, +}; + +export default RepairService; diff --git a/server/controllers/lab6/ExerciseController.js b/server/controllers/lab6/ExerciseController.js new file mode 100644 index 000000000..c6692905e --- /dev/null +++ b/server/controllers/lab6/ExerciseController.js @@ -0,0 +1,61 @@ +const ExerciseService = require('../../services/lab6/ExerciseService'); + +exports.submitAvatar = (req, res) => { + ExerciseService.submitAvatar({ + usersessionid: req.session.token, + avatar: req.body.avatar, + }).then((id) => { + req.session.exercise = id; + res.sendStatus(200); + }); +}; + +exports.submitQualQuestions = (req, res) => { + ExerciseService.submitQualQuestions({ + usersessionid: req.session.token, + qualQuestions: req.body.qualQuestions, + }).then((id) => { + req.session.exercise = id; + res.sendStatus(200); + }); +}; + +exports.submitAIanalysisQuestion = (req, res) => { + ExerciseService.submitAIAnalysisQuestion({ + usersessionid: req.session.token, + aiAnalysisQuestion: req.body.aiAnalysisQuestion, + }).then((id) => { + req.session.exercise = id; + res.sendStatus(200); + }); +}; + +exports.submitHiredCanidates = (req, res) => { + ExerciseService.submitHiredCanidates({ + usersessionid: req.session.token, + hiredCanidates: req.body.hiredCanidates, + }).then((id) => { + req.session.exercise = id; + res.sendStatus(200); + }); +}; + +exports.submitAIReasoningQuestion = (req, res) => { + ExerciseService.submitAIReasoningQuestion({ + usersessionid: req.session.token, + aiReasoningQuestion: req.body.aiReasoningQuestion, + }).then((id) => { + req.session.exercise = id; + res.sendStatus(200); + }); +}; + +exports.submitFixedHiredCanidates = (req, res) => { + ExerciseService.submitFixedHiredCanidates({ + usersessionid: req.session.token, + fixedHiredCanidates: req.body.fixedHiredCanidates, + }).then((id) => { + req.session.exercise = id; + res.sendStatus(200); + }); +}; diff --git a/server/controllers/lab6/RepairController.js b/server/controllers/lab6/RepairController.js new file mode 100644 index 000000000..c7f228c82 --- /dev/null +++ b/server/controllers/lab6/RepairController.js @@ -0,0 +1,11 @@ +const RepairService = require('../../services/lab5/RepairService'); + +exports.submitChange = (req, res) => { + RepairService.submitChange({ + usersessionid: req.session.token, + activity: req.body.activity, + repair: req.body.repair, + }).then(() => { + res.sendStatus(200); + }); +}; diff --git a/server/database/models/lab6/Exercise.js b/server/database/models/lab6/Exercise.js index 8b5bb69df..106f6c421 100644 --- a/server/database/models/lab6/Exercise.js +++ b/server/database/models/lab6/Exercise.js @@ -13,9 +13,9 @@ module.exports = (sequelize, DataTypes) => { }, avatar: {type: DataTypes.JSON}, qualificationquestions: {type: DataTypes.JSON}, - aianalysisquestion: {type: DataTypes.STRING}, + aianalysisquestion: {type: DataTypes.JSON}, hiredcanidates: {type: DataTypes.JSON}, - aireasoningquestion: {type: DataTypes.STRING}, + aireasoningquestion: {type: DataTypes.JSON}, fixedhiredcanidates: {type: DataTypes.JSON}, }, {tableName: 'lab6_exercise'}, diff --git a/server/routes/index.js b/server/routes/index.js index 11b161946..46c3774f2 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -25,6 +25,10 @@ const RepairControllerLab4 = require('../controllers/lab4/RepairController'); const RepairControllerLab5 = require('../controllers/lab5/RepairController'); const ExerciseControllerLab5 = require('../controllers/lab5/ExerciseController'); +// LAB6 Controller +// const RepairControllerLab6 = require('../controllers/lab6/RepairController'); +const ExerciseControllerLab6 = require('../controllers/lab6/ExerciseController'); + // Lab Controller const LabController = require('../controllers/LabController'); @@ -79,6 +83,13 @@ router.post('/lab1/exercise/round', ExerciseControllerLab1.createRound); router.post('/lab1/exercise/choice', ExerciseControllerLab1.createChoice); router.post('/lab1/exercise/end', ExerciseControllerLab1.updateEndExerciseScore); router.post('/lab5/exercise/choice', ExerciseControllerLab5.submitChoice); +router.post('/lab6/exercise/avatar', ExerciseControllerLab6.submitAvatar); +router.post('/lab6/exercise/qualquestions', ExerciseControllerLab6.submitQualQuestions); +router.post('/lab6/exercise/aianalysisquestion', ExerciseControllerLab6.submitAIanalysisQuestion); +router.post('/lab6/exercise/hiredcanidates', ExerciseControllerLab6.submitHiredCanidates); +router.post('/lab6/exercise/aireasoningquestion', ExerciseControllerLab6.submitAIReasoningQuestion); +router.post('/lab6/exercise/fixedhiredcanidates', ExerciseControllerLab6.submitFixedHiredCanidates); + // Code Editor Routes router.post('/lab1/repair/submit', RepairControllerLab1.submitChange); router.post('/lab2/repair/submit', RepairControllerLab2.submitChange); diff --git a/server/services/lab6/ExerciseService.js b/server/services/lab6/ExerciseService.js new file mode 100644 index 000000000..60c1f1cc8 --- /dev/null +++ b/server/services/lab6/ExerciseService.js @@ -0,0 +1,164 @@ +const db = require('../../database'); +exports.submitAvatar = (data) => { + if (data.usersessionid) { + return db.ExerciseLab6.findOne({ + where: + { + usersessionid: data.usersessionid, + }, + }, + ).then((user) => { + if (user !== null) { + user.avatar = data.avatar; + user.save(); + } else { + db.ExerciseLab6.create({ + usersessionid: data.usersessionid, + avatar: data.avatar, + }); + } + return true; + }).catch((err) => { + console.log(err); + return true; + }); + } + return Promise.resolve(); +}; + +exports.submitQualQuestions = (data) => { + if (data.usersessionid) { + return db.ExerciseLab6.findOne({ + where: + { + usersessionid: data.usersessionid, + }, + }, + ).then((user) => { + if (user !== null) { + user.qualificationquestions = data.qualQuestions; + user.save(); + } else { + db.ExerciseLab6.create({ + usersessionid: data.usersessionid, + qualificationquestions: data.qualQuestions, + }); + } + return true; + }).catch((err) => { + console.log(err); + return true; + }); + } + return Promise.resolve(); +}; + +exports.submitAIAnalysisQuestion = (data) => { + if (data.usersessionid) { + return db.ExerciseLab6.findOne({ + where: + { + usersessionid: data.usersessionid, + }, + }, + ).then((user) => { + if (user !== null) { + user.aianalysisquestion = data.aiAnalysisQuestion; + user.save(); + } else { + db.ExerciseLab6.create({ + usersessionid: data.usersessionid, + aianalysisquestion: data.aiAnalysisQuestion, + }); + } + return true; + }).catch((err) => { + console.log(err); + return true; + }); + } + return Promise.resolve(); +}; + +exports.submitHiredCanidates = (data) => { + console.log('\n\n\n\n\n\n\n\n\n\n', data); + if (data.usersessionid) { + return db.ExerciseLab6.findOne({ + where: + { + usersessionid: data.usersessionid, + }, + }, + ).then((user) => { + if (user !== null) { + user.hiredcanidates = data.hiredCanidates; + user.save(); + } else { + db.ExerciseLab6.create({ + usersessionid: data.usersessionid, + hiredcanidates: data.hiredCanidates, + }); + } + return true; + }).catch((err) => { + console.log(err); + return true; + }); + } + return Promise.resolve(); +}; + +exports.submitAIReasoningQuestion = (data) => { + console.log('\n\n\n\n\n\n\n\n\n\n', data); + if (data.usersessionid) { + return db.ExerciseLab6.findOne({ + where: + { + usersessionid: data.usersessionid, + }, + }, + ).then((user) => { + if (user !== null) { + user.aireasoningquestion = data.aiReasoningQuestion; + user.save(); + } else { + db.ExerciseLab6.create({ + usersessionid: data.usersessionid, + aireasoningquestion: data.aiReasoningQuestion, + }); + } + return true; + }).catch((err) => { + console.log(err); + return true; + }); + } + return Promise.resolve(); +}; + +exports.submitFixedHiredCanidates = (data) => { + if (data.usersessionid) { + return db.ExerciseLab6.findOne({ + where: + { + usersessionid: data.usersessionid, + }, + }, + ).then((user) => { + if (user !== null) { + user.fixedhiredcanidates = data.fixedHiredCanidates; + user.save(); + } else { + db.ExerciseLab6.create({ + usersessionid: data.usersessionid, + fixedhiredcanidates: data.fixedHiredCanidates, + }); + } + return true; + }).catch((err) => { + console.log(err); + return true; + }); + } + return Promise.resolve(); +}; diff --git a/server/services/lab6/RepairService.js b/server/services/lab6/RepairService.js new file mode 100644 index 000000000..c1f316f68 --- /dev/null +++ b/server/services/lab6/RepairService.js @@ -0,0 +1,15 @@ +const db = require('../../database'); + +exports.submitChange = (data) => { + return db.RepairLab5.create({ + usersessionid: data.usersessionid, + activity: data.activity, + repair: data.repair, + }) + .then(() => { + return true; + }) + .catch((err) => { + console.log(err); + }); +};