-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.js
157 lines (136 loc) · 4.26 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
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
import express from 'express';
import dotenv from 'dotenv';
import cors from 'cors';
import helmet from 'helmet';
import path from 'path';
import fs from 'fs';
import { fileURLToPath } from 'url';
import connectDB from './config/db.js';
import upload from './middleware/fileUpload.js';
// Log Node.js version
console.log('Node version:', process.version);
// Create __dirname for ES6 modules
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
// Load environment variables
dotenv.config();
// Initialize Express app
const app = express();
// CORS Configuration
const whitelist = [
'https://ishaazilivestockservices.com',
'https://www.ishaazilivestockservices.com',
'https://ishaazi-livestock-services-production.up.railway.app',
'http://localhost:3000',
'http://127.0.0.1:3000'
];
app.use(cors({
origin: function (origin, callback) {
console.log("Request origin:", origin); // For debugging
if (!origin || whitelist.indexOf(origin) !== -1) {
callback(null, true);
} else {
console.log("Blocked origin:", origin); // For debugging
callback(new Error('Not allowed by CORS'));
}
},
credentials: true,
methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
allowedHeaders: ['Content-Type', 'Authorization'],
}));
app.options('*', cors());
// Apply security headers
app.use(helmet({
contentSecurityPolicy: false, // Disable CSP to avoid blocking resources
}));
// Parse incoming requests
app.use(express.json({ limit: '10mb' }));
app.use(express.urlencoded({ extended: true, limit: '10mb' }));
// Database connection
connectDB()
.then(() => console.log("Connected to MongoDB"))
.catch(err => {
console.error('Database connection failed:', err.message);
process.exit(1);
});
// Ensure uploads directory exists
const uploadsDir = path.join(__dirname, 'uploads', 'images');
if (!fs.existsSync(uploadsDir)) {
fs.mkdirSync(uploadsDir, { recursive: true });
console.log('Uploads images directory created.');
}
// Serve static files
app.use(
'/uploads',
express.static(path.join(__dirname, 'uploads'), {
setHeaders: (res, filePath) => {
const ext = path.extname(filePath).toLowerCase();
const mimeTypes = {
'.jpg': 'image/jpeg',
'.jpeg': 'image/jpeg',
'.png': 'image/png',
'.gif': 'image/gif',
'.webp': 'image/webp'
};
res.set('Content-Type', mimeTypes[ext] || 'application/octet-stream');
}
})
);
// Request logger
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
console.log('Headers:', req.headers);
console.log('Body:', req.body);
next();
});
// Import routes
import adminRoutes from './routes/adminRoutes.js';
import contentRoutes from './routes/contentRoutes.js';
// Mount routes
app.use('/api/admin', adminRoutes);
app.use('/api/content', contentRoutes);
// File upload route
app.post('/api/upload', upload.single('file'), (req, res) => {
if (!req.file) {
return res.status(400).json({ message: 'File upload failed', error: 'No file provided' });
}
res.status(201).json({
message: 'File uploaded successfully',
file: {
path: `${req.protocol}://${req.get('host')}/uploads/images/${req.file.filename}`,
name: req.file.originalname,
type: req.file.mimetype,
},
});
});
// Health check route
app.get('/health', (req, res) => {
res.status(200).json({ status: 'OK', timestamp: new Date().toISOString() });
});
// Basic route for testing
app.get('/', (req, res) => {
res.send('Welcome to the Online Farming Magazine API');
});
// Global error-handling middleware
app.use((err, req, res, next) => {
console.error(`Error ${new Date().toISOString()}:`);
console.error('Message:', err.message);
console.error('Stack:', err.stack);
console.error('Request details:', {
method: req.method,
url: req.url,
headers: req.headers,
body: req.body
});
res.status(500).json({
message: 'Internal Server Error',
error: process.env.NODE_ENV === 'production' ? null : err.message,
});
});
// Port configuration for cPanel
const PORT = process.env.PORT || 8080;
app.listen(PORT, '0.0.0.0', () => {
console.log(`Server running on http://127.0.0.1:${PORT}`);
console.log('Environment:', process.env.NODE_ENV);
});
export default app;