Files
Zumri-Backend/app/utils/emailVerification.util.js
T
Isuru Bimsara 621d348eb1 add the redis
2026-08-20 15:16:17 +05:30

103 lines
1.6 KiB
JavaScript

// 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,
};