diff --git a/backend/routes/public.js b/backend/routes/public.js new file mode 100644 index 0000000..fb3f360 --- /dev/null +++ b/backend/routes/public.js @@ -0,0 +1,102 @@ +const router = require("express").Router(); +const { Challenge } = require("../models/challenge"); +const { User } = require("../models/user"); + +// API endpoints that are publically accessible and does not require authentication + +// get all users +router.get("/users", async (req, res, next) => { + try { + const users = await User.find(); + return res.status(200).json(users); + } catch (err) { + next(err); + } +}); + +// TO BE TESTED +// get user details +router.get("/users/:username", async (req, res, next) => { + try { + let username = req.params.username; + const user = await User.findOne({ username }); + let { id, email, fname, lname, country, location } = user; + let friends = await user.getFriends(); + let games = await user.getGames(); + return res.status(200).json({ + id, + username, + email, + friends, + fname, + lname, + country, + location, + games, + }); + } catch (err) { + next(err); + } +}); + +// TO BE TESTED +// get friends of given user +router.get("/users/:username/friends", async (req, res, next) => { + try { + const user = await User.findOne({ username: req.params.username }); + const friends = await user.getFriends(); + return res.json({ friends }); + } catch (err) { + next(err); + } +}); + +// IS IT REQUIRED? +// TO BE TESTED +// get current challenges of the user +router.get("/users/:username/challenges", checkAuth, async (req, res, next) => { + try { + let { userId } = req; + const user = await User.findById(userId); + let challenges = await Challenge.find({ challenged: user.username }); + if (!challenges) challenges = []; + console.log("Challenges to", user.username, challenges); + res.json({ challenges: challenges }); + } catch (err) { + next(err); + } +}); + +// TO BE TESTED +// get history of games played +router.get("/users/:username/games", async (req, res, next) => { + try { + const user = await User.findOne({ username: req.params.username }); + let gamesData = await user.getGames(); + if (!gamesData) gamesData = []; + return res.status(200).json(gamesData); + } catch (err) { + next(err); + } +}); + +// TO BE TESTED +// get a particular game +router.get( + "/users/:username/games/:gameid", + async (req, res, next) => { + try { + const { gameid } = req.params; + const gameData = await Game.findById(gameid); + if (gameData) { + return res.status(200).json(gameData); + } else { + return res.status(404).json({ error: { message: "Game not found" } }); + } + } catch (err) { + next(err); + } + } +); + +module.exports = router; \ No newline at end of file diff --git a/backend/routes/user.js b/backend/routes/user.js index 30bcf38..41ac5f8 100644 --- a/backend/routes/user.js +++ b/backend/routes/user.js @@ -5,6 +5,8 @@ const { User } = require("../models/user"); const { checkAuth } = require("../util/auth"); const { catchAsync } = require("../util/errors"); +// API enpoints related to a user, requires authentication + // extracts the user details of userId. Use only if the req object contains userId field. const extractUserDetails = async (req, res, next) => { try { @@ -289,102 +291,4 @@ router.post("/games", checkAuth, async (req, res, next) => { return res.json({ data: gameDoc }); }); -// ============================================================= - -// get all users -router.get("/users", async (req, res, next) => { - try { - const users = await User.find(); - return res.status(200).json(users); - } catch (err) { - next(err); - } -}); - -// TO BE TESTED -// get user details -router.get("/users/:username", async (req, res, next) => { - try { - let username = req.params.username; - const user = await User.findOne({ username }); - let { id, email, fname, lname, country, location } = user; - let friends = await user.getFriends(); - let games = await user.getGames(); - return res.status(200).json({ - id, - username, - email, - friends, - fname, - lname, - country, - location, - games, - }); - } catch (err) { - next(err); - } -}); - -// TO BE TESTED -// get friends of given user -router.get("/users/:username/friends", async (req, res, next) => { - try { - const user = await User.findOne({ username: req.params.username }); - const friends = await user.getFriends(); - return res.json({ friends }); - } catch (err) { - next(err); - } -}); - -// IS IT REQUIRED? -// TO BE TESTED -// get current challenges of the user -router.get("/users/:username/challenges", checkAuth, async (req, res, next) => { - try { - let { userId } = req; - const user = await User.findById(userId); - let challenges = await Challenge.find({ challenged: user.username }); - if (!challenges) challenges = []; - console.log("Challenges to", user.username, challenges); - res.json({ challenges: challenges }); - } catch (err) { - next(err); - } -}); - -// TO BE TESTED -// get history of games played -router.get("/users/:username/games", checkAuth, async (req, res, next) => { - try { - const user = await User.findOne({ username: req.params.username }); - let gamesData = await user.getGames(); - if (!gamesData) gamesData = []; - return res.status(200).json(gamesData); - } catch (err) { - next(err); - } -}); - -// TO BE TESTED -// get a particular game -router.get( - "/users/:username/games/:gameid", - checkAuth, - async (req, res, next) => { - try { - const { gameid } = req.params; - const gameData = await Game.findById(gameid); - if (gameData) { - return res.status(200).json(gameData); - } else { - return res.status(404).json({ error: { message: "Game not found" } }); - } - } catch (err) { - next(err); - } - } -); - module.exports = router;