-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
175 lines (156 loc) · 5.42 KB
/
server.js
File metadata and controls
175 lines (156 loc) · 5.42 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
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
const http = require("http");
const express = require("express");
const mongoose = require("mongoose");
const cors = require("cors");
const bodyParser = require("body-parser");
const winston = require("winston");
const morgan = require("morgan");
const helmet = require("helmet");
const cron = require("node-cron");
const userRoutes = require("./routes/userRoutes");
const driverRoutes = require("./routes/driverRoutes");
const lockersRoutes = require("./routes/LockerRoutes");
const parcelRoutes = require("./routes/parcelRoutes");
const transactionRoutes = require("./routes/transactionRoutes");
const { PORT } = require("./config/serverConfig");
const { dbUri } = require("./config/dbConfig");
const Parcel = require("./models/ParcelModel");
const Locker = require("./models/LockerModel");
const User = require("./models/UserModel");
const Transaction = require("./models/TransactionModel");
const app = express();
app.use(cors());
const server = http.createServer(app);
// Socket.io setup
const { Server } = require("socket.io");
const io = new Server(server, {
cors: {
origin: "*",
methods: ["GET", "POST", "PUT", "DELETE", "PATCH", "OPTIONS"],
},
});
// Logger setup
const logger = winston.createLogger({
level: "info",
format: winston.format.json(),
transports: [
new winston.transports.Console({ format: winston.format.simple() }),
],
});
// Middleware
app.use(bodyParser.json());
app.use(helmet());
app.use(
morgan("combined", { stream: { write: (message) => logger.info(message) } })
);
// cron.schedule("*/30 * * * * *", async () => {
// try {
// console.log("Running the cron job");
// const thirtySecondsAgo = new Date(new Date().getTime() - 30000);
// console.log("Checking for updates since:", thirtySecondsAgo.toISOString());
// // Fetch all lockers
// const lockers = await Locker.find();
// let updatedCabinetsCount = 0;
// lockers.forEach((locker) => {
// locker.cabinets.forEach(async (cabinet) => {
// const lastUpdated = new Date(cabinet.cabinetStatusLastUpdated);
// if (lastUpdated >= thirtySecondsAgo) {
// console.log(
// `Cabinet ${cabinet.cabinetNumber} in ${locker.location} was updated to ${cabinet.status} in the last 30 seconds`
// );
// updatedCabinetsCount++;
// if (cabinet.status === "occupied") {
// // Find the transaction for this cabinet
// const transaction = await Transaction.findOne({
// CabinetId: cabinet._id,
// });
// if (transaction) {
// // Update the transaction status to awaiting pickup
// transaction.parcelStatus = "awaiting pickup";
// await transaction.save();
// }
// }
// }
// });
// });
// if (updatedCabinetsCount === 0) {
// console.log("No cabinet status updates found in the last 30 seconds");
// } else {
// console.log(
// `${updatedCabinetsCount} cabinets had status updates in the last 30 seconds`
// );
// }
// } catch (error) {
// console.error("Error in cron job:", error);
// }
// });
// Connect to MongoDB
mongoose
.connect(process.env.MONGODB_URI, {
useNewUrlParser: true,
useUnifiedTopology: true,
})
.then(() => logger.info("Connected to MongoDB"))
.catch((err) => logger.error(err));
// Use the user routes
app.use("/api/users", userRoutes); // Changed base path to /api/users
app.use("/api/drivers", driverRoutes);
app.use("/api/lockers", lockersRoutes);
app.use("/api/parcels", parcelRoutes);
app.use("/api/transactions", transactionRoutes);
// Health check endpoint
app.get("/health", (req, res) => res.status(200).send("OK"));
// Centralized error handling and duplicate key error
app.use((err, req, res, next) => {
if (err && err.code === 11000) {
res.status(409).send({ error: "Username already exists." });
} else {
logger.error(err.stack);
res.status(500).send("Something broke!");
}
});
// Socket.io connection
io.on("connection", (socket) => {
logger.info(`New client connected: ${socket.id}`);
// Event listener for getUserParcels
socket.on("getUserParcels", async (userId) => {
try {
// Fetch parcels based on the received user ID
// all parcel
const appParcel = await Parcel.find({}).populate("sender.user");
console.log(appParcel);
const userParcels = await Parcel.find({ "sender.user": userId }).populate(
"sender.user"
);
console.log(userParcels);
socket.emit("userParcels", userParcels);
} catch (error) {
// Handle error appropriately
console.error("Error fetching user parcels:", error);
socket.emit("userParcelsError", {
message: "Error fetching user parcels",
});
}
});
// Event listener for getUserLockers
socket.on("getUserLockers", async (userId) => {
try {
// Fetch lockers based on the received user ID
const userLockers = await Locker.find();
socket.emit("userLockers", userLockers);
} catch (error) {
// Handle error appropriately
console.error("Error fetching user lockers:", error);
socket.emit("userLockersError", {
message: "Error fetching user lockers",
});
}
});
socket.on("disconnect", () => {
console.log(`A user disconnected with socket id ${socket.id}`);
});
});
server.listen(PORT || 3000, () =>
logger.info(`Server listening on port ${PORT}`)
);
module.exports = server;