Repository navigation
Expand file tree
/
Copy pathserver.js
More file actions
118 lines (103 loc) · 2.81 KB
/
Copy pathserver.js
File metadata and controls
118 lines (103 loc) · 2.81 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
const dotenv = require('dotenv');
const mongoose = require('mongoose');
const fs = require('fs');
const path = require('path');
const { logger } = require('./utils/logger');
const scheduleSaleCleanup = require('./lib/cornJobs/saleCleanup');
const processOrders = require('./lib/cornJobs/orderProcessing');
dotenv.config();
// Store cron jobs references
const activeJobs = {
saleCleanup: null,
orderProcessing: null,
};
//
const ensureDirectories = () => {
const dirs = [
path.join(__dirname, 'public', 'img', 'products'),
path.join(__dirname, 'public', 'img', 'users'),
];
dirs.forEach((dir) => {
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
logger.info(`Created directory: ${dir}`);
}
});
};
// Initialize cron jobs
const initializeJobs = () => {
try {
activeJobs.saleCleanup = scheduleSaleCleanup();
if (process.env.NODE_ENV !== 'test') {
activeJobs.orderProcessing = processOrders();
}
} catch (error) {
logger.error('Failed to initialize cron jobs:', {
error: error.message,
stack: error.stack,
});
}
};
// Initialize application
const app = require('./app');
// Start server
const port = process.env.PORT || 3000;
const server = app.listen(port, () => {
logger.info(`App running on port ${port} in ${process.env.NODE_ENV} mode...`);
});
// Graceful shutdown handler
const shutdown = async (exitCode = 0, signal = '') => {
const signalMessage = signal ? ` (${signal})` : '';
logger.info(`Shutting down${signalMessage}...`);
// Stop all active jobs
Object.values(activeJobs).forEach((job) => job && job.stop());
server.close(async () => {
try {
if (mongoose.connection.readyState === 1) {
await mongoose.disconnect();
logger.info('MongoDB connection closed');
}
} catch (err) {
logger.error('Error closing MongoDB connection:', err);
} finally {
logger.info('Server shut down complete');
process.exit(exitCode);
}
});
};
ensureDirectories();
mongoose
.connect(process.env.MONGODB_URI, {
serverSelectionTimeoutMS: 5000,
socketTimeoutMS: 30000,
})
.then(() => {
logger.info('DB connection successful!');
initializeJobs();
})
.catch((err) => {
logger.error('DB connection failed:', {
error: err.message,
stack: err.stack,
});
shutdown(1);
});
// Error handling
process.on('uncaughtException', (err) => {
logger.error('Uncaught Exception 💥', {
name: err.name,
message: err.message,
stack: err.stack,
});
shutdown(1);
});
process.on('unhandledRejection', (err) => {
logger.error('Unhandled Rejection 💥', {
name: err.name,
message: err.message,
stack: err.stack,
});
shutdown(1);
});
process.on('SIGTERM', () => shutdown(0, 'SIGTERM'));
process.on('SIGINT', () => shutdown(0, 'SIGINT'));