const express = require('express'); const fs = require('fs'); const sendmail = require('sendmail')({silent: true}); const uniqid = require('uniqid'); const path = require('path'); var router = express.Router(); const confirmationsPath = '../database/confirmations.json'; const writeJsonFile = (file, data) => { fs.writeFileSync(path.join(__dirname, file), JSON.stringify(data)); }; const readJsonFile = (file) => { return JSON.parse(fs.readFileSync(path.join(__dirname, file)).toString()); }; /** This function is for the validation of the email address. * Required arguments (in POST) are: * email: string * message: string * number: number * name: string */ router.post('/', (req, res, _next) => { // Generate an id. const id = uniqid(); // Send an email with a link to validate the id. sendmail({ from: 'surpise-box@jobbel.nl', to: req.body.email, subject: 'test sendmail', html: `

Beste ${req.body.name},

Deze email is verzonden omdat u surprise box ${req.body.number} voor de kerstmarkt van Het Heerenlanden heeft aangevraagd.
Om uw aanvraag te bevestigen, moet u om de volgende link klikken:
http://localhost:3000/mail/validate/${id}

Met vriendelijk groet,
het surprise box team van Het Heerenlanden

`, // Once it is sent }, function(err, reply) { // If there's an error if (err) { // Notify the front-end res.json({result: {success: false, data: err}}); } else { // Add the user's data to the database identified by the id. writeJsonFile(confirmationsPath, { // Make sure that the other records are preserved. ...readJsonFile(confirmationsPath), // Then add the new one [id]: { 'name': req.body.name, 'number': Number(req.body.number), 'timestamp': Date.now(), 'message': req.body.message } }) // Notify the front-end res.json({result: {success: true, data: reply}}); } }); }); /** This function is used when a user clicks on the link in their email. * * This should be extremely user-friendly. */ router.get('/validate/:id', (req, res, _next) => { const data = readJsonFile(confirmationsPath); const id = req.params.id; // If id is found and the user is in time if (data[id] && Date.now() <= (data[id].timestamp + 3600000 /* one hour in milliseconds */)) { // send success result // res.json({result: {success: true, data: data[id].number}}); res.render('validate-success', {number: data[id].number}) // Delete the record delete data[id]; writeJsonFile(confirmationsPath, data); } else { // Else if the id is found but the time is expired if (data[id] && Date.now() > (data[id].timestamp + 3600000)) { // send result //res.json({result: {success: false, data: 'expired'}}); res.render('validate-error', {data: 'expired', number: data[id].number }); // delete the record delete data[id]; writeJsonFile(confirmationsPath, data); // If the id is not found } else { //res.json({result: {success: false, data: 'ID not found'}}); res.render('validate-error', {data: 'not found'}); } } }); module.exports = router;