This repository was archived by the owner on Oct 1, 2021. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathmiddleware.ts
More file actions
118 lines (107 loc) · 3.65 KB
/
Copy pathmiddleware.ts
File metadata and controls
118 lines (107 loc) · 3.65 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
import mongoose from "mongoose";
import MongoStore from "connect-mongo";
import session from "express-session";
import { Agenda } from "agenda";
import passport from "passport";
import { Strategy as GitHubStrategy } from "passport-github2";
import morgan from "morgan";
import helmet from "helmet";
import { json, urlencoded } from "express";
import compression from "compression";
import type { Application } from "express";
import type { IUser } from "./models/User";
import config from "./config";
import { User } from "./models/User";
import { Style } from "./models/Style";
import initCollection from "./models/init";
// Database
mongoose.connect(config.mongoUrl, {
useCreateIndex: true,
useFindAndModify: false,
useNewUrlParser: true,
useUnifiedTopology: true
});
mongoose.connection.on("error", console.error.bind(console, "MongoDB connection error:"));
initCollection();
// Authentication
passport.use(
new GitHubStrategy({
clientID: config.github.OAuth.clientId,
clientSecret: config.github.OAuth.clientSecret,
callbackURL: "/github/callback",
proxy: process.env.NODE_ENV === "production",
passReqToCallback: true
}, User.findOrCreate.bind(User, "GitHub"))
);
passport.use(
"codeberg",
new GitHubStrategy({
clientID: config.codeberg.OAuth.clientId,
clientSecret: config.codeberg.OAuth.clientSecret,
callbackURL: "/codeberg/callback",
proxy: process.env.NODE_ENV === "production",
authorizationURL: "https://codeberg.org/login/oauth/authorize",
tokenURL: "https://codeberg.org/login/oauth/access_token",
userProfileURL: "https://codeberg.org/api/v1/user",
passReqToCallback: true
}, User.findOrCreate.bind(User, "Codeberg"))
);
passport.serializeUser((user: IUser, done) => {
done(null, user._id);
});
passport.deserializeUser((id, done) => {
User.findById(id).lean().exec((error: mongoose.CallbackError, user) => {
if (error) return done(error);
if (user) return done(null, user as Express.User);
});
});
// Agenda
const agenda = new Agenda({ db: { address: config.mongoUrl } });
if (process.env.NODE_ENV === "production") {
agenda.define("Update all styles", async () => {
const result = await Style.updateAllStyles();
console.log(`Update successful: ${!!result.ok}. Updated ${result.nModified} of ${result.nMatched}`);
});
agenda.start().then(() => agenda.every("0 * * * *", "Update all styles"));
}
// Middleware
export default function addExpressMiddleware(app: Application) {
if (process.env.NODE_ENV === "production") app.enable("trust proxy");
app.use(morgan("dev"));
app.use(helmet({
referrerPolicy: { policy: "strict-origin-when-cross-origin" },
contentSecurityPolicy: {
directives: {
"default-src": ["'self'"],
"img-src": ["'self'", "data:", "https:"],
"style-src": ["'self'", "'unsafe-inline'"],
"script-src": [
"'self'", "data:",
"https://www.googletagmanager.com", "https://www.google-analytics.com",
"https://cloudflareinsights.com", "https://static.cloudflareinsights.com"
],
"connect-src": [
"'self'",
"https://www.google-analytics.com",
"https://cloudflareinsights.com", "https://static.cloudflareinsights.com"
]
}
}
}));
app.use(json());
app.use(urlencoded({ extended: true }));
app.use(session({
store: MongoStore.create({ mongoUrl: config.mongoUrl }),
proxy: process.env.NODE_ENV === "production",
resave: true,
saveUninitialized: false,
cookie: {
maxAge: 3600000 * 24 * 14
},
rolling: true,
...config.session
}));
app.use(passport.initialize());
app.use(passport.session());
app.use(compression());
}