diff --git a/backend/controllers/serverController.js b/backend/controllers/serverController.js new file mode 100644 index 0000000..474409d --- /dev/null +++ b/backend/controllers/serverController.js @@ -0,0 +1,23 @@ +const session = require("express-session"); +const CONNECTION_URI = require("../credentials.js"); +const MongoDBStore = require("connect-mongodb-session")(session); +const store = new MongoDBStore({ + uri: CONNECTION_URI, + collection: "sessions", +}); +const sessionMiddleware = session({ + secret: "lalala", + resave: true, + saveUninitialized: false, + store: store, + credentials: true, + cookie: { + httpOnly: false, + secure: false, + }, +}); + +const wrap = (expressMiddleware) => (socket, next) => + expressMiddleware(socket.request, {}, next); + +module.exports = { sessionMiddleware, wrap }; diff --git a/backend/routes/player.js b/backend/routes/player.js index b5108c3..88b7d45 100644 --- a/backend/routes/player.js +++ b/backend/routes/player.js @@ -1,65 +1,54 @@ -var express = require('express'); +var express = require("express"); var router = express.Router(); -var RoomModel = require('../schemas/room'); -var changeReadyState = (req, res, exit) =>{ - RoomModel.findOne({_id: req.session.roomId}, function (err, doc){ - if (err) { - res.status(500).send(err) - } else { - //finds player by id and changes ready state - let updatedPlayers = doc.players; - let index = updatedPlayers.findIndex( - player => (player._id).toString() == (req.session.playerId).toString() - ); - if(!exit) updatedPlayers[index].ready = !updatedPlayers[index].ready; - else updatedPlayers[index].ready = false; - const updatedDoc = { - players: updatedPlayers - } - if(updatedPlayers.filter(player => player.ready).length >= 2){ - updatedDoc.started = true; - updatedDoc.players.forEach(player => player.ready = true); - updatedDoc.nextMoveTime = Date.now() + 15000; - updatedDoc.players[0].nowMoving = true; - } - - RoomModel.findOneAndUpdate({ - _id: req.session.roomId - }, updatedDoc, function(err, doc){ - if (err){ - console.log(err) - } - else{ - console.log("Updated Docs : ", doc); - } - }); - res.status(200).send("Ready!"); - } - }); -} +var RoomModel = require("../schemas/room"); +var changeReadyState = (req, res, exit) => { + RoomModel.findOne({ _id: req.session.roomId }, function (err, doc) { + if (err) { + res.status(500).send(err); + } else { + //finds player by id and changes ready state + let updatedPlayers = doc.players; + let index = updatedPlayers.findIndex( + (player) => player._id.toString() == req.session.playerId.toString() + ); + if (!exit) updatedPlayers[index].ready = !updatedPlayers[index].ready; + else updatedPlayers[index].ready = false; + const updatedDoc = { + players: updatedPlayers, + }; + if (updatedPlayers.filter((player) => player.ready).length >= 2) { + updatedDoc.started = true; + updatedDoc.players.forEach((player) => (player.ready = true)); + updatedDoc.nextMoveTime = Date.now() + 15000; + updatedDoc.players[0].nowMoving = true; + } + + RoomModel.findOneAndUpdate( + { + _id: req.session.roomId, + }, + updatedDoc, + function (err, doc) { + if (err) { + console.log(err); + } else { + console.log("Updated Docs : ", doc); + } + } + ); + res.status(200).send("Ready!"); + } + }); +}; //changing status of player to ready for game -router.post('/ready', function (req, res){ - changeReadyState(req, res, false) +router.post("/ready", function (req, res) { + changeReadyState(req, res, false); }); //deleting user in case he left before game started -router.post('/exit', function(req,res){ - // changeReadyState(req,res, true) +router.post("/exit", function (req, res) { + // changeReadyState(req,res, true) }); -//return session data -router.get('/', (req,res)=>{ - // If session exist return sessions data to move player to game when he backs to site - if(req.session){ - res.send({ - color: req.session.color, - playerId: req.session.playerId, - roomId: req.session.roomId, - }) - }else{ - res.end(); - } -}); - -module.exports = router; \ No newline at end of file +module.exports = router; diff --git a/backend/server.js b/backend/server.js index 7f32163..d36a768 100644 --- a/backend/server.js +++ b/backend/server.js @@ -1,8 +1,7 @@ const express = require("express"); const cors = require("cors"); const cookieParser = require("cookie-parser"); -const session = require("express-session"); - +const { sessionMiddleware, wrap } = require("./controllers/serverController"); const app = express(); app.use(cookieParser()); app.use( @@ -14,17 +13,12 @@ app.use(express.json()); app.set("trust proxy", 1); app.use( cors({ - origin: [ - "http://localhost:5000", - "https://localhost:5000", - "http://localhost:3001", - "http://localhost:3000", - ], + origin: "http://localhost:3000", credentials: true, }) ); const PORT = 5000; - +app.use(sessionMiddleware); //DATABASE CONFIG const mongoose = require("mongoose"); mongoose.set("useFindAndModify", false); @@ -40,24 +34,7 @@ mongoose }) .catch((err) => console.error(err)); -//SESSION CONFIG] -var MongoDBStore = require("connect-mongodb-session")(session); -var store = new MongoDBStore({ - uri: CONNECTION_URI, - collection: "sessions", -}); -app.use( - session({ - secret: "lalala", - resave: true, - saveUninitialized: false, - store: store, - cookie: { - httpOnly: false, - secure: false, - }, - }) -); +//SESSION CONFIG if (process.env.NODE_ENV === "production") { app.use(express.static("/app/build")); @@ -65,6 +42,19 @@ if (process.env.NODE_ENV === "production") { res.sendFile("/app/build/index.html"); }); } +const server = app.listen(PORT, () => { + console.log("Server runs on port " + PORT); +}); +const io = require("socket.io")(server, { + cors: { + origin: "http://localhost:3000", + credentials: true, + }, +}); +io.use(wrap(sessionMiddleware)); +io.on("connection", (socket) => { + socket.emit("client data", JSON.stringify(socket.request.session)); +}); //ROUTES CONFIG const roomRoutes = require("./routes/room"); @@ -74,16 +64,3 @@ const gameRoutes = require("./routes/game"); app.use("/player", playerRoutes); app.use("/room", roomRoutes); app.use("/game", gameRoutes); - -const server = app.listen(PORT, () => { - console.log("Server runs on port " + PORT); -}); -const socket = require("socket.io"); -const io = socket(server, { - cors: { - origin: "http://localhost:3000", - }, -}); -io.on("connection", () => { - console.log("a user connected"); -}); diff --git a/src/App.js b/src/App.js index 0b5393f..92bd93a 100644 --- a/src/App.js +++ b/src/App.js @@ -19,16 +19,12 @@ function App() { const [redirect, setRedirect] = useState(); useEffect(() => { - const socket = io("http://localhost:5000"); - socket.on("connect", () => console.log(socket.id)); - axios - .get("/player", { - withCredentials: true, - }) - .then((response) => { - setPlayerData(response.data); - response.data.roomId != null ? setRedirect(true) : setRedirect(false); - }); + const socket = io("http://localhost:5000", { withCredentials: true }); + socket.on("client data", (data) => { + data = JSON.parse(data); + setPlayerData(data); + data.roomId != null ? setRedirect(true) : setRedirect(false); + }); }, []); const handleExit = (e) => {