# Source: app/FrontendUnit.js

    const Unit = require('libflitter/Unit')
    const Express = require('express')
    const path = require('path')

    /**
     * FrontendUnit
     * ----------------------------------------------------------------------------------------
     * A Flitter application unit which sets up routes for accessing the javascript front-end
     * pages we created in Project 3.
     *
     * @extends Unit
     */
    class FrontendUnit extends Unit {
        static get services() {
            return [...super.services, 'configs', 'express', 'canon', 'utility', 'models']
        }

        constructor(...args) {
            super(...args)

            /**
             * Fully qualified path to the root of the ionic app.
             * @type {string}
             */
            this.directory = this.utility.path(this.configs.get('server.frontend_path'))
        }

        /**
         * Initializes the unit. Creates the `/app` static endpoing and default settings.
         * @param {FlitterApp} app
         */
        async go(app) {
            app.express.use('/app', [
                this.canon.get('middleware::auth:UserOnly'),
                (req, res, next) => {
                    if ( !req.user ) {
                        return res.redirect('/auth/login')
                    }

                    const allowed_extensions = [
                        '.html', '.js', '.css', '.svg', '.ttf', '.jpg', '.png',
                        '.jpeg', '.webmanifest', '.json', '.eot', '.svg', '.cur',
                        '.webp', '.gif', '.otf', '.woff', '.woff2', '.ani', '.map',
                        '.ico',
                    ]

                    for ( const k1 in allowed_extensions ) {
                        if ( req.path.endsWith(allowed_extensions[k1]) ) return next()
                    }

                    return res.sendFile(path.resolve(this.directory, 'index.html'))
                },
                Express.static(this.directory),
            ])

            // Set the default setting values
            const Setting = this.models.get('models::setting')  // a built-in helper
            const default_settings = this.configs.get('settings.default_settings') || []

            for ( const default_setting of default_settings ) {
                await Setting.guarantee(default_setting.key, default_setting.value)
            }
        }
    }

    module.exports = exports = FrontendUnit