127.0.0.1:8000 watch-together / master server / utils / snippets.js
master

Tree @master (Download .tar.gz)

snippets.js @masterraw · history · blame

const utils = require('.');
const mailgun = require('./mailgun');
const time = require('./time');
const query_string = require('query-string');

function generate_token(table, key, email, overrides) {
    overrides = overrides || {};
    let token = overrides.token || utils.uuid();
    // So there either is no token at all, or there is one but it has expired
    return utils.query(
        `INSERT INTO ${table} (${key}, email, expires) ` +
        `VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE ${key}=VALUES(${key}), expires=VALUES(expires)`,
        [token, email, Date.now() + (overrides.ttl || time.one_day)]
    ).then(() => token);
}

module.exports = {
    generate_token,
    generate_token_and_send_email: function(res, table, token_id, email, send_command, overrides) {
        overrides = overrides || {};
        res.locals.log.v("Generate", token_id, "for", email);
        return generate_token(
            table, token_id, email, overrides
        ).catch(utils.handle_err.sql(res)).then(function(token) {
            res.locals.log.v("Generated token", token);
            return mailgun[send_command](email, overrides.email_params || {
                query: query_string.stringify({
                    token: token
                })
            }).catch(utils.handle_err.mailgun(res)).catch(function(error) {
                // If the confirmation email fails to send, we need to delete the row
                // from the email_confirmations table so that it can be sent again.
                return utils.query(`DELETE FROM ${table} WHERE ?`, {
                    [token_id]: token
                }).catch(utils.handle_err.sql(res, true)).finally(function() {
                    return utils.reject(error);
                });
            });
        });
    }
}