-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathindex.js
121 lines (99 loc) · 3.44 KB
/
index.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
const express = require('express')
const compression = require('compression')
const path = require('path')
const eta = require('eta')
const fs = require('fs')
const mongoose = require('mongoose')
const Request = require('./models/request')
const app = express()
app.use(compression())
app.use(express.json())
app.use(express.urlencoded({ extended: true }))
app.use('/static', express.static(path.join(__dirname, './client', 'static')))
app.engine('eta', eta.renderFile)
app.set('view engine', 'eta')
app.set('views', './client/views')
const PORT = process.env.PORT || 5000
const languages = {}
const availableLanguages = []
const d = new Date()
const MONGODB_USER = process.env.MONGODB_USER
const MONGODB_PW = process.env.MONGODB_PW
const MONGODB_URL = process.env.MONGODB_URL
const MONGODB_DB = process.env.MONGODB_DB
const MONGODB_URI = `mongodb+srv://${MONGODB_USER}:${MONGODB_PW}@${MONGODB_URL}/${MONGODB_DB}?retryWrites=true&w=majority`
// mongoose setup
const options = {
useNewUrlParser: true,
useUnifiedTopology: true
}
mongoose.connect(MONGODB_URI, options)
fs.readdir('./languages', (err, filenames) => {
for (let file of filenames) {
fs.readFile('./languages/' + file, 'utf-8', (err, content) => {
let iso = file.split('.')[0]
content = JSON.parse(content)
content.settings['iso'] = iso
languages[iso] = content
availableLanguages.push({ iso: iso, value: content.settings.value, display_name: content.settings.display_name })
})
}
})
app.use((req, res, next) => {
saveMetrics(req)
next()
})
app.get('/', (req, res) => {
const userLanguages = req.acceptsLanguages()
const cookies = parseCookies(req.headers.cookie)
const selectedLanguage = Object.keys(cookies).includes('selectedLanguage') ? cookies.selectedLanguage : 'en'
res.render('index', { ...languages[selectedLanguage], availableLanguages })
})
app.get('/sources', (req, res) => {
res.render('sources')
})
// robots.txt
app.get('/robots.txt', function (req, res) {
res.type('text/plain')
res.send('User-agent: *\nDisallow:')
})
app.get('/sitemap.xml', (req, res) => {
d.setDate(d.getDate() - 1)
console.log(availableLanguages)
res.header('Content-Type', 'application/xml')
res.render('sitemap', { date: d , languages: availableLanguages})
})
app.get('/:lang', (req, res) => {
let selectedLanguage = req.params.lang
let available = availableLanguages.map(language => language.iso)
if(available.includes(selectedLanguage)) {
res.render('index', { ...languages[selectedLanguage], availableLanguages })
}
else {
res.render('404')
}
})
app.get('*', (req, res) => {
res.render('404')
})
app.listen(PORT, () => {
console.log(`listening on http://localhost:${PORT}`)
})
function parseCookies (raw) {
if (!raw) {
return []
}
const cookies = {}
for (cookie of raw.split('; ')) {
const [key, value] = cookie.split('=')
cookies[key] = value
}
return cookies
}
async function saveMetrics(req) {
const cookies = parseCookies(req.headers.cookie)
const existing = Object.keys(cookies).includes('selectedLanguage') ? "existing user" : "new user"
const selectedLanguage = Object.keys(cookies).includes('selectedLanguage') ? cookies.selectedLanguage : 'en'
console.log(`${req.method} ${req.originalUrl} ${new Date()} ${existing} ${req.get("host")}`)
Request.create({base: req.get("host"), path: req.originalUrl, time: new Date(), newUser: !Object.keys(cookies).includes('selectedLanguage'), language: selectedLanguage})
}