From 8a3de628a68309806e4b9682c2a5e7ad814d7061 Mon Sep 17 00:00:00 2001 From: Harrison Deng Date: Fri, 1 Apr 2022 11:16:24 -0500 Subject: [PATCH] Created a recent endpoint for matches. Added a field to record creation time of a match. Additionally performed some minor refactoring. --- server/controllers/matchController.js | 28 +++++++++++++++++-- server/schemas/matchModel.js | 11 ++++---- ...elNameRegister.js => modelNameRegister.js} | 0 server/schemas/sportModel.js | 2 +- server/schemas/userModel.js | 9 +++--- 5 files changed, 37 insertions(+), 13 deletions(-) rename server/schemas/{ModelNameRegister.js => modelNameRegister.js} (100%) diff --git a/server/controllers/matchController.js b/server/controllers/matchController.js index 3d8d18f..bfb9080 100644 --- a/server/controllers/matchController.js +++ b/server/controllers/matchController.js @@ -10,11 +10,12 @@ MatchController.get("/search/:sport", needDatabase, async (req, res) => { try { 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. + query.where("when").gte(Date.now); // We don't want to return any results of matches that have already occurred. + if (req.session.userId) query.where("publicity").gte(1).where("friends").in(req.session.userId); 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); if (req.query.maxDifficulty) query.where("difficulty").lte(req.query.maxDifficulty); - if (req.query.beforeDate) query.where("dateTime").lte(req.query.beforeDate); + if (req.query.beforeDate) query.where("when").lte(req.query.beforeDate); let queryResults = await query; res.send({ queryResults }); @@ -24,6 +25,27 @@ MatchController.get("/search/:sport", needDatabase, async (req, res) => { } }); +MatchController.get("/recent/:limit?", needDatabase, async (req, res) => { + let limit = req.params.limit; + if (!req.params.limit) limit = 10; + if (isNaN(limit)) { + res.status(400).send("Limit parameter not a number."); + return; + } + if (limit > 50) { + res.status(400).send("Limit greater than maximum limit of 50."); + return; + } + try { + const recent = await matchModel.find().where("publicity").gte(2).limit(limit).sort({ createDate: -1 }); + res.status(200).send({ recent: recent }); + } catch (err) { + console.error(err); + res.status(500).send("Internal server error."); + // TODO: Check and improve error handling. + } +}); + // TODO: delete, update match. MatchController.post("/", needDatabase, authenticationGuard, async (req, res) => { try { @@ -31,7 +53,7 @@ MatchController.post("/", needDatabase, authenticationGuard, async (req, res) => const user = await userModel.findById(userId); const match = new matchModel({ title: req.body.title, - dateTime: req.body.dateTime, + when: req.body.when, public: req.body.public, location: req.body.location, creator: userId, diff --git a/server/schemas/matchModel.js b/server/schemas/matchModel.js index b18dcda..e86b35b 100644 --- a/server/schemas/matchModel.js +++ b/server/schemas/matchModel.js @@ -1,12 +1,12 @@ import mongoose from "mongoose"; -import ModelNameRegister from "./ModelNameRegister.js"; +import ModelNameRegister from "./modelNameRegister.js"; const Types = mongoose.Schema.Types; // Some types require defining from this object. const matchSchema = new mongoose.Schema({ title: { type: String, required: true, trim: true }, - dateTime: { type: Date, required: true }, - public: { type: Boolean, required: true, default: true }, + when: { type: Date, required: true }, + publicity: { type: Number, required: true, default: 2 }, location: { type: [Number], required: true, @@ -14,13 +14,14 @@ const matchSchema = new mongoose.Schema({ validator: function (v) { return v.length === 2; }, - message: "Invalid coordinate format (array not length of 2)" + message: "Invalid coordinate format (array not length of 2)." } }, creator: { type: Types.ObjectId, ref: ModelNameRegister.User }, participants: { type: [{ type: Types.ObjectId, ref: ModelNameRegister.User }], required: true, default: [] }, difficulty: { type: Number, required: true }, - sport: { type: Types.ObjectId, ref: ModelNameRegister.Sport } + sport: { type: Types.ObjectId, ref: ModelNameRegister.Sport }, + createDate: { type: Date, required: true, default: Date.now } }); export default mongoose.model(ModelNameRegister.Match, matchSchema); \ No newline at end of file diff --git a/server/schemas/ModelNameRegister.js b/server/schemas/modelNameRegister.js similarity index 100% rename from server/schemas/ModelNameRegister.js rename to server/schemas/modelNameRegister.js diff --git a/server/schemas/sportModel.js b/server/schemas/sportModel.js index eb2e301..928fd2e 100644 --- a/server/schemas/sportModel.js +++ b/server/schemas/sportModel.js @@ -1,5 +1,5 @@ import mongoose from "mongoose"; -import ModelNameRegister from "./ModelNameRegister.js"; +import ModelNameRegister from "./modelNameRegister.js"; const sportSchema = new mongoose.Schema({ name: { type: String, required: true, unique: true, trim: true }, diff --git a/server/schemas/userModel.js b/server/schemas/userModel.js index 1db4156..4c21b66 100644 --- a/server/schemas/userModel.js +++ b/server/schemas/userModel.js @@ -1,7 +1,7 @@ import mongoose from "mongoose"; import validator from "validator"; import bcrypt from "bcrypt"; -import ModelNameRegister from "./ModelNameRegister.js"; +import modelNameRegister from "./modelNameRegister.js"; const Types = mongoose.Schema.Types; @@ -27,12 +27,13 @@ const userSchema = new mongoose.Schema({ minlength: 8 // TODO: Custom validator for password requirements? }, - createdMatches: { type: [{ type: Types.ObjectId, ref: ModelNameRegister.Match }], required: true, default: [] }, - participatingMatches: { type: [{ type: Types.ObjectId, ref: ModelNameRegister.Match }], required: true, default: [] }, + createdMatches: { type: [{ type: Types.ObjectId, ref: modelNameRegister.Match }], required: true, default: [] }, + 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 }, + friends: { type: Types.ObjectId, ref: modelNameRegister.User }, accessLevel: { type: Number, required: true, default: 0 }, }); @@ -64,4 +65,4 @@ userSchema.pre("save", function (next) { } }); -export default mongoose.model(ModelNameRegister.User, userSchema); \ No newline at end of file +export default mongoose.model(modelNameRegister.User, userSchema); \ No newline at end of file