129 lines
4.0 KiB
JavaScript
129 lines
4.0 KiB
JavaScript
// Import 3rd party node modules.
|
|
const express = require('express')
|
|
const path = require('path')
|
|
const logger = require('morgan')
|
|
const helmet = require('helmet')
|
|
const favicon = require('serve-favicon')
|
|
const cookieParser = require('cookie-parser')
|
|
const createError = require('http-errors')
|
|
const flash = require('connect-flash-plus')
|
|
const i18next = require('i18next')
|
|
const i18nextMiddleware = require('i18next-http-middleware')
|
|
// const debug = require('debug')('termPortal:app')
|
|
|
|
// Import own modules.
|
|
const { isBehindProxy, secret } = require('./config/keys')
|
|
const helmetConfig = require('./config/helmet')
|
|
const session = require('./middleware/session')
|
|
const i18n = require('./middleware/i18n')
|
|
const passport = require('./middleware/auth')
|
|
const user = require('./middleware/user')
|
|
const settings = require('./middleware/settings')
|
|
const { enhanceLocals, adjustHeaders } = require('./middleware')
|
|
const { capitalize } = require('./utils')
|
|
|
|
// Import Routers.
|
|
const apiRouter = require('./routes/api')
|
|
const adminRouter = require('./routes/admin')
|
|
const dictionariesRouter = require('./routes/dictionaries')
|
|
const extractionRouter = require('./routes/extraction')
|
|
const consultancyRouter = require('./routes/consultancy')
|
|
const indexRouter = require('./routes/index')
|
|
|
|
// Create express app.
|
|
const app = express()
|
|
|
|
// View engine setup.
|
|
const viewsPath = path.join(__dirname, 'views')
|
|
app.set('view engine', 'pug')
|
|
app.set('views', viewsPath)
|
|
app.locals.basedir = viewsPath
|
|
|
|
// Other settings.
|
|
const inDevEnv = app.get('env') === 'development'
|
|
if (isBehindProxy) app.set('trust proxy', 1) // Trust first proxy.
|
|
app.locals.inDevEnv = inDevEnv
|
|
app.locals.capitalize = capitalize
|
|
|
|
// Mount middleware.
|
|
app.use(logger('dev'))
|
|
app.use(helmet(helmetConfig))
|
|
app.use(favicon(path.join(__dirname, 'public', 'images', 'favicon.ico')))
|
|
app.use(
|
|
express.static(path.join(__dirname, 'public'), {
|
|
maxAge: inDevEnv ? 0 : '1h'
|
|
})
|
|
)
|
|
app.use(express.json({ type: ['application/json', 'application/csp-report'] }))
|
|
app.use(express.urlencoded({ extended: true }))
|
|
app.use(cookieParser(secret))
|
|
app.use(session)
|
|
app.use(flash())
|
|
app.use(passport.initialize())
|
|
app.use(passport.session())
|
|
app.use(passport.authenticate('remember-me'))
|
|
app.use(i18n.determineRequestLanguage)
|
|
app.use(i18nextMiddleware.handle(i18next))
|
|
app.use(user.enhance)
|
|
app.use(settings.prepareRequiredSettings)
|
|
app.use(enhanceLocals)
|
|
app.use(adjustHeaders)
|
|
|
|
if (inDevEnv) {
|
|
app.post(
|
|
'/locales/add/:lng/:ns',
|
|
i18nextMiddleware.missingKeyHandler(i18next)
|
|
)
|
|
}
|
|
|
|
// Apparently express-debug can't be run inside another middleware and must be run in this file.
|
|
// To help you debug, temporarily uncomment the next line, but comment the helmet line due to strict CSP.
|
|
// if (app.get('env') === 'development') require('express-debug')(app)
|
|
|
|
// Pretty printing pug output is strongly ill-advised and deprecated, since too often, it creates subtle bugs.
|
|
// But if you really need it to help you debug, you can temporarily enable the next line.
|
|
// app.locals.pretty = true
|
|
|
|
// Mount routers.
|
|
app.use('/api', apiRouter)
|
|
app.use('/admin', adminRouter)
|
|
app.use('/slovarji', dictionariesRouter)
|
|
app.use('/luscenje', extractionRouter)
|
|
app.use('/svetovanje', consultancyRouter)
|
|
app.use('/', indexRouter)
|
|
|
|
// Catch 404 and forward to error handler.
|
|
app.use((req, res, next) => next(createError(404)))
|
|
|
|
// Error handler.
|
|
app.use((err, req, res, next) => {
|
|
// eslint-disable-next-line no-console
|
|
if (err.status !== 404) console.error(err)
|
|
|
|
// Set error info to be displayed to user depending on environment.
|
|
let message, error
|
|
|
|
if (inDevEnv || err.displayInProd) {
|
|
message = err.message
|
|
error = err
|
|
} else {
|
|
message =
|
|
err.status === 404
|
|
? req.t('Stran ne obstaja')
|
|
: req.t('Prišlo je do strežniške napake. Poskusite kasneje.')
|
|
error = {}
|
|
}
|
|
|
|
res.status(err.status || 500)
|
|
|
|
// Send plain error message for ajax requests.
|
|
if (req.isAjax) {
|
|
return res.send(message)
|
|
}
|
|
|
|
// Render the error page.
|
|
res.render('error', { title: req.t('Napaka'), message, error })
|
|
})
|
|
|
|
module.exports = app
|