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);
});
});
});
}
}