// app/utils/emailVerification.util.js const crypto = require("crypto"); const redis = require("../config/redisClient"); const EMAIL_VERIFICATION_TTL = Number( process.env.EMAIL_VERIFICATION_TTL_SECONDS ) || 1800; const generateEmailVerificationToken = () => { return crypto .randomBytes(32) .toString("hex"); }; const hashEmailVerificationToken = (token) => { return crypto .createHash("sha256") .update(token) .digest("hex"); }; const createEmailVerification = async (userId) => { // 1. Generate raw token const token = generateEmailVerificationToken(); // 2. Hash token const tokenHash = hashEmailVerificationToken(token); // 3. Create Redis key const redisKey = `email-verification:${tokenHash}`; await redis.set( redisKey, userId, "EX", EMAIL_VERIFICATION_TTL ); return token; }; /** * Check a verification token. */ const verifyEmailVerificationToken = async (token) => { if ( !token || typeof token !== "string" ) { return null; } // 1. Hash token received from user const tokenHash = hashEmailVerificationToken(token); // 2. Build same Redis key const redisKey = `email-verification:${tokenHash}`; // 3. Search Redis const userId = await redis.get(redisKey); if (!userId) { return null; } return { userId, redisKey, }; }; const deleteEmailVerification = async (redisKey) => { await redis.del(redisKey); }; module.exports = { createEmailVerification, verifyEmailVerificationToken, deleteEmailVerification, hashEmailVerificationToken, };