-
Notifications
You must be signed in to change notification settings - Fork 8
/
Copy pathapp.js
executable file
Β·149 lines (131 loc) Β· 4.41 KB
/
app.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
"use strict";
const express = require("express");
const path = require("path");
const cookieParser = require("cookie-parser");
const cookieSession = require("cookie-session");
const cors = require("cors");
const Services = {
log: require("./services/logger.service"),
db: require("./services/database.service"),
auth: require("./services/auth.service"),
env: require("./services/env.service")
};
const envLoadResult = Services.env.load(path.join(__dirname, "./.env"));
if (envLoadResult.error) {
Services.log.warn(envLoadResult.error);
}
const passport = require("passport");
passport.use("emailAndPass", Services.auth.emailAndPassStrategy);
/* Routes here */
const indexRouter = require("./routes/index");
const accountRouter = require("./routes/api/account");
const authRouter = require("./routes/api/auth");
const hackerRouter = require("./routes/api/hacker");
const teamRouter = require("./routes/api/team");
const travelRouter = require("./routes/api/travel");
const sponsorRouter = require("./routes/api/sponsor");
const searchRouter = require("./routes/api/search");
const settingsRouter = require("./routes/api/settings");
const volunteerRouter = require("./routes/api/volunteer");
const roleRouter = require("./routes/api/role");
const app = express();
Services.db.connect();
let corsOptions = {};
if (!Services.env.isProduction()) {
corsOptions = {
origin: [`http://${process.env.FRONTEND_ADDRESS_DEV}`],
credentials: true
};
} else {
corsOptions = {
origin: (origin, callback) => {
const allowedOrigins = [
`https://${process.env.FRONTEND_ADDRESS_DEPLOY}`,
`https://${process.env.FRONTEND_ADDRESS_BETA}`,
`https://docs.mchacks.ca`
];
const regex = /^https:\/\/dashboard-[\w-]+\.vercel\.app$/;
if (
allowedOrigins.includes(origin) || // Explicitly allowed origins
regex.test(origin) // Matches dashboard subdomains
) {
callback(null, true);
} else {
callback(new Error('Not allowed by CORS'));
}
},
credentials: true
};
}
app.use(cors(corsOptions));
app.use(Services.log.requestLogger);
app.use(Services.log.errorLogger);
app.use(express.json());
app.use(
express.urlencoded({
extended: false
})
);
app.use(cookieParser());
//Cookie-based session tracking
app.use(
cookieSession({
name: "session",
keys: [process.env.COOKIE_SECRET],
// Cookie Options
maxAge: 48 * 60 * 60 * 1000, //Logged in for 48 hours
sameSite: process.env.COOKIE_SAME_SITE,
secureProxy: !Services.env.isTest()
})
);
app.use(passport.initialize());
app.use(passport.session()); //persistent login session
app.use(express.static(path.join(__dirname, "public")));
var apiRouter = express.Router();
accountRouter.activate(apiRouter);
Services.log.info("Account router activated");
authRouter.activate(apiRouter);
Services.log.info("Auth router activated");
hackerRouter.activate(apiRouter);
Services.log.info("Hacker router activated");
teamRouter.activate(apiRouter);
Services.log.info("Team router activated");
travelRouter.activate(apiRouter);
Services.log.info("Travel router activated");
sponsorRouter.activate(apiRouter);
Services.log.info("Sponsor router activated");
volunteerRouter.activate(apiRouter);
Services.log.info("Volunteer router activated");
searchRouter.activate(apiRouter);
Services.log.info("Search router activated");
settingsRouter.activate(apiRouter);
Services.log.info("Settings router activated");
roleRouter.activate(apiRouter);
Services.log.info("Role router activated");
apiRouter.use("/", indexRouter);
app.use("/", indexRouter);
app.use("/api", apiRouter);
//Custom error handler
app.use((err, req, res, next) => {
// log the error...
const status = err.status ? err.status : 500;
const message = err.message ? err.message : "Internal Server Error";
//Only show bad error when we're not in deployment
let errorContents;
if (status === 500 && Services.env.isProduction()) {
errorContents = {};
} else if (err.error) {
errorContents = err.error;
} else if (err.data) {
errorContents = err.data;
} else {
errorContents = err;
}
res.status(status).json({
message: message,
data: errorContents
});
});
module.exports = {
app: app
};