Skip to content

Commit 33bf691

Browse files
author
Kapil
committed
Commited webchat
0 parents  commit 33bf691

File tree

2,191 files changed

+410749
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

2,191 files changed

+410749
-0
lines changed

.env

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
DB_URL=mongodb://Kapil:CaTFu0wt1ixEQWq2@cluster0-shard-00-00.4hbwh.mongodb.net:27017,cluster0-shard-00-01.4hbwh.mongodb.net:27017,cluster0-shard-00-02.4hbwh.mongodb.net:27017/webchat?ssl=true&replicaSet=atlas-xvihsf-shard-0&authSource=admin&retryWrites=true&w=majority
2+
secret=thisisasecret

index.js

+204
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
if(process.env.ENV_NODE !== "production")
2+
{
3+
require('dotenv').config();
4+
}
5+
const express = require('express');
6+
const app = express();
7+
const ExpressError = require('./utils/ExpressError');
8+
const {catchAsync} = require('./utils/catchAsync');
9+
const {userSchema} = require('./schemas.js');
10+
const {v4: uuid} = require('uuid');
11+
const server = require('http').Server(app);
12+
const io = require('socket.io')(server);
13+
const path = require('path');
14+
const User = require('./models/User');
15+
const session = require('express-session');
16+
const mongoStore = require('connect-mongo');
17+
const passport = require('passport');
18+
const passportLocal = require('passport-local');
19+
const mongoose = require('mongoose');
20+
const flash = require('connect-flash');
21+
22+
const DB_URL = process.env.DB_URL || 'mongodb://localhost:27017/webchat';
23+
mongoose.connect(DB_URL);
24+
const db = mongoose.connection;
25+
db.on("error", console.error.bind(console, "connection error:"));
26+
db.once("open", () => {
27+
console.log("Database connected");
28+
});
29+
30+
const secret = process.env.secret;
31+
const store = new mongoStore(
32+
{
33+
mongoUrl:DB_URL,
34+
secret,
35+
touchAfter: 24 * 60 * 60
36+
}
37+
);
38+
39+
const sessionConfig = {
40+
store,
41+
name: 'session',
42+
secret,
43+
resave: false,
44+
saveUninitialized: true,
45+
cookie: {
46+
httpOnly: true,
47+
// secure: true,
48+
expires: Date.now() + 1000 * 60 * 60 * 24 * 7,
49+
maxAge: 1000 * 60 * 60 * 24 * 7
50+
}
51+
};
52+
53+
54+
55+
app.set('view engine','views');
56+
app.set('views',path.join(__dirname,'views'));
57+
app.use(express.static(path.join(__dirname,'public')));
58+
app.use(express.urlencoded({extended: true}));
59+
app.use(flash());
60+
const users = {};
61+
let roooms;
62+
63+
app.use(session(sessionConfig));
64+
65+
66+
const validation = (req,res,next)=>
67+
{
68+
if(!req.isAuthenticated())
69+
{
70+
res.redirect('/login');
71+
}
72+
else
73+
{
74+
next();
75+
}
76+
};
77+
78+
const validate = (req,res,next) =>
79+
{
80+
const {error} = userSchema.validate(req.body);
81+
if(error)
82+
{
83+
const msg = error.details.map( el => el.message).join(',');
84+
throw new ExpressError(msg,404);
85+
}
86+
else
87+
{
88+
next();
89+
}
90+
}
91+
app.use(passport.initialize());
92+
app.use(passport.session());
93+
passport.use(new passportLocal(User.authenticate()));
94+
passport.serializeUser(User.serializeUser());
95+
passport.deserializeUser(User.deserializeUser());
96+
97+
98+
99+
app.use((req,res,next)=>
100+
{
101+
res.locals.currentUser = req.user;
102+
res.locals.success = req.flash('success');
103+
res.locals.error = req.flash('error');
104+
next();
105+
});
106+
app.get('/register',(req,res)=>
107+
{
108+
res.render('register.ejs');
109+
})
110+
app.post('/register',validate,catchAsync(async (req,res)=>
111+
{
112+
const {username,password,email} = req.body.user;
113+
const newUser = new User({
114+
username,
115+
email
116+
});
117+
const user = await User.register(newUser,password);
118+
req.login(user,(err)=>
119+
{
120+
if (err) return next(err);
121+
console.log('Successfully logged in');
122+
res.redirect('/');
123+
})
124+
}));
125+
126+
app.get('/login',(req,res)=>
127+
{
128+
res.render('login.ejs');
129+
});
130+
131+
app.post('/login',
132+
passport.authenticate('local', {failureFlash: true,failureRedirect: '/login' }),
133+
(req,res)=>
134+
{
135+
res.redirect('/');
136+
});
137+
138+
app.get('/logout',(req,res)=>
139+
{
140+
req.logout();
141+
res.redirect('/login');
142+
});
143+
144+
app.get('/',(req,res)=>
145+
{
146+
res.render('home.ejs',{roooms});
147+
})
148+
app.get('/createRoom',validation,(req,res)=>
149+
{
150+
roomId = uuid();
151+
res.redirect(`/${roomId}`);
152+
});
153+
154+
app.get('/:roomId',validation,(req,res)=>
155+
{
156+
res.render('room.ejs',{roomId: req.params.roomId,username: req.user.username});
157+
});
158+
159+
io.on('connection', socket=>
160+
{
161+
socket.on('join-room',(roomId)=>
162+
{
163+
socket.on('new-user',(name)=>
164+
{
165+
users[socket.id] = name;
166+
console.log(`${name} connected!`);
167+
console.log(roomId);
168+
socket.join(roomId);
169+
roooms = socket.rooms;
170+
socket.broadcast.to(roomId).emit('user-connected',`${name}: joined the room`,'right');
171+
});
172+
173+
socket.on('send',(message)=>
174+
{
175+
socket.broadcast.to(roomId).emit('receive',`${users[socket.id]}: ${message}`,'right');
176+
})
177+
178+
socket.on('disconnect',()=>
179+
{
180+
socket.broadcast.to(roomId).emit('leave',`${users[socket.id]} left the room`,'right');
181+
})
182+
});
183+
184+
185+
186+
});
187+
188+
app.all('*',(req,res,next)=>
189+
{
190+
next(new ExpressError('Page Not Found',404));
191+
})
192+
193+
app.use((err,req,res,next)=>
194+
{
195+
if(! err.message) err.message = 'Page Not Found!!!';
196+
res.status(404).send(err.message);
197+
});
198+
199+
const port = process.env.PORT || 8080;
200+
server.listen(port,()=>
201+
{
202+
203+
console.log('Server started and listening');
204+
});

models/User.js

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
2+
const mongoose = require('mongoose');
3+
const Schema = mongoose.Schema;
4+
const passportLocal = require('passport-local-mongoose');
5+
6+
const userSchema = new Schema(
7+
{
8+
email: {
9+
type: String,
10+
required: true,
11+
unique: true
12+
}
13+
}
14+
);
15+
16+
userSchema.plugin(passportLocal);
17+
18+
module.exports = mongoose.model('User',userSchema);

node_modules/.bin/ejs

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.bin/ejs.cmd

+17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.bin/ejs.ps1

+28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.bin/jake

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.bin/jake.cmd

+17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.bin/jake.ps1

+28
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.bin/mime

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

node_modules/.bin/mime.cmd

+17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)