From 19bbca36cae2c152b2c59362176e3275efdeb9e9 Mon Sep 17 00:00:00 2001 From: Harrison Deng Date: Fri, 1 Apr 2022 10:27:58 -0500 Subject: [PATCH] Refactored schemas, naming, and instantiation files. --- client/config.js | 11 ----- client/package.json | 4 +- ...{MatchController.js => matchController.js} | 25 +++++----- ...{SportController.js => sportController.js} | 16 +++--- .../{UserController.js => userController.js} | 23 ++++----- server/database/mongoose.js | 18 +------ .../middleware/{Authority.js => authority.js} | 4 +- .../middleware/{Database.js => database.js} | 2 +- server/schemas/{Match.js => matchModel.js} | 0 server/schemas/{Sport.js => sportModel.js} | 0 server/schemas/{User.js => userModel.js} | 49 +++++++------------ server/server.js | 24 ++++++--- 12 files changed, 77 insertions(+), 99 deletions(-) delete mode 100644 client/config.js rename server/controllers/{MatchController.js => matchController.js} (75%) rename server/controllers/{SportController.js => sportController.js} (71%) rename server/controllers/{UserController.js => userController.js} (90%) rename server/middleware/{Authority.js => authority.js} (88%) rename server/middleware/{Database.js => database.js} (80%) rename server/schemas/{Match.js => matchModel.js} (100%) rename server/schemas/{Sport.js => sportModel.js} (100%) rename server/schemas/{User.js => userModel.js} (56%) diff --git a/client/config.js b/client/config.js deleted file mode 100644 index e2518ea..0000000 --- a/client/config.js +++ /dev/null @@ -1,11 +0,0 @@ -const prod = { - env: "production", - api_host: "" -}; -const dev = { - env: "development", - api_host: "http://localhost:5000", // web server localhost port -}; - -// export the appropriate environment -export default process.env.NODE_ENV === "production" ? prod : dev; \ No newline at end of file diff --git a/client/package.json b/client/package.json index 0582c96..1e0beaf 100644 --- a/client/package.json +++ b/client/package.json @@ -16,7 +16,7 @@ "web-vitals": "^2.1.4" }, "scripts": { - "start": "react-scripts start", + "start": "NODE_ENV=development API_HOST=http://localhost:5000 react-scripts start", "build": "../scripts/build.py", "test": "react-scripts test", "eject": "react-scripts eject" @@ -43,4 +43,4 @@ "eslint": "^8.12.0", "eslint-plugin-react": "^7.29.4" } -} +} \ No newline at end of file diff --git a/server/controllers/MatchController.js b/server/controllers/matchController.js similarity index 75% rename from server/controllers/MatchController.js rename to server/controllers/matchController.js index 69057d6..3d8d18f 100644 --- a/server/controllers/MatchController.js +++ b/server/controllers/matchController.js @@ -1,15 +1,15 @@ import express from "express"; -import { authenticationGuard } from "../middleware/Authority.js"; -import { needDatabase } from "../middleware/Database.js"; -import Match from "../schemas/Match.js"; -import Sport from "../schemas/Sport.js"; -import User from "../schemas/User.js"; +import { authenticationGuard } from "../middleware/authority.js"; +import { needDatabase } from "../middleware/database.js"; +import matchModel from "../schemas/matchModel.js"; +import sportModel from "../schemas/sportModel.js"; +import userModel from "../schemas/userModel.js"; const MatchController = express.Router(); MatchController.get("/search/:sport", needDatabase, async (req, res) => { try { - let sport = Sport.findByName(req.params.sport); - let query = Match.find({ sport: sport._id }); + let sport = sportModel.findByName(req.params.sport); + let query = matchModel.find({ sport: sport._id }); query.where("dateTime").gte(Date.now); // We don't want to return any results of matches that have already occurred. if (req.query.within) query.where("location").within({ center: req.query.location.split(","), radius: req.query.within }); if (req.query.minDifficulty) query.where("difficulty").gte(req.query.minDifficulty); @@ -28,19 +28,20 @@ MatchController.get("/search/:sport", needDatabase, async (req, res) => { MatchController.post("/", needDatabase, authenticationGuard, async (req, res) => { try { const userId = req.session.userId; - const match = new Match({ + const user = await userModel.findById(userId); + const match = new matchModel({ title: req.body.title, dateTime: req.body.dateTime, public: req.body.public, location: req.body.location, creator: userId, difficulty: req.body.difficulty, - sport: await Sport.findByName(req.body.sport) + sport: await sportModel.findByName(req.body.sport), + participants: [user._id] }); await match.save(); - const user = await User.findById(userId); user.createdMatches.push(match._id); - user.participatingMatches.value.push(match._id); + user.participatingMatches.push(match._id); await user.save(); res.status(201).send(match); } catch (error) { @@ -56,7 +57,7 @@ MatchController.get("/:matchId", needDatabase, async (req, res) => { return; } try { - const match = await Match.findById(req.params.matchId); + const match = await matchModel.findById(req.params.matchId); if (match) { res.status(200).send(match); } else { diff --git a/server/controllers/SportController.js b/server/controllers/sportController.js similarity index 71% rename from server/controllers/SportController.js rename to server/controllers/sportController.js index cf8a65a..40be0c1 100644 --- a/server/controllers/SportController.js +++ b/server/controllers/sportController.js @@ -1,19 +1,19 @@ import express from "express"; -import { authenticationGuard } from "../middleware/Authority.js"; -import { needDatabase } from "../middleware/Database.js"; -import Sport from "../schemas/Sport.js"; -import User from "../schemas/User.js"; +import { authenticationGuard } from "../middleware/authority.js"; +import { needDatabase } from "../middleware/database.js"; +import sportModel from "../schemas/sportModel.js"; +import userModel from "../schemas/userModel.js"; const SportController = express.Router(); SportController.post("/", needDatabase, authenticationGuard, async (req, res) => { - const user = await User.findById(req.session.userId); + const user = await userModel.findById(req.session.userId); try { if (user.accessLevel <= 2) { res.status(403).send("Insufficient privileges."); return; } - const sport = new Sport({ + const sport = new sportModel({ name: req.body.name, maxPlayers: req.body.maxPlayers, minPlayers: req.body.minPlayers, @@ -29,7 +29,7 @@ SportController.post("/", needDatabase, authenticationGuard, async (req, res) => SportController.get("/:sportId", needDatabase, async (req, res) => { try { - res.status(200).send(await Sport.findById(req.params.sportId)); + res.status(200).send(await sportModel.findById(req.params.sportId)); } catch (error) { res.status(500).send("Internal server error."); // TODO: Add proper error checking here. @@ -38,7 +38,7 @@ SportController.get("/:sportId", needDatabase, async (req, res) => { SportController.get("/", needDatabase, async (req, res) => { try { - res.status(200).send(await Sport.find()); + res.status(200).send(await sportModel.find()); } catch (error) { res.status(500).send("Internal server error."); // TODO: Add proper error checking here. diff --git a/server/controllers/UserController.js b/server/controllers/userController.js similarity index 90% rename from server/controllers/UserController.js rename to server/controllers/userController.js index de2dfb1..821e50b 100644 --- a/server/controllers/UserController.js +++ b/server/controllers/userController.js @@ -1,7 +1,7 @@ import express from "express"; -import { authenticationGuard } from "../middleware/Authority.js"; -import { needDatabase } from "../middleware/Database.js"; -import User from "../schemas/User.js"; +import { authenticationGuard } from "../middleware/authority.js"; +import { needDatabase } from "../middleware/database.js"; +import User from "../schemas/userModel.js"; const UserController = express.Router(); UserController.post("/login", needDatabase, async (req, res) => { @@ -14,7 +14,7 @@ UserController.post("/login", needDatabase, async (req, res) => { return; } else { req.session.userId = user._id; - req.session.email = user.email.value; + req.session.email = user.email; res.status(200).send("Authenticated."); } } catch (error) { @@ -54,7 +54,7 @@ UserController.get("/email/:userId?", needDatabase, authenticationGuard, async ( const curUser = await User.findById(req.session.userId); const selUser = req.session.userId === req.params.userId ? curUser : await User.findById(req.params.userId); if (selUser.email.public || curUser._id === selUser._id || curUser.accessLevel > 2) { - res.status(200).send({ email: selUser.email.value }); + res.status(200).send({ email: selUser.email }); } else { res.status(401).send("Could not authenticate request."); } @@ -65,7 +65,7 @@ UserController.get("/firstName/:userId?", needDatabase, authenticationGuard, asy const curUser = await User.findById(req.session.userId); const selUser = req.session.userId === req.params.userId ? curUser : await User.findById(req.params.userId); if (selUser.firstName.public || curUser._id === selUser._id || curUser.accessLevel > 2) { - res.status(200).send({ firstName: selUser.firstName.value }); + res.status(200).send({ firstName: selUser.firstName }); } else { res.status(401).send("Could not authenticate request."); } @@ -76,7 +76,7 @@ UserController.get("/lastName/:userId?", needDatabase, authenticationGuard, asyn const curUser = await User.findById(req.session.userId); const selUser = req.session.userId === req.params.userId ? curUser : await User.findById(req.params.userId); if (selUser.lastName.public || curUser._id === selUser._id || curUser.accessLevel > 2) { - res.status(200).send({ email: selUser.lastName.value }); + res.status(200).send({ email: selUser.lastName }); } else { res.status(401).send("Could not authenticate request."); } @@ -87,7 +87,7 @@ UserController.get("/phone/:userId?", needDatabase, authenticationGuard, async ( const curUser = await User.findById(req.session.userId); const selUser = req.session.userId === req.params.userId ? curUser : await User.findById(req.params.userId); if (selUser.phone.public || curUser._id === selUser._id || curUser.accessLevel > 2) { - res.status(200).send({ phone: selUser.phone.value }); + res.status(200).send({ phone: selUser.phone }); } else { res.status(401).send("Could not authenticate request."); } @@ -95,10 +95,10 @@ UserController.get("/phone/:userId?", needDatabase, authenticationGuard, async ( UserController.get("/participatingMatches/:userId?", needDatabase, authenticationGuard, async (req, res) => { if (!req.params.userId) req.params.userId = req.session.userId; - const curUser = await User.findById(req.session.userId).populate("participatingMatches.value"); + const curUser = await User.findById(req.session.userId); const selUser = req.session.userId === req.params.userId ? curUser : await User.findById(req.params.userId); if (selUser.participatingMatches.public || curUser._id === selUser._id || curUser.accessLevel > 2) { - res.status(200).send({ participatingMatches: selUser.participatingMatches.value }); + res.status(200).send({ participatingMatches: selUser.participatingMatches }); } else { res.status(401).send("Could not authenticate request."); } @@ -117,7 +117,7 @@ UserController.get("/joinDate/:userId?", needDatabase, authenticationGuard, asyn UserController.get("/createdMatches/:userId?", needDatabase, authenticationGuard, async (req, res) => { if (!req.params.userId) req.params.userId = req.session.userId; - const curUser = await User.findById(req.session.userId).populate("createdMatches"); + const curUser = await User.findById(req.session.userId); const selUser = req.session.userId === req.params.userId ? curUser : await User.findById(req.params.userId); if (curUser._id === selUser._id || curUser.accessLevel > 2) { res.status(200).send({ createdMatches: selUser.createdMatches }); @@ -139,6 +139,7 @@ UserController.post("/", needDatabase, async (req, res) => { }); await createdUser.save(); res.sendStatus(201); + return; } catch (err) { if (err.name === "TypeError" || err.name === "ValidationError") { if (process.env.NODE_ENV === "development") { diff --git a/server/database/mongoose.js b/server/database/mongoose.js index ff12926..d772aef 100644 --- a/server/database/mongoose.js +++ b/server/database/mongoose.js @@ -1,16 +1,2 @@ -import mongoose from "mongoose"; - -export const dbName = process.env.DB_NAME || "sm_db"; -export const mongoURI = process.env.MONGODB_URI || "mongodb://127.0.0.1:27017"; - -// Connection documentation: https://mongoosejs.com/docs/connections.html -try { - mongoose.connect(mongoURI, { - useNewUrlParser: true, - useUnifiedTopology: true, - dbName: dbName, - }); -} catch (error) { - console.error(error); -} -export { mongoose }; \ No newline at end of file +export const mongooseDbName = process.env.DB_NAME || "sm_db"; +export const mongoURI = process.env.MONGODB_URI || "mongodb://127.0.0.1:27017"; \ No newline at end of file diff --git a/server/middleware/Authority.js b/server/middleware/authority.js similarity index 88% rename from server/middleware/Authority.js rename to server/middleware/authority.js index eb6eb2e..8c1c082 100644 --- a/server/middleware/Authority.js +++ b/server/middleware/authority.js @@ -1,6 +1,6 @@ import MongoStore from "connect-mongo"; import session from "express-session"; -import { dbName, mongoURI } from "../database/mongoose.js"; +import { mongooseDbName, mongoURI } from "../database/mongoose.js"; const sessionConf = { secret: process.env.SESSION_SECRET || "super duper secret string.", cookie: { @@ -12,7 +12,7 @@ const sessionConf = { }; if (process.env.NODE_ENV === "production") { sessionConf.cookie.secure = true; - sessionConf.store = MongoStore.create({ mongoUrl: mongoURI, dbName: dbName }); + sessionConf.store = MongoStore.create({ mongoUrl: mongoURI, dbName: mongooseDbName }); } export const userSession = session(sessionConf); diff --git a/server/middleware/Database.js b/server/middleware/database.js similarity index 80% rename from server/middleware/Database.js rename to server/middleware/database.js index 7f6a9c0..149344a 100644 --- a/server/middleware/Database.js +++ b/server/middleware/database.js @@ -1,4 +1,4 @@ -import { mongoose } from "../database/mongoose.js"; +import mongoose from "mongoose"; export function needDatabase(res, req, next) { if (mongoose.connection.readyState != 1) { diff --git a/server/schemas/Match.js b/server/schemas/matchModel.js similarity index 100% rename from server/schemas/Match.js rename to server/schemas/matchModel.js diff --git a/server/schemas/Sport.js b/server/schemas/sportModel.js similarity index 100% rename from server/schemas/Sport.js rename to server/schemas/sportModel.js diff --git a/server/schemas/User.js b/server/schemas/userModel.js similarity index 56% rename from server/schemas/User.js rename to server/schemas/userModel.js index 46ea16a..1db4156 100644 --- a/server/schemas/User.js +++ b/server/schemas/userModel.js @@ -7,32 +7,20 @@ const Types = mongoose.Schema.Types; const userSchema = new mongoose.Schema({ email: { - value: { - type: String, - required: true, - minlength: 1, - trim: true, - unique: true, - validate: { - validator: validator.isEmail, - message: "String not email.", - } - }, - public: { type: Boolean, required: true, default: false } - }, - firstName: { - value: { type: String, required: true, trim: true }, - public: { type: Boolean, required: true, default: false } - }, - lastName: { - value: { type: String, required: true, trim: true }, - public: { type: Boolean, required: true, default: false } + type: String, + required: true, + minlength: 1, + trim: true, + unique: true, + validate: { + validator: validator.isEmail, + message: "String not email.", + } }, + firstName: { type: String, required: true, trim: true }, + lastName: { type: String, required: true, trim: true }, joinDate: { type: Date, default: Date.now, required: true }, - phone: { - value: { type: Number, required: false, min: 0 }, - public: { type: Boolean, required: true, default: false } - }, + phone: { type: Number, required: false, min: 0 }, password: { type: String, required: true, @@ -40,16 +28,17 @@ const userSchema = new mongoose.Schema({ // TODO: Custom validator for password requirements? }, createdMatches: { type: [{ type: Types.ObjectId, ref: ModelNameRegister.Match }], required: true, default: [] }, - participatingMatches: { - value: { type: [{ type: Types.ObjectId, ref: ModelNameRegister.Match }], required: true, default: [] }, - public: { type: Boolean, required: true, default: false } - }, - accessLevel: { type: Number, required: true, default: 0 } + participatingMatches: { type: [{ type: Types.ObjectId, ref: ModelNameRegister.Match }], required: true, default: [] }, + emailPublicity: { type: Number, required: true, default: 0 }, + bioPublicity: { type: Boolean, required: true, default: false }, + phonePublicity: { type: Boolean, required: true, default: false }, + participatingMatchesPublicity: { type: Boolean, required: true, default: false }, + accessLevel: { type: Number, required: true, default: 0 }, }); userSchema.statics.credentialsExist = async function (email, password) { let userModel = this; - let user = await userModel.findOne({ "email.value": email }); + let user = await userModel.findOne({ email: email }); if (!user) { return Promise.reject(new Error("Credentials do not exist.")); } diff --git a/server/server.js b/server/server.js index 7115ac3..4ac78cc 100644 --- a/server/server.js +++ b/server/server.js @@ -1,16 +1,28 @@ import express from "express"; import bodyParser from "body-parser"; -import { mongoose } from "./database/mongoose.js"; -import UserController from "./controllers/UserController.js"; -import MatchController from "./controllers/MatchController.js"; -import SportController from "./controllers/SportController.js"; -import { userSession } from "./middleware/Authority.js"; +import mongoose from "mongoose"; +import UserController from "./controllers/userController.js"; +import MatchController from "./controllers/matchController.js"; +import SportController from "./controllers/sportController.js"; +import { userSession } from "./middleware/authority.js"; +import { mongooseDbName, mongoURI } from "./database/mongoose.js"; const server = express(); -const port = process.env.PORT || 3000; +const port = process.env.PORT || 5000; server.use(express.static("public")); // For all client files. +// Connection documentation: https://mongoosejs.com/docs/connections.html +try { + mongoose.connect(mongoURI, { + useNewUrlParser: true, + useUnifiedTopology: true, + dbName: mongooseDbName, + }); +} catch (error) { + console.error(error); +} + if (process.env.NODE_ENV === "development") { mongoose.set("bufferCommands", false); // We want to know if there are connection issues immediately for development. Disables globally. }