Skip to content
This repository was archived by the owner on Nov 22, 2023. It is now read-only.

Commit 1c0d4da

Browse files
committed
new feature added: upload avatar
1 parent 5f58a03 commit 1c0d4da

File tree

9 files changed

+209
-68
lines changed

9 files changed

+209
-68
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
.DS_Store
22
node_modules
33
/dist
4+
uploads
45

56

67
# local env files

server/db.js

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
const MongoClient = require('mongodb').MongoClient
2+
const config = require('./config.json')
3+
4+
const connect = async function() {
5+
const uri = `mongodb+srv://modos:${config.db.password}@chatnodesocket.mdxoy.mongodb.net/myFirstDatabase?retryWrites=true&w=majority`
6+
7+
const client = new MongoClient(uri)
8+
9+
try {
10+
await client.connect()
11+
12+
} catch (error) {
13+
console.log(error)
14+
}
15+
16+
return client
17+
}
18+
19+
20+
21+
const findUserPhoto = async function(sessionID) {
22+
const client = await connect()
23+
let image = null
24+
try {
25+
image = (await client.db(config.db.name).collection('users').findOne({sessionID: sessionID}, {image: 1})).image
26+
} catch (error) {
27+
image = "null"
28+
}
29+
30+
console.log(image)
31+
32+
return image
33+
}
34+
35+
module.exports = {
36+
findUserPhoto
37+
}

server/index.js

+56-41
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,16 @@ const requestHandler = require('./requestHandler')
22

33
const httpServer = require('http').createServer(requestHandler)
44

5+
56
const io = require("socket.io")(httpServer, {
67
cors: {
78
origin: "http://localhost:8080",
89
},
910
})
1011

1112

13+
const db = require('./db')
14+
1215
const crypto = require("crypto")
1316
const randomId = () => crypto.randomBytes(8).toString("hex")
1417

@@ -18,69 +21,81 @@ const sessionStore = new InMemorySessionStore()
1821
const { InMemoryMessageStore } = require("./messageStore")
1922
const messageStore = new InMemoryMessageStore()
2023

21-
io.use((socket, next) => {
22-
const sessionID = socket.handshake.auth.sessionID
23-
if (sessionID) {
24-
const session = sessionStore.findSession(sessionID)
25-
if (session) {
26-
socket.sessionID = sessionID
27-
socket.userID = session.userID
28-
socket.username = session.username
29-
return next()
30-
}
31-
}
32-
const username = socket.handshake.auth.username
33-
if (!username) {
34-
return next(new Error("invalid username"))
35-
}
36-
socket.sessionID = randomId()
37-
socket.userID = randomId()
38-
socket.username = username
39-
next()
40-
})
24+
// io.use((socket, next) => {
25+
// const sessionID = socket.handshake.auth.sessionID
26+
// console.log(sessionID)
27+
// if (sessionID) {
28+
// const session = sessionStore.findSession(sessionID)
29+
// if (session) {
30+
// socket.sessionID = sessionID
31+
// socket.userID = session.userID
32+
// socket.username = session.username
33+
// return next()
34+
// }
35+
// }
36+
// const username = socket.handshake.auth.username
37+
// if (!username) {
38+
// return next(new Error("invalid username"))
39+
// }
40+
// socket.sessionID = randomId()
41+
// socket.userID = randomId()
42+
// socket.username = username
43+
// next()
44+
// })
45+
46+
io.on("connection", async (socket) => {
47+
48+
49+
console.log(socket.handshake.auth.sessionID)
50+
51+
let image = await db.findUserPhoto(socket.handshake.auth.sessionID)
52+
image = "http://localhost:3000/uploads/" + image
4153

42-
io.on("connection", (socket) => {
4354
// persist session
44-
sessionStore.saveSession(socket.sessionID, {
45-
userID: socket.userID,
46-
username: socket.username,
55+
sessionStore.saveSession(socket.handshake.auth.sessionID, {
56+
sessionID: socket.handshake.auth.sessionID,
57+
username: socket.handshake.auth.username,
4758
connected: true,
59+
image: image
4860
})
4961

50-
// emit session details
51-
socket.emit("session", {
52-
sessionID: socket.sessionID,
53-
userID: socket.userID,
54-
})
62+
// // emit session details
63+
// socket.emit("session", {
64+
// sessionID: socket.sessionID,
65+
// userID: socket.userID,
66+
// })
5567

5668
// join the "userID" room
57-
socket.join(socket.userID)
69+
socket.join(socket.handshake.auth.sessionID)
5870

5971
// fetch existing users
6072
const users = []
6173
const messagesPerUser = new Map()
62-
messageStore.findMessagesForUser(socket.userID).forEach((message) => {
74+
messageStore.findMessagesForUser(socket.handshake.auth.sessionID).forEach((message) => {
6375
const { from, to } = message
64-
const otherUser = socket.userID === from ? to : from
76+
const otherUser = socket.handshake.auth.sessionID === from ? to : from
6577
if (messagesPerUser.has(otherUser)) {
6678
messagesPerUser.get(otherUser).push(message)
6779
} else {
6880
messagesPerUser.set(otherUser, [message])
6981
}
7082
})
7183
sessionStore.findAllSessions().forEach((session) => {
84+
85+
console.log(session.sessionID)
7286
users.push({
73-
userID: session.userID,
87+
sessionID: session.sessionID,
7488
username: session.username,
7589
connected: session.connected,
76-
messages: messagesPerUser.get(session.userID) || [],
90+
image: session.image,
91+
messages: messagesPerUser.get(session.sessionID) || [],
7792
})
7893
})
7994
socket.emit("users", users)
8095

8196
// notify existing users
8297
socket.broadcast.emit("user connected", {
83-
userID: socket.userID,
98+
sessionID: socket.handshake.auth.sessionID,
8499
username: socket.username,
85100
connected: true,
86101
messages: [],
@@ -90,23 +105,23 @@ io.on("connection", (socket) => {
90105
socket.on("private message", ({ content, to }) => {
91106
const message = {
92107
content,
93-
from: socket.userID,
108+
from: socket.handshake.auth.sessionID,
94109
to,
95110
}
96-
socket.to(to).to(socket.userID).emit("private message", message)
111+
socket.to(to).to(socket.handshake.auth.sessionID).emit("private message", message)
97112
messageStore.saveMessage(message)
98113
})
99114

100115
// notify users upon disconnection
101116
socket.on("disconnect", async () => {
102-
const matchingSockets = await io.in(socket.userID).allSockets()
117+
const matchingSockets = await io.in(socket.handshake.auth.sessionID).allSockets()
103118
const isDisconnected = matchingSockets.size === 0
104119
if (isDisconnected) {
105120
// notify other users
106-
socket.broadcast.emit("user disconnected", socket.userID)
121+
socket.broadcast.emit("user disconnected", socket.handshake.auth.sessionID)
107122
// update the connection status of the session
108-
sessionStore.saveSession(socket.sessionID, {
109-
userID: socket.userID,
123+
sessionStore.saveSession(socket.handshake.auth.sessionID, {
124+
sessionID: socket.handshake.auth.sessionID,
110125
username: socket.username,
111126
connected: false,
112127
})

server/package.json

+3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@
99
"author": "Damien Arrachequesne <[email protected]>",
1010
"license": "MIT",
1111
"dependencies": {
12+
"formidable": "^1.2.2",
1213
"mongodb": "^4.1.1",
14+
"node-static": "^0.7.11",
15+
"serve-handler": "^6.1.3",
1316
"socket.io": "^3.1.1"
1417
}
1518
}

server/requestHandler.js

+47-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@ const MongoClient = require('mongodb').MongoClient
22
const config = require('./config.json')
33
const crypto = require("crypto");
44
const randomId = () => crypto.randomBytes(8).toString("hex")
5-
5+
const formidable = require('formidable')
6+
const fs = require('fs')
7+
const serveHandler = require('serve-handler')
68
module.exports = async function requestHandler(req, res) {
79

810
const headers = {
@@ -17,6 +19,7 @@ module.exports = async function requestHandler(req, res) {
1719
return
1820
}
1921

22+
2023
const uri = `mongodb+srv://modos:${config.db.password}@chatnodesocket.mdxoy.mongodb.net/myFirstDatabase?retryWrites=true&w=majority`
2124

2225
const client = new MongoClient(uri)
@@ -125,6 +128,48 @@ module.exports = async function requestHandler(req, res) {
125128
}
126129

127130
})
128-
}
131+
}else if (req.url === '/uploadPhoto') {
132+
let username = ''
133+
let path = ''
134+
const form = new formidable.IncomingForm()
135+
form.parse(req, function (err, fields, files) {
136+
username = fields.username
137+
const oldpath = files.image.path
138+
const newName = randomId() + files.image.name
139+
const newpath = './uploads/' + newName
140+
path = newName
141+
fs.rename(oldpath, newpath, async function (err) {
142+
if (err) throw err
143+
144+
res.writeHead(200, {
145+
"Access-Control-Allow-Origin": "http://localhost:8080",
146+
'Content-Type': 'application/json' })
147+
res.write(JSON.stringify({
148+
message: 'uploaded successfully',
149+
image: "http://localhost:3000/uploads/" + newName
150+
}))
151+
152+
153+
res.end()
154+
155+
try {
156+
await client.db(config.db.name).collection('users').updateOne({
157+
username: username
158+
}, {
159+
$set: {
160+
image: path
161+
}
162+
})
163+
} catch (error) {
164+
console.log(error)
165+
}
166+
})
167+
168+
})
169+
}else {
129170

171+
await serveHandler(req, res, {
172+
renderSingle: true
173+
})
174+
}
130175
}

src/App.vue

+13-12
Original file line numberDiff line numberDiff line change
@@ -26,28 +26,29 @@ export default {
2626
},
2727
methods: {
2828
onUsernameSelection(username) {
29-
this.usernameAlreadySelected = true;
30-
socket.auth = { username };
29+
this.usernameAlreadySelected = true
30+
localStorage.setItem("username", username)
3131
socket.connect();
3232
},
3333
},
3434
created() {
35-
const sessionID = localStorage.getItem("sessionID");
35+
const sessionID = localStorage.getItem("sessionID")
36+
const username = localStorage.getItem("username")
3637
3738
if (sessionID) {
3839
this.usernameAlreadySelected = true;
39-
socket.auth = { sessionID };
40+
socket.auth = { sessionID, username }
4041
socket.connect();
4142
}
4243
43-
socket.on("session", ({ sessionID, userID }) => {
44-
// attach the session ID to the next reconnection attempts
45-
socket.auth = { sessionID };
46-
// store it in the localStorage
47-
localStorage.setItem("sessionID", sessionID);
48-
// save the ID of the user
49-
socket.userID = userID;
50-
});
44+
// socket.on("session", ({ sessionID, userID }) => {
45+
// // attach the session ID to the next reconnection attempts
46+
// socket.auth = { sessionID };
47+
// // store it in the localStorage
48+
// localStorage.setItem("sessionID", sessionID);
49+
// // save the ID of the user
50+
// socket.userID = userID;
51+
// });
5152
5253
socket.on("connect_error", (err) => {
5354
if (err.message === "invalid username") {

0 commit comments

Comments
 (0)