Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
1 change: 0 additions & 1 deletion server
Submodule server deleted from ce3952
1 change: 1 addition & 0 deletions server/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/node_modules
36 changes: 36 additions & 0 deletions server/controllers/codeController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
const Code=require('../models/Code');

const getCode=async(req,res)=>{
try{
const {id,language}=req.query;
console.log(decodeURIComponent(language));
const code=await Code.findOne({room:id,language:language});
if(!code){
let codeValue='';
if(language==='javascript'){
codeValue="console.log('Hello Worlds')";
}
else if(language==='python'){
codeValue="print('Hello World')";
}
else if(language==='java'){
codeValue="public class HelloWorld{public static void main(String[] args){System.out.println('Hello World');}}";
}
else if(language==="C++(Clang 7.0.1)"){
codeValue="#include<iostream>using namespace std;int main(){cout<<'Hello World'<<endl;return 0;}";
}
const newCode=await Code.create({
room:id,
language:language,
code:codeValue
})
return res.status(201).json({code:newCode});
}
return res.status(200).json({code});
}catch(err){
console.log(err);
return res.status(400).json({msg:"Error in fetching the code"})
}
}

module.exports={getCode};
54 changes: 54 additions & 0 deletions server/controllers/roomController.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
const Room = require('../models/Room');

const createRoom = async (req, res) => {
const { roomName } = req.body;
if (!roomName ) return res.status(400).json({ msg: "Enter all Fields" });
try {
// add the user who has created this room automatically
// const user = req.user;
const newRoom = await Room.create({ roomName })
return res.status(200).json({ newRoom })
} catch (err) {
console.log(err);
res.status(500).json({ msg: "Error in creating room" });
}
}

const joinRoom = async (req, res) => {
const { roomId } = req.body;
try {
//const user = req.user;
const room = await Room.findById({ _id: roomId })
if (!room) return res.status(404).json({ msg: "Room not found" });

return res.status(200).json({ room });
} catch (err) {
console.log(err);
res.status(400).json({ msg: "Error in joining room" });
}
}

const getAllRoom=async(req,res)=>{
try {
const rooms = await Room.find({}).sort({ createdAt: -1 });;
return res.status(200).json({ rooms });
} catch (err) {
console.log(err);
res.status(400).json({ msg: "Error in getting all rooms" });
}
}

const getRoomById=async(req,res)=>{
try{
const {id,language}=req.query
const room=await Room.findOne({_id:id,language:language});
if(!room) return res.status(404).json({ msg: "Room not found" });
return res.status(200).json({ room });
}catch(err){
console.log(err);
res.status(400).json({ msg: "Error in getting room by id" });
}
}


module.exports = { joinRoom, createRoom,getAllRoom,getRoomById }
95 changes: 95 additions & 0 deletions server/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
const express = require('express');
const mongoose = require('mongoose');
const cookieParser = require('cookie-parser');
const cors = require('cors');
const http = require('http');
const { Server } = require("socket.io");
const Room = require('./models/Room');
const Code = require('./models/Code')
//routers

const roomRouter = require('./routes/roomRoute');
const codeRouter = require('./routes/codeRoute');

const port = 5000;

const app = express();
const server = http.createServer(app);

app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(cors({
origin: "http://localhost:3000",
credentials: true,
allowedHeaders: ["Origin", "X-Requested-With", "Content-Type", "Authorization"]
}));


app.use('/api/room', roomRouter);
app.use('/api/code',codeRouter);


mongoose.connect("mongodb+srv://testing_node:[email protected]/customDb?retryWrites=true&w=majority&appName=Cluster0")
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also why the mongo connection string is hard coded ?
It could be from .env

.then((success) => console.log("Connected to MongoDB"))
.catch(err => console.log("Error connecting"));

server.listen(port, () => {
console.log(`Running on port ${port}`);
})

const io = new Server(server, {
cors: {
origin: "http://localhost:3000",
credentials: true,
allowedHeaders: ["Origin", "X-Requested-With", "Content-Type", "Authorization"]
}
})

//Mapping room to the list of socket user
let userRoomMap = new Map();
let socketIdMap = new Map();


io.on('connection', (socket) => {
console.log(`${socket.id} connected`);
socket.on('joinroom', async ({ roomId }) => {
if (!userRoomMap.get(roomId)) {
userRoomMap.set(roomId, [socket.id]);
socketIdMap.set(socket.id, roomId);
socket.join(roomId);
}
else {
const socketIds = userRoomMap.get(roomId);
if (!socketIds.includes(socket.id)) {
socketIds.push(socket.id);
socketIdMap.set(socket.id, roomId);
socket.join(roomId);
}
}
socket.emit('welcomeToRoom', { userlist: userRoomMap.get(roomId) })
//console.log(userRoomMap);
})

socket.on('codeChange', async ({ roomId, code, lang }) => {
const decodedLang=decodeURIComponent(lang);
await Code.findOneAndUpdate({ room: roomId,language:decodedLang},

{ $set: { code: code } },
{ new: true }
)
socket.to(roomId).emit('syncCode', { code });
})


socket.on('disconnect', async () => {

const roomId = socketIdMap.get(socket.id);

if (userRoomMap.get(roomId)) {
const arr = userRoomMap.get(roomId);
userRoomMap.set(roomId, arr.filter(id => id != socket.id))
}
//console.log(userRoomMap);
})
})
18 changes: 18 additions & 0 deletions server/models/Code.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
const mongoose=require('mongoose');
const CodeSchema=mongoose.Schema({
language:{
type:String,
required:true
},
code:{
type:String,
},
room:{
type:mongoose.Schema.Types.ObjectId,
ref:'Room'
}
},{timestamps:true})

const Code=mongoose.model('Code',CodeSchema);

module.exports=Code;
13 changes: 13 additions & 0 deletions server/models/Room.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const mongoose=require('mongoose');

const RoomSchema=mongoose.Schema({
roomName:{
type:String,
required:true
},


},{ timestamps: true })

const Room=mongoose.model('Room',RoomSchema);
module.exports= Room;
Loading