diff --git a/README.md b/README.md index da31040..a64f604 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ 3. ... ## Slides and Resources - +hello world ## Running this project This is the finished project for ACM Hack School 2025.\ diff --git a/server/config/server.js b/server/config/server.js index ba457eb..0c34aee 100644 --- a/server/config/server.js +++ b/server/config/server.js @@ -10,3 +10,10 @@ const config = { }; module.exports = config; + + +const mongoose = require('mongoose'); +mongoose + .connect(config.DB_URL) + .then(() => console.log('Connected to MongoDB')) + .catch((err) => console.error('Error connecting to MongoDB: ', err)); diff --git a/server/controllers/pollController.js b/server/controllers/pollController.js index 5e8e420..0d0a956 100644 --- a/server/controllers/pollController.js +++ b/server/controllers/pollController.js @@ -1,25 +1,28 @@ -const Poll = require('../models/Poll'); +// TODO +// ACTIVITY - Refactor all controller functions to handle requests! -const getPolls = async (req, res) => { - const poll = await Poll.find(); +const Poll = require("../models/Poll"); - console.log('Returning polls list...'); - res.status(200).json(poll); +// add req, res to parameters +const getPolls = async () => { + const poll = await Poll.find(); + console.log("Returning polls list..."); + return poll; // refactor for 200 status code response }; -const getPoll = async (req, res) => { - const { id } = req.params; +// replace id with req, res in parameters +const getPoll = async (id) => { + // extract id from req.params const poll = await Poll.findById(id); console.log(`Returning poll ${id}`); - res.status(200).json(poll); + return poll; // refactor for 200 status code response }; -const postPoll = async (req, res) => { - const { ownerId, title, description, options } = req.body; - - if (!ownerId || !title || !options) - return res.status(404).json({ error: 'Invalid request' }); +// replace {} parameter with req, res +const postPoll = async ({ ownerId, title, description, options }) => { + // extract poll information from req + if (!ownerId || !title || !options) return; // replace with 404 Error const poll = new Poll({ ownerId: ownerId, @@ -29,31 +32,28 @@ const postPoll = async (req, res) => { }); await poll.save(); - - res.status(200).json(poll); + return poll; // replace with status code 200 response }; -const postVote = async (req, res) => { - const { pollId, optionId } = req.body; - - if (!pollId || !optionId) - return res.status(400).json({ error: 'Invalid request' }); +// replace pollId and optionId with req, res +const postVote = async ({ pollId, optionId }) => { + // extract pollId and optionId from req + if (!pollId || !optionId) return; // update for 400 Error const updateOption = await Poll.updateOne( - { _id: pollId, 'options._id': optionId }, + { _id: pollId, "options._id": optionId }, { - $inc: { 'options.$.count': 1, totalVotes: 1 }, + $inc: { "options.$.count": 1, totalVotes: 1 }, } ); - if (updateOption.modifiedCount == 0) - return res.status(400).json({ error: 'Failed to update poll' }); + if (updateOption.modifiedCount == 0) return "Error: failed to update poll"; // update for 400 Error const updatedPoll = await Poll.findById(pollId); console.log(`Vote cast for ${pollId} on option ${optionId}`); - res.status(200).json(updatedPoll); + return updatedPoll; // update for status code 200 res }; module.exports = { getPolls, getPoll, postPoll, postVote }; diff --git a/server/models/Poll.js b/server/models/Poll.js index 0a9ebcb..e69de29 100644 --- a/server/models/Poll.js +++ b/server/models/Poll.js @@ -1,30 +0,0 @@ -const mongoose = require('mongoose'); - -const OptionSchema = new mongoose.Schema( - { - option: String, - count: Number, - }, - { _id: true } -); - -const PollSchema = new mongoose.Schema( - { - ownerId: { - type: String, - required: true, - }, - title: { - type: String, - required: true, - }, - description: String, - options: [OptionSchema], - totalVotes: Number, - }, - { id: true } -); - -const Poll = mongoose.model('Poll', PollSchema); - -module.exports = Poll; diff --git a/server/package-lock.json b/server/package-lock.json index cf1192f..0e3b08b 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -12,7 +12,7 @@ "cors": "^2.8.5", "express": "^5.1.0", "mongodb": "^6.18.0", - "mongoose": "^8.17.0" + "mongoose": "^8.19.2" }, "devDependencies": { "dotenv": "^17.2.1", @@ -714,13 +714,14 @@ } }, "node_modules/mongodb": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.18.0.tgz", - "integrity": "sha512-fO5ttN9VC8P0F5fqtQmclAkgXZxbIkYRTUi1j8JO6IYwvamkhtYDilJr35jOPELR49zqCJgXZWwCtW7B+TM8vQ==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-6.20.0.tgz", + "integrity": "sha512-Tl6MEIU3K4Rq3TSHd+sZQqRBoGlFsOgNrH5ltAcFBV62Re3Fd+FcaVf8uSEQFOJ51SDowDVttBTONMfoYWrWlQ==", + "license": "Apache-2.0", "dependencies": { - "@mongodb-js/saslprep": "^1.1.9", + "@mongodb-js/saslprep": "^1.3.0", "bson": "^6.10.4", - "mongodb-connection-string-url": "^3.0.0" + "mongodb-connection-string-url": "^3.0.2" }, "engines": { "node": ">=16.20.1" @@ -731,7 +732,7 @@ "gcp-metadata": "^5.2.0", "kerberos": "^2.0.1", "mongodb-client-encryption": ">=6.0.0 <7", - "snappy": "^7.2.2", + "snappy": "^7.3.2", "socks": "^2.7.1" }, "peerDependenciesMeta": { @@ -768,13 +769,14 @@ } }, "node_modules/mongoose": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.17.0.tgz", - "integrity": "sha512-mxW6TBPHViORfNYOFXCVOnT4d5aRr+CgDxTs1ViYXfuHzNpkelgJQrQa+Lz6hofoEQISnKlXv1L3ZnHyJRkhfA==", + "version": "8.19.2", + "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-8.19.2.tgz", + "integrity": "sha512-ww2T4dBV+suCbOfG5YPwj9pLCfUVyj8FEA1D3Ux1HHqutpLxGyOYEPU06iPRBW4cKr3PJfOSYsIpHWPTkz5zig==", + "license": "MIT", "dependencies": { "bson": "^6.10.4", "kareem": "2.6.3", - "mongodb": "~6.18.0", + "mongodb": "~6.20.0", "mpath": "0.9.0", "mquery": "5.0.0", "ms": "2.1.3", diff --git a/server/package.json b/server/package.json index 4329b39..306cc97 100644 --- a/server/package.json +++ b/server/package.json @@ -6,7 +6,9 @@ "scripts": { "test": "echo \"Error: no test specified\" && exit 1", "start": "node server.js", - "dev": "nodemon server.js" + "dev": "nodemon server.js", + "testController": "nodemon testController.js", + "testSchema": "node testSchema.js" }, "author": "", "license": "ISC", @@ -18,6 +20,6 @@ "cors": "^2.8.5", "express": "^5.1.0", "mongodb": "^6.18.0", - "mongoose": "^8.17.0" + "mongoose": "^8.19.2" } } diff --git a/server/routes/router.js b/server/routes/router.js index 8eed671..9e540ce 100644 --- a/server/routes/router.js +++ b/server/routes/router.js @@ -1,6 +1,7 @@ const express = require('express'); const router = express.Router(); +// ACTIVITY: Create routes that call controller functions when rrequested const pollController = require('../controllers/pollController'); router.get('/polls/id/:id', pollController.getPoll); diff --git a/server/server.js b/server/server.js index 07b76fc..5805824 100644 --- a/server/server.js +++ b/server/server.js @@ -1,21 +1,19 @@ -const express = require('express'); -const cors = require('cors'); -const config = require('./config/server'); -const router = require('./routes/router'); -const mongoose = require('mongoose'); +const express = require("express"); +const cors = require("cors"); +const config = require("./config/server"); +const router = require("./routes/router"); const server = express(); server.use(cors()); server.use(express.json()); -server.use('/api', router); +server.use("/api", router); -mongoose - .connect(config.DB_URL) - .then(() => console.log('Connected to MongoDB')) - .catch((err) => console.error('Error connecting to MongoDB: ', err)); +// TODO +// SETUP ACTIVITY: Put the code to connect to MongoDB below! +// END SETUP ACTIVITY server.listen(config.PORT, () => { - console.log('Server started listening on PORT ' + config.PORT); + console.log("Server started listening on PORT " + config.PORT); }); diff --git a/server/testController.js b/server/testController.js new file mode 100644 index 0000000..1f4f096 --- /dev/null +++ b/server/testController.js @@ -0,0 +1,68 @@ +const mongoose = require("mongoose"); +const dotenv = require("dotenv"); +dotenv.config(); +// create config object witH PORT +const config = { + PORT: process.env.PORT, + DB_URL: process.env.DB_URL, +}; +mongoose + .connect(config.DB_URL) + .then(() => console.log("Connected to MongoDB")) + .catch((err) => console.error("Error connecting to MongoDB: ", err)); + +// Uncomment this code block to test getPolls + +// const { getPolls } = require("./controllers/pollController"); + +// (async () => { +// console.log("Running getPolls()..."); +// const result = await getPolls(); +// console.log(result); +// })(); + +// Uncomment this code block to test getPoll + +// const { getPoll } = require("./controllers/pollController"); + +// (async () => { +// console.log("Running getPoll()..."); +// const result = await getPoll("67144a73c527df736fbe5eac"); +// console.log(result); +// })(); + +// Uncomment this code block to test postPoll + +// const { postPoll } = require("./controllers/pollController"); + +// (async () => { +// console.log("Running postPoll()..."); +// const result = await postPoll({ +// ownerId: "Tyler", +// title: "Tyler's poll", +// description: "Tyler's poll description", +// options: [ +// { +// option: "Poll option #1", +// count: 0, +// }, +// ], +// }); +// console.log(result); +// })(); + +// Uncomment this code block to test postVote + +// const { postVote } = require("./controllers/pollController"); + +// (async () => { +// console.log("Running postVote()..."); +// const result = await postVote( +// { +// pollId: "67144a73c527df736fbe5eac", +// optionId: "67144a73c527df736fbe5ead", +// }, +// {} +// ); +// console.log(result); +// })(); diff --git a/server/testSchema.js b/server/testSchema.js new file mode 100644 index 0000000..073d846 --- /dev/null +++ b/server/testSchema.js @@ -0,0 +1,38 @@ +const mongoose = require("mongoose"); +const dotenv = require("dotenv"); +dotenv.config(); +// create config object witH PORT +const config = { + PORT: process.env.PORT, + DB_URL: process.env.DB_URL, +}; +mongoose + .connect(config.DB_URL) + .then(() => console.log("Connected to MongoDB")) + .catch((err) => console.error("Error connecting to MongoDB: ", err)); + +const Poll = require("./models/Poll"); + +const testSchema = async (req, res) => { + const poll = new Poll({ + _id: mongoose.Types.ObjectId.createFromHexString( + "67144a73c527df736fbe5eac" + ), + ownerId: "Your name!", + title: "Your awesome poll title!", + description: "A meh poll description", + options: [ + { + option: "Poll option 1", + count: 0, + _id: mongoose.Types.ObjectId.createFromHexString( + "67144a73c527df736fbe5ead" + ), + }, + ], + }); + await poll.save(); + console.log("Success!"); +}; + +testSchema();