-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
135 lines (116 loc) · 4.69 KB
/
Copy pathserver.js
File metadata and controls
135 lines (116 loc) · 4.69 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
// Vercel Deployment Trigger: AI Formatting & Knowledge Base
// Last Update: 2025-12-27 21:10
const express = require('express');
const dotenv = require('dotenv');
const cors = require('cors');
const helmet = require('helmet');
const mongoSanitize = require('express-mongo-sanitize');
const connectDB = require('./config/db');
const { apiRateLimiter } = require('./middleware/rateLimiter');
// Handle uncaught exceptions to prevent process crashes
process.on('uncaughtException', (err) => {
console.error('UNCAUGHT EXCEPTION! 💥 Shutting down...');
console.error(err.name, err.message);
process.exit(1);
});
// Load env vars
dotenv.config();
// Connect to database
connectDB();
const app = express();
// Middleware
app.use(helmet()); // Set security HTTP headers
app.use(cors({
origin: function (origin, callback) {
// Allow requests with no origin (mobile apps, curl, etc.)
if (!origin) return callback(null, true);
const allowedOrigins = [
'http://localhost:5173',
process.env.FRONTEND_URL
];
// Allow dynamic Vercel preview URLs and explicit valid origins
if (origin.endsWith('.vercel.app') || allowedOrigins.includes(origin)) {
return callback(null, true);
}
return callback(new Error('CORS policy violation'), false);
},
credentials: true
}));
app.use(express.json({ limit: '10mb' })); // Increased to 10mb for base64 file uploads
app.use(express.urlencoded({ extended: true, limit: '10mb' }));
app.use(mongoSanitize()); // Prevent NoSQL injection
app.use(apiRateLimiter);
// Routes
app.use('/api/auth', require('./middleware/rateLimiter').authLimiter, require('./routes/authRoutes'));
app.use('/api/lostfound', require('./routes/lostFoundRoutes'));
app.use('/api/attendance', require('./routes/attendanceRoutes'));
app.use('/api/announcements', require('./routes/announcementRoutes'));
app.use('/api/transport', require('./routes/transportRoutes'));
app.use('/api/hostel', require('./routes/hostelRoutes'));
app.use('/api/materials', require('./routes/studyMaterialRoutes'));
app.use('/api/marks', require('./routes/marksRoutes'));
app.use('/api/exams', require('./routes/examRoutes'));
app.use('/api/ai', require('./routes/aiRoutes'));
app.use('/api/academics', require('./routes/academicRoutes'));
app.use('/api/guardian', require('./routes/guardianRoutes'));
app.use('/api/public', require('./routes/publicRoutes'));
app.use('/api/gallery', require('./routes/galleryRoutes'));
app.use('/api/dashboard', require('./routes/dashboardRoutes'));
app.use('/api/assignments', require('./routes/assignmentRoutes'));
app.use('/api/feedback', require('./routes/feedbackRoutes'));
app.use('/api/placements', require('./routes/placementRoutes'));
const mongoose = require('mongoose');
const guardian = require('./utils/systemGuardian');
// Initialize System Guardian after DB connection
mongoose.connection.once('open', async () => {
console.log('[System Guardian] Initializing...');
try {
const initialCheck = await guardian.runHealthCheck();
console.log('[System Guardian] Active and monitoring');
console.log(`[System Guardian] Database usage: ${initialCheck.prediction?.currentUsage || 'Unknown'}`);
} catch (error) {
console.error('[System Guardian] Initialization failed:', error.message);
}
});
// Health check
app.get('/health', (req, res) => {
const dbStatus = mongoose.connection.readyState === 1 ? 'Connected' : 'Disconnected';
res.json({
status: 'OK',
database: dbStatus,
timestamp: new Date().toISOString()
});
});
app.get('/', (req, res) => {
res.json({ message: 'Sapthagiri NPS University API is running' });
});
// 404 Handler
app.use((req, res, next) => {
res.status(404).json({ message: `Route ${req.originalUrl} not found` });
});
// Global Error handling middleware
app.use((err, req, res, next) => {
const statusCode = err.statusCode || 500;
console.error(`[Error] ${err.message}`);
res.status(statusCode).json({
message: err.message || 'Internal Server Error',
stack: process.env.NODE_ENV === 'production' ? null : err.stack,
});
});
// Export for Vercel serverless
module.exports = app;
// For local development
if (require.main === module) {
const PORT = process.env.PORT || 5000;
const server = app.listen(PORT, () => {
console.log(`Server running in ${process.env.NODE_ENV} mode on port ${PORT}`);
});
// Handle unhandled promise rejections
process.on('unhandledRejection', (err) => {
console.error('UNHANDLED REJECTION! 💥 Shutting down...');
console.error(err.name, err.message);
server.close(() => {
process.exit(1);
});
});
}