Source: main/controllerMain.js


'use strict'

const path = require('path')

const { application: { staticMaxAge } } = require('../config')
const { displayReactPage } = require('./reactPage')
const { displayObsoletePage } = require('./obsoletePage')

const envSesathequeConf = process.env.SESATHEQUE_CONF

const root = path.resolve(__dirname, '..', '..', '..')

/**
 * Controleur du composant main pour les routes "statiques"
 * @Controller controllerMain
 */
module.exports = function (mainComponent) {
  mainComponent.controller(function ($rail) {
    // l'appli express
    const app = $rail.get()
    // nos ressources statiques générées par webpack
    const expressOptions = {
      fsPath: path.join(root, 'build'),
      maxAge: staticMaxAge || '7d'
    }
    // cf conf webpack, si y'a un SESATHEQUE_CONF ça build dans build.*
    if (envSesathequeConf) expressOptions.fsPath += '.' + envSesathequeConf
    this.serve('/', expressOptions)
    // et les ressources statiques qui bougent pas (CopyWebpackPlugin arrive pas à les copier, y'en a trop)
    expressOptions.fsPath = path.join(root, 'app', 'assets')
    this.serve('/', expressOptions)

    // le source react pour toutes ses routes
    // (en dev on sera pas appelé car c'est webpack-dev-server qui gère)
    // cf app/client-react/App.js pour ne pas oublier de routes

    // On continue à passer ici par un contrôleur pour toutes les pages statiques, même si à première
    // vue ce serait plus intelligent de construire ça au build avec html-webpack-plugin et le servir
    // en statique (via le serve qui précède), car les routes dynamiques demandent un contrôleur et
    // représentent > 90% des requêtes, pas la peine de doublonner du code pour optimiser un peu les
    // 10% qui restent.
    const reactRoutes = [
      '/',
      '/autocomplete',
      '/compte',
      '/mentionsLegales',
      '/ressource/ajouter',
      '/ressource/modifier/:oid',
      '/ressource/apercevoir/:oid',
      '/ressource/decrire/:oid',
      '/ressource/rechercher',
      '/groupe/ajouter',
      '/groupe/editer/:groupe',
      '/groupes/perso',
      '/groupes/ouverts',
      '/groupes/publics'
    ]
    reactRoutes.forEach(route => this.get(route, displayReactPage))

    // page destinée aux navigateurs non pris en charge
    this.get('/navigateurObsolete', displayObsoletePage)

    // lassi ne gère pas les requêtes head. nginx en frontal le fait pour nous,
    // mais on veut répondre sur / pour le monitoring local (avec monit le 'protocol http' donne du head)
    app.head('/', (req, res) => res.send())
  })
}