Skip to content

Commit f618813

Browse files
committed
merged local and remote
0 parents  commit f618813

84 files changed

Lines changed: 10668 additions & 0 deletions

Some content is hidden

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

Back-end/.gitignore

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
node_modules
2+
/.env
3+
dist
4+
coverage
5+
logs
6+
*.log
7+
*.env
8+
.DS_Store
9+
.idea
10+
.vscode
11+
*.suo
12+
*.ntvs*
13+
*.njsproj

Back-end/app.js

Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
import express from "express";
2+
import { connectDB } from "./utils/features.js";
3+
import dotenv from "dotenv";
4+
import { errorMiddleware } from "./middlewares/error.js";
5+
import cookieParser from "cookie-parser";
6+
import { Server } from "socket.io";
7+
import { createServer } from "http";
8+
import { v4 as uuid } from "uuid";
9+
import cors from "cors";
10+
import { v2 as cloudinary } from "cloudinary";
11+
import {
12+
CHAT_JOINED,
13+
CHAT_LEAVED,
14+
NEW_MESSAGE,
15+
NEW_MESSAGE_ALERT,
16+
ONLINE_USERS,
17+
START_TYPING,
18+
STOP_TYPING,
19+
} from "./constants/events.js";
20+
import { getSockets } from "./lib/helper.js";
21+
import { Message } from "./models/message.js";
22+
import { corsOptions } from "./constants/config.js";
23+
import { socketAuthenticator } from "./middlewares/auth.js";
24+
25+
import userRoute from "./routes/user.js";
26+
import chatRoute from "./routes/chat.js";
27+
import adminRoute from "./routes/admin.js";
28+
29+
dotenv.config({
30+
path: "./.env",
31+
});
32+
33+
const mongoURI = process.env.MONGO_URI;
34+
const port = process.env.PORT || 3000;
35+
const envMode = process.env.NODE_ENV.trim() || "PRODUCTION";
36+
const adminSecretKey = process.env.ADMIN_SECRET_KEY || "adsasdsdfsdfsdfd";
37+
const userSocketIDs = new Map();
38+
const onlineUsers = new Set();
39+
40+
connectDB(mongoURI);
41+
42+
cloudinary.config({
43+
cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
44+
api_key: process.env.CLOUDINARY_API_KEY,
45+
api_secret: process.env.CLOUDINARY_API_SECRET,
46+
});
47+
48+
const app = express();
49+
const server = createServer(app);
50+
const io = new Server(server, {
51+
cors: corsOptions,
52+
});
53+
54+
app.set("io", io);
55+
56+
// Using Middlewares Here
57+
app.use(express.json());
58+
app.use(cookieParser());
59+
app.use(cors(corsOptions));
60+
61+
app.use("/api/v1/user", userRoute);
62+
app.use("/api/v1/chat", chatRoute);
63+
app.use("/api/v1/admin", adminRoute);
64+
65+
app.get("/", (req, res) => {
66+
res.send("Hello World");
67+
});
68+
69+
//middleware for socket authentication
70+
io.use((socket, next) => {
71+
cookieParser()(
72+
//can read cookies).
73+
socket.request,
74+
socket.request.res,
75+
async (err) => await socketAuthenticator(err, socket, next) //method for authenticating socket connections
76+
);
77+
});
78+
79+
io.on("connection", (socket) => {
80+
console.log("New client connected:", socket.id);
81+
const user = socket.user;
82+
userSocketIDs.set(user._id.toString(), socket.id);
83+
console.log(`User connected: ${user.name}`);
84+
85+
socket.on(NEW_MESSAGE, async ({ chatId, members, message }) => {
86+
const messageForRealTime = {
87+
content: message,
88+
_id: uuid(),
89+
sender: {
90+
_id: user._id,
91+
name: user.name,
92+
},
93+
chat: chatId,
94+
createdAt: new Date().toISOString(),
95+
};
96+
97+
const messageForDB = {
98+
content: message,
99+
sender: user._id,
100+
chat: chatId,
101+
};
102+
103+
const membersSocket = getSockets(members);
104+
io.to(membersSocket).emit(NEW_MESSAGE, {
105+
chatId,
106+
message: messageForRealTime,
107+
});
108+
io.to(membersSocket).emit(NEW_MESSAGE_ALERT, { chatId });
109+
110+
try {
111+
await Message.create(messageForDB);
112+
} catch (error) {
113+
throw new Error(error);
114+
}
115+
});
116+
117+
socket.on(START_TYPING, ({ members, chatId }) => {
118+
const membersSockets = getSockets(members);
119+
socket.to(membersSockets).emit(START_TYPING, { chatId });
120+
});
121+
122+
socket.on(STOP_TYPING, ({ members, chatId }) => {
123+
const membersSockets = getSockets(members);
124+
socket.to(membersSockets).emit(STOP_TYPING, { chatId });
125+
});
126+
127+
socket.on(CHAT_JOINED, ({ userId, members }) => {
128+
onlineUsers.add(userId.toString());
129+
130+
const membersSocket = getSockets(members);
131+
io.to(membersSocket).emit(ONLINE_USERS, Array.from(onlineUsers));
132+
});
133+
134+
socket.on(CHAT_LEAVED, ({ userId, members }) => {
135+
onlineUsers.delete(userId.toString());
136+
137+
const membersSocket = getSockets(members);
138+
io.to(membersSocket).emit(ONLINE_USERS, Array.from(onlineUsers));
139+
});
140+
141+
socket.on("disconnect", () => {
142+
userSocketIDs.delete(user._id.toString());
143+
onlineUsers.delete(user._id.toString());
144+
socket.broadcast.emit(ONLINE_USERS, Array.from(onlineUsers));
145+
});
146+
});
147+
148+
app.use(errorMiddleware);
149+
150+
server.listen(port, () => {
151+
console.log(`Server is running on port ${port} in ${envMode} Mode`);
152+
});
153+
154+
export { envMode, adminSecretKey, userSocketIDs };

Back-end/constants/config.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
const corsOptions = {
2+
origin: [
3+
"http://localhost:5173",
4+
"http://localhost:4173",
5+
process.env.CLIENT_URL,
6+
],
7+
methods: ["GET", "POST", "PUT", "DELETE"],
8+
credentials: true,
9+
};
10+
11+
const CHATTU_TOKEN = "chattu-token";
12+
13+
export { corsOptions, CHATTU_TOKEN };

Back-end/constants/events.js

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
const ALERT = "ALERT";
2+
const REFETCH_CHATS = "REFETCH_CHATS";
3+
4+
const NEW_ATTACHMENT = "NEW_ATTACHMENT";
5+
const NEW_MESSAGE_ALERT = "NEW_MESSAGE_ALERT";
6+
7+
const NEW_REQUEST = "NEW_REQUEST";
8+
const NEW_MESSAGE = "NEW_MESSAGE";
9+
10+
const START_TYPING = "START_TYPING";
11+
const STOP_TYPING = "STOP_TYPING";
12+
13+
const CHAT_JOINED = "CHAT_JOINED";
14+
const CHAT_LEAVED = "CHAT_LEAVED";
15+
16+
const ONLINE_USERS = "ONLINE_USERS";
17+
18+
export {
19+
ALERT,
20+
REFETCH_CHATS,
21+
NEW_ATTACHMENT,
22+
NEW_MESSAGE_ALERT,
23+
NEW_REQUEST,
24+
NEW_MESSAGE,
25+
START_TYPING,
26+
STOP_TYPING,
27+
CHAT_JOINED,
28+
CHAT_LEAVED,
29+
ONLINE_USERS,
30+
};

0 commit comments

Comments
 (0)