-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathserver.js
153 lines (133 loc) · 4.4 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
const mongoose = require('mongoose');
const body = require('body-parser');
const express = require('express');
const next = require('next');
const multer = require('multer');
const cors = require('cors');
const compression = require('compression');
const { SitemapStream, streamToPromise } = require('sitemap');
const { createGzip } = require('zlib');
const api = require('./api/api');
const getUrls = require('./util/getUrls');
const { MONGO_URL } = process.env;
const PORT = process.env.PORT || 3000;
let sitemap;
const storage = multer.memoryStorage();
const upload = multer({ storage });
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();
app
.prepare()
.then(async () => {
console.log(`Connecting to ${MONGO_URL}`);
const { connection: db } = await mongoose
.connect(MONGO_URL, {
useNewUrlParser: true,
useFindAndModify: false,
useCreateIndex: true,
useUnifiedTopology: true,
})
.catch((err) => console.log('err', err));
const server = express();
server.use(compression());
server.use(cors());
server.use(
body.json({
verify(req, res, buf) {
if (req.originalUrl.startsWith('/api/webhook')) {
req.rawBody = buf.toString();
}
},
})
);
server.use((req, res, next) => {
// Also expose the MongoDB database handle so Next.js can access it.
req.db = db;
next();
});
server.use('/api', api(db, upload));
// make clean URL's possible from server
server.get('/piece/:slug', (req, res) => {
const actualPage = '/piece';
const queryParams = { slug: req.params.slug };
app.render(req, res, actualPage, queryParams);
});
server.get('/piece', (req, res) => {
const actualPage = '/gallery';
app.render(req, res, actualPage);
});
server.get('/edit/:slug', (req, res) => {
const actualPage = '/edit';
const queryParams = { slug: req.params.slug };
app.render(req, res, actualPage, queryParams);
});
server.get('/gallery/:collection', (req, res) => {
const actualPage = '/gallery';
const queryParams = { collection: req.params.collection.toLowerCase() };
app.render(req, res, actualPage, queryParams);
});
server.get('/robots.txt', (req, res) => {
res.status(200).sendFile('robots.txt', {
root: `${__dirname}/public/`,
headers: {
'Content-Type': 'text/plain;charset=UTF-8',
},
});
});
server.get('/sitemap.xml', async (req, res) => {
res.header('Content-Type', 'application/xml');
res.header('Content-Encoding', 'gzip');
// if we have a cached entry send it
if (sitemap) {
res.send(sitemap);
return;
}
try {
const smStream = new SitemapStream({
hostname: process.env.NEXT_PUBLIC_APP_URL,
});
const pipeline = smStream.pipe(createGzip());
const urls = await getUrls();
for (const obj of Object.values(urls)) {
const { page, lastModified } = obj;
if (Object.prototype.hasOwnProperty.call(obj, 'images')) {
const { caption, title, images } = obj;
smStream.write({
url: page,
lastmod: lastModified,
img: images.map((imgObj) => ({
url: `${process.env.NEXT_PUBLIC_AWS_BUCKET}/photos/${imgObj.big}`,
caption,
title,
license: 'https://creativecommons.org/licenses/by/4.0/',
})),
});
} else {
smStream.write({ url: page, lastmod: lastModified }); // changefreq: 'weekly', priority: 0.5
}
}
smStream.end();
// cache the response
streamToPromise(pipeline).then((sm) => (sitemap = sm));
// stream the response
pipeline.pipe(res).on('error', (e) => {
throw e;
});
} catch (e) {
console.error(e);
res.status(500).end();
}
});
server.get(['/favicon.ico', '*/static/images/*'], (req, res) => {
res.setHeader('Cache-Control', 'public,max-age=31536000,immutable');
return handle(req, res);
});
server.get('*', (req, res) => handle(req, res));
server.listen(PORT, () => {
console.log(`Server listening on ${PORT}`);
});
})
.catch((err) => {
console.error(err);
});