-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
131 lines (113 loc) · 3.31 KB
/
server.js
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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
require("dotenv").config();
// Env
const host = process.env.HOST;
const port = process.env.PORT;
// Package
const express = require("express");
const morgan = require("morgan");
const socket = require("socket.io");
const cors = require("cors");
const moment = require("moment");
moment.locale("id");
const http = require("http");
const path = require("path");
// Router
const router = require("./app/routers");
const app = express();
const httpServer = http.createServer(app);
// Socket.io
const io = socket(httpServer, {
cors: {
origin: "*",
},
});
const usersModel = require("./app/models/usersModel");
io.on("connection", (socket) => {
console.log(`Client connected by id ${socket.id}`);
let idUser = null;
socket.on("initialLogin", async (id) => {
console.log(`user:${id}`);
idUser = id;
const dataSocket = {
idUser: id,
idSocket: socket.id,
};
await usersModel.createUserSocket(dataSocket);
io.emit("login", id);
socket.join(`user:${id}`);
});
socket.on("sendMessage", async (data, callback) => {
const date = new Date();
const dayNow = moment(date).format("dddd");
const timeNow = moment(date).format("LT");
const message = { ...data, time: timeNow, day: dayNow };
const sendInput = {
message: message.message,
time: `${message.day}. ${message.time}`,
senderId: message.senderId,
targetId: message.receiverId,
type: "send",
};
const targetInput = {
message: message.message,
time: `${message.day}. ${message.time}`,
senderId: message.receiverId,
targetId: message.senderId,
type: "receive",
};
const senderName = await usersModel.getName(message.senderId);
await usersModel.createMessage(sendInput);
await usersModel.createMessage(targetInput);
const getMessagesSender = await usersModel.findMessages(data.senderId);
const getMessagesTarget = await usersModel.findMessages(data.receiverId);
const result = [...getMessagesSender, ...getMessagesTarget];
io.to(`user:${data.receiverId}`).emit("recMessage", result, senderName);
callback(result, senderName);
});
socket.on("initialLogout", (id) => {
io.emit("logout", id);
});
socket.on("delMessage", (idSender, idTarget) => {
io.emit("delete", idSender, idTarget);
});
socket.on("disconnect", async (reason) => {
await usersModel.deleteUserSocket(idUser);
io.emit("logout", idUser);
console.log(`Client disconnect from ${reason}`);
});
});
app.use("/images", express.static(path.join(__dirname, "images")));
app.use(express.json());
app.use(
express.urlencoded({
extended: false,
})
);
app.use(cors());
app.use(morgan("dev"));
app.use("/api/v1", router);
app.use("*", (req, res, next) => {
const err = new Error("Page not found");
next(err);
});
app.use((err, req, res, next) => {
if (err.message === "Uploaded file must be png, jpg or jpeg file") {
res.status(400).send({
status: false,
message: err.message,
});
} else if (err.code === "LIMIT_FILE_SIZE") {
res.status(400).send({
status: false,
message: "File image too large. Max 2MB.",
});
} else {
res.status(404).send({
status: false,
message: err.message,
});
}
});
httpServer.listen(port, () => {
console.log(`Server is running on http://${host}:${port}`);
});