add create user and login user parts

This commit is contained in:
Isuru Bimsara
2026-08-21 02:20:57 +05:30
parent 621d348eb1
commit b2c5e198a1
15 changed files with 842 additions and 336 deletions
+49 -61
View File
@@ -1,103 +1,91 @@
// app/utils/emailVerification.util.js
const crypto = require("crypto");
const { sendMail } = require("../utils/mail.util");
const redis = require("../config/redisClient");
const EMAIL_VERIFICATION_TTL =
Number(
process.env.EMAIL_VERIFICATION_TTL_SECONDS
) || 1800;
Number(process.env.EMAIL_VERIFICATION_TTL_SECONDS) || 1800;
const generateEmailVerificationToken = () => {
return crypto
.randomBytes(32)
.toString("hex");
return crypto.randomBytes(32).toString("hex");
};
const hashEmailVerificationToken = (token) => {
return crypto
.createHash("sha256")
.update(token)
.digest("hex");
return crypto.createHash("sha256").update(token).digest("hex");
};
const createEmailVerification = async (userId) => {
// 1. Generate raw token
const token =
generateEmailVerificationToken();
const token = generateEmailVerificationToken();
// 2. Hash token
const tokenHash =
hashEmailVerificationToken(token);
const tokenHash = hashEmailVerificationToken(token);
// 3. Create Redis key
const redisKey =
`email-verification:${tokenHash}`;
const redisKey = `email-verification:${tokenHash}`;
await redis.set(
redisKey,
userId,
"EX",
EMAIL_VERIFICATION_TTL
);
await redis.set(redisKey, userId, "EX", EMAIL_VERIFICATION_TTL);
return token;
};
/**
* Check a verification token.
*/
const verifyEmailVerificationToken =
async (token) => {
const verifyEmailVerificationToken = async (token) => {
if (!token || typeof token !== "string") {
return null;
}
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}`;
// 1. Hash token received from user
const tokenHash =
hashEmailVerificationToken(token);
// 3. Search Redis
const userId = await redis.get(redisKey);
if (!userId) {
return null;
}
// 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,
};
return {
userId,
redisKey,
};
};
const deleteEmailVerification =
async (redisKey) => {
//send verification email to user
const sendVerificationEmail = async (email, firstName, verificationToken) => {
const confirmationLink = `${process.env.FRONTEND_URL}/verify-email?token=${verificationToken}`;
await redis.del(redisKey);
};
// Send email
await sendMail({
to: email,
subject: "Confirm Your ZUMRI Account",
templateName: "emailVerification",
templateVars: {
customer_name: firstName,
confirmation_link: confirmationLink,
},
text: `Hello ${firstName}, please verify your ZUMRI account using this link: ${confirmationLink}`,
});
};
const deleteEmailVerification = async (redisKey) => {
await redis.del(redisKey);
};
module.exports = {
createEmailVerification,
verifyEmailVerificationToken,
sendVerificationEmail,
deleteEmailVerification,
hashEmailVerificationToken,
};
};