thegameofcode/cipherlayer

View on GitHub
src/routes_public/user/activateUser_get.js

Summary

Maintainability
A
3 hrs
Test Coverage
'use strict';

const config = require('../../../config');
const userMng = require('../../managers/user');
const redirectOnError = require('../../util/redirectOnError')(config);

module.exports = function (req, res, next) {
    if (!req.params) {
        res.send(400, {
            err: 'invalid_url_params',
            des: 'The call to this url must have params.'
        });
        return next();
    }

    userMng().createUserByToken(req.params.verifyToken, function (err, tokens) {
        if (err) {

            if (redirectOnError.enabled()) {
                redirectOnError.redirect(err, req, res, next);
                return;
            }

            if (!err.code) {
                res.send(500, err);
                return next();
            }

            const errCode = err.code;
            delete(err.code);
            res.send(errCode, err);
            return next();
        }

        if (req.method === 'POST') {
            res.send(200, tokens);
            return next();
        }

        const compatibleDevices = config.emailVerification.compatibleEmailDevices;
        const userAgent = String(req.headers['user-agent']);

        for (let i = 0; i < compatibleDevices.length; i++) {
            const exp = compatibleDevices[i];
            const check = exp.replace(/\*/g, '.*');
            let match = userAgent.match(check);
            const isCompatible = (match !== null && userAgent === match[0]);
            if (isCompatible) {
                match = userAgent.match(/.*Android.*/i);
                const isAndroid = (match !== null && userAgent === match[0]);
                let location = `${config.emailVerification.scheme}://user/refreshToken/${tokens.refreshToken}`;

                if (isAndroid) {
                    location = `intent://user/refreshToken/${tokens.refreshToken}/#Intent;scheme=${config.emailVerification.scheme};end`;
                }
                res.header('Location', location);
                res.send(302);
                return next();
            }
        }

        if (config.emailVerification.redirectUrl) {
            const refreshToken = config.emailVerification.redirectRefreshToken ? `?refreshToken=${tokens.refreshToken}`: '';
            res.setHeader('Location', config.emailVerification.redirectUrl + refreshToken);
            res.send(301);
            return next();
        }

        res.send(200, {msg: config.emailVerification.nonCompatibleEmailMsg});
        return next();

    });
};