Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
3. ...

## Slides and Resources

hello world
## Running this project

This is the finished project for ACM Hack School 2025.\
Expand Down
7 changes: 7 additions & 0 deletions server/config/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -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));
50 changes: 25 additions & 25 deletions server/controllers/pollController.js
Original file line number Diff line number Diff line change
@@ -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,
Expand All @@ -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 };
30 changes: 0 additions & 30 deletions server/models/Poll.js
Original file line number Diff line number Diff line change
@@ -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;
24 changes: 13 additions & 11 deletions server/package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 4 additions & 2 deletions server/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -18,6 +20,6 @@
"cors": "^2.8.5",
"express": "^5.1.0",
"mongodb": "^6.18.0",
"mongoose": "^8.17.0"
"mongoose": "^8.19.2"
}
}
1 change: 1 addition & 0 deletions server/routes/router.js
Original file line number Diff line number Diff line change
@@ -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);
Expand Down
20 changes: 9 additions & 11 deletions server/server.js
Original file line number Diff line number Diff line change
@@ -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);
});
68 changes: 68 additions & 0 deletions server/testController.js
Original file line number Diff line number Diff line change
@@ -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);
// })();
38 changes: 38 additions & 0 deletions server/testSchema.js
Original file line number Diff line number Diff line change
@@ -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();