Repository navigation
Expand file tree
/
Copy pathserver.js
More file actions
106 lines (89 loc) · 3.19 KB
/
Copy pathserver.js
File metadata and controls
106 lines (89 loc) · 3.19 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
require('dotenv').config();
const express = require('express');
const path = require('path');
const session = require('express-session');
const SQLiteStore = require('connect-sqlite3')(session);
const expressLayouts = require('express-ejs-layouts');
const helmet = require('helmet');
const app = express();
app.set('trust proxy', 1); // Trust first proxy (Nginx) to fix express-rate-limit ERR_ERL_UNEXPECTED_X_FORWARDED_FOR
// Security Headers
app.use(helmet({
contentSecurityPolicy: false, // Disabling CSP temporarily to avoid breaking existing inline scripts/styles without a full audit
}));
// Middleware
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(express.static(path.join(__dirname, 'public')));
// View Engine
app.use(expressLayouts);
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));
app.set('layout', 'layout');
// Sessions
app.use(session({
store: new SQLiteStore({ dir: __dirname, db: 'sessions.sqlite' }),
secret: process.env.SESSION_SECRET || 'taskwhite_fallback_secret_xyz',
resave: false,
saveUninitialized: false,
cookie: {
maxAge: 30 * 24 * 60 * 60 * 1000, // 30 days
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax'
}
}));
function formatAppDate(dateVal) {
if (!dateVal) return '-';
let dateObj;
if (typeof dateVal === 'string') {
const parts = dateVal.split('-');
if (parts.length !== 3) return dateVal;
dateObj = new Date(parts[0], parts[1] - 1, parts[2]);
} else if (dateVal instanceof Date) {
dateObj = dateVal;
} else if (dateVal.toDate && typeof dateVal.toDate === 'function') {
dateObj = dateVal.toDate();
} else {
return dateVal;
}
if (isNaN(dateObj.getTime())) return '-';
const days = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];
const months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
const dayName = days[dateObj.getDay()];
const dayStr = String(dateObj.getDate()).padStart(2, '0');
const monthName = months[dateObj.getMonth()];
const yearStr = dateObj.getFullYear();
return `${dayName}, ${dayStr}-${monthName}-${yearStr}`;
}
// Setup global variables for views
app.use((req, res, next) => {
res.locals.user = req.session.user || null;
res.locals.currentPath = req.path;
res.locals.formatAppDate = formatAppDate;
next();
});
// Routes
const { router: authRoutes } = require('./routes/authRoutes');
const dashboardRoutes = require('./routes/dashboardRoutes');
const taskRoutes = require('./routes/taskRoutes');
const masterDataRoutes = require('./routes/masterDataRoutes');
app.use('/', authRoutes);
app.use('/', dashboardRoutes);
app.use('/', taskRoutes);
app.use('/', masterDataRoutes);
const contentRoutes = require('./routes/contentRoutes');
app.use('/', contentRoutes);
// Passport
const passport = require('passport');
require('./config/passport')(passport);
app.use(passport.initialize());
app.use(passport.session());
// Start Server
const PORT = process.env.PORT || 14000;
// Initialize Cron Jobs
const { initCronJobs } = require('./scripts/cronJobs');
initCronJobs();
app.listen(PORT, () => {
console.log(`Server running on http://localhost:${PORT}`);
});