-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
105 lines (84 loc) · 3.57 KB
/
Copy pathserver.js
File metadata and controls
105 lines (84 loc) · 3.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// Developed by Yousef Emadi
// Chat Client App Project on Node.js
// 2021-DEC
// Environment setup requirements:
// Requirement: MongoDB, Node.js (Express js, socket io and ... ) for more information about dependencies please read dependencies block in package.json file
// mongodb remote database and collection : https://cloud.mongodb.com/v2/61b7f93855bfb8410bc30c27#metrics/replicaSet/61b7fb42f156ac5e3c64387b/explorer/db_yousef_chat_app/messages/find
// mongodb connection string: mongodb+srv://admin:admin@cluster0.gvdk3.mongodb.net/db_yousef_chat_app?retryWrites=true&w=majority
// dependencies
var express = require('express');
// necessary to parse objects to string
var bodyParser = require('body-parser');
// create an express app
var expressApp = express();
// to use socket.io features we need to tight it with express. game plan is create a http server by nod and use it for both express and socket.io
var http = require('http').Server(expressApp);
var io = require('socket.io')(http);
// Mangoose config
var mongoose = require('mongoose')
// const dbUrl = "mongodb+srv://admin:admin@cluster0.gvdk3.mongodb.net/db_yousef_chat_app?retryWrites=true&w=majority";
const dbUrl = "mongodb+srv://admin:adminmongodb@cluster0.gvdk3.mongodb.net/db_yousef_chat_app?retryWrites=true&w=majority";
//port number for application
var port = 3000;
//to use index.html as home page
expressApp.use(express.static(__dirname));
//middleware
expressApp.use(bodyParser.json());
//middleware for encoding url in post method
expressApp.use(bodyParser.urlencoded({ extended: false }));
// to avoid deprecation error
mongoose.Promise = Promise;
// create a model to use interaction to mlab via mongoose
var MessageModel = mongoose.model('Message', {
username: String,
message: String
});
// get handler
expressApp.get('/messages', (req, res) => {
MessageModel.find({},(err, messages) => {
res.send(messages)
console.log('error code : ', err);
})
});
// by TDD from jasmine : get handler for a specifi user's messages
expressApp.get('/messages/:user', (req, res) => {
// to access user part of url
var user = req.params.user;
console.log(req);
MessageModel.find({username: user},(err, messages) => {
console.log(req.params.user);
res.send(messages)
console.log('error code : ', err);
})
});
// post handler Ver 2 , with async/await way to have a cleaner code
// mechanism for badword: save into database, find badword, if any remove message, else emit to client
expressApp.post('/messages', async (req, res) => {
try {
// create an object based on db model
var message = new MessageModel(req.body);
//save the message in db with async/await
const savedMessage = await message.save();
console.log('saved a message from: ', message.username);
const censoredMessage = await MessageModel.findOne({message: 'badword'});
if (censoredMessage) {
console.log('censoed word found to remove: ', censoredMessage);
await MessageModel.deleteOne({_id: censoredMessage.id}) // id auto generated by mongoose on db
}else
io.emit('message', req.body);
res.sendStatus(200);
} catch (error) {
res.sendStatus(500);
return console.error(err);
}
})
io.on('connetion', (socket) => {
console.log('a user connected');
});
mongoose.connect(dbUrl, (err) => {
// perform actions on the collection object
console.log('mongo db connection', err);
});
http.listen(port, () => {
console.log(`Server is running and listening on port ${port}`);
});