From c5706043480b8ed76946dfff817a7aa8d78e3b3b Mon Sep 17 00:00:00 2001 From: smfahim25 Date: Thu, 20 Mar 2025 15:46:50 +0600 Subject: [PATCH] complete backend --- src/helper/auth/auth.helper.ts | 361 +++++++++++++++++++-------------- 1 file changed, 204 insertions(+), 157 deletions(-) diff --git a/src/helper/auth/auth.helper.ts b/src/helper/auth/auth.helper.ts index 67e8125..73470a3 100644 --- a/src/helper/auth/auth.helper.ts +++ b/src/helper/auth/auth.helper.ts @@ -3,175 +3,222 @@ import { db } from "../../db"; import { users } from "../../db/schema"; import { ENV } from "../../config/env"; // @ts-ignore -import nodemailer from 'nodemailer'; +import nodemailer from "nodemailer"; -export const checkUserInDb = async (email: string, password: string): Promise<{ - success: boolean; - message: string; - can_register?: boolean; - can_login?: boolean; - email?: string; +export const checkUserInDb = async ( + email: string, + password: string +): Promise<{ + success: boolean; + message: string; + can_register?: boolean; + can_login?: boolean; + email?: string; }> => { - try { - function isAdspillarEmail(email: string) { - const regex = /^[a-zA-Z0-9._%+-]+@adspillar\.com$/; - return regex.test(email); - } - - if (!isAdspillarEmail(email)) { - return { success: false, message: "Invalid email domain", can_register: false, can_login: false }; - } - - else { - const findUser = await db.select({ - email: users.email, - password: users.password, - is_active: users.is_active, - is_verified: users.is_verified, - refresh_token: users.refresh_token, - }).from(users).where(eq(users.email, email)); - - if (!findUser[0]) { - return { success: true, message: "User not found", can_register: true }; - } - - const hash = findUser[0].password; - const isMatch = await Bun.password.verify(password, hash); - - if (isMatch && findUser[0].is_verified && findUser[0].is_active) { - return { - success: true, - message: "User verified successfully", - can_login: true, - email: findUser[0].email // Ensure email is included - }; - } - else if (isMatch && findUser[0].is_verified === false && findUser[0].is_active) { - return { success: false, message: "User not verified", can_login: false }; - } - else if (isMatch && findUser[0].is_active === false && findUser[0].is_verified) { - return { success: false, message: "User not active", can_login: false }; - } - else { - return { success: false, message: "Invalid password", can_login: false }; - } - } - - // const findUser = await db.select({ - // email: users.email, - // password: users.password, - // is_active: users.is_active, - // is_verified: users.is_verified, - // refresh_token: users.refresh_token, - // }).from(users).where(eq(users.email, email)); - - // if (!findUser[0]) { - // return { success: true, message: "Wrong credentials", can_register: true }; - // } - - // const hash = findUser[0].password; - // const isMatch = await Bun.password.verify(password, hash); - - // if (isMatch && findUser[0].is_verified && findUser[0].is_active) { - // return { - // success: true, - // message: "User verified successfully", - // can_login: true, - // email: findUser[0].email, // Ensure email is included - // can_register: false - // }; - // } - // else if (isMatch && findUser[0].is_verified === false && findUser[0].is_active) { - // return { success: false, message: "User not verified", can_login: false, can_register: false }; - // } - // else if (isMatch && findUser[0].is_active === false && findUser[0].is_verified) { - // return { success: false, message: "User not active", can_login: false, can_register: false }; - // } - // else { - // return { success: false, message: "Invalid credentials", can_login: false, can_register: false }; - // } - - } catch (error: any) { - console.log("Error verifying user:", error); - return { success: false, message: "Error verifying user" }; + try { + function isAdspillarEmail(email: string) { + const regex = /^[a-zA-Z0-9._%+-]+@adspillar\.com$/; + return regex.test(email); } + + if (!isAdspillarEmail(email)) { + return { + success: false, + message: "Invalid email domain", + can_register: false, + can_login: false, + }; + } else { + const findUser = await db + .select({ + email: users.email, + password: users.password, + is_active: users.is_active, + is_verified: users.is_verified, + refresh_token: users.refresh_token, + }) + .from(users) + .where(eq(users.email, email)); + + if (!findUser[0]) { + return { success: true, message: "User not found", can_register: true }; + } + + const hash = findUser[0].password; + const isMatch = await Bun.password.verify(password, hash); + + if (isMatch && findUser[0].is_verified && findUser[0].is_active) { + return { + success: true, + message: "User verified successfully", + can_login: true, + email: findUser[0].email, // Ensure email is included + }; + } else if ( + isMatch && + findUser[0].is_verified === false && + findUser[0].is_active + ) { + return { + success: false, + message: "User not verified", + can_login: false, + }; + } else if ( + isMatch && + findUser[0].is_active === false && + findUser[0].is_verified + ) { + return { success: false, message: "User not active", can_login: false }; + } else { + return { + success: false, + message: "Invalid password", + can_login: false, + }; + } + } + + // const findUser = await db.select({ + // email: users.email, + // password: users.password, + // is_active: users.is_active, + // is_verified: users.is_verified, + // refresh_token: users.refresh_token, + // }).from(users).where(eq(users.email, email)); + + // if (!findUser[0]) { + // return { success: true, message: "Wrong credentials", can_register: true }; + // } + + // const hash = findUser[0].password; + // const isMatch = await Bun.password.verify(password, hash); + + // if (isMatch && findUser[0].is_verified && findUser[0].is_active) { + // return { + // success: true, + // message: "User verified successfully", + // can_login: true, + // email: findUser[0].email, // Ensure email is included + // can_register: false + // }; + // } + // else if (isMatch && findUser[0].is_verified === false && findUser[0].is_active) { + // return { success: false, message: "User not verified", can_login: false, can_register: false }; + // } + // else if (isMatch && findUser[0].is_active === false && findUser[0].is_verified) { + // return { success: false, message: "User not active", can_login: false, can_register: false }; + // } + // else { + // return { success: false, message: "Invalid credentials", can_login: false, can_register: false }; + // } + } catch (error: any) { + console.log("Error verifying user:", error); + return { success: false, message: "Error verifying user" }; + } }; +export const storeRefreshToken = async ( + email: string, + refreshToken: string +): Promise<{ success: boolean; message: string }> => { + try { + await db + .update(users) + .set({ refresh_token: refreshToken }) + .where(eq(users.email, email)); + return { success: true, message: "Refresh token stored successfully" }; + } catch (error) { + console.log("Error storing refresh token:", error); + return { success: false, message: "Error storing refresh token" }; + } +}; -export const storeRefreshToken = async (email: string, refreshToken: string): Promise<{ success: boolean; message: string }> => { +export const sendVerificationEmail = async ( + email: string, + token: string, + set: any +) => { + const sendEmail = async (email: string, token: string) => { try { - await db.update(users).set({ refresh_token: refreshToken }).where(eq(users.email, email)); - return { success: true, message: "Refresh token stored successfully" }; - } catch (error) { - console.log("Error storing refresh token:", error); - return { success: false, message: "Error storing refresh token" }; - } -} + const transporter = nodemailer.createTransport({ + host: ENV.MAIL_HOST, + port: ENV.MAIL_PORT, + auth: { + user: ENV.MAIL_USER, + pass: ENV.MAIL_PASS, + }, + }); -export const sendVerificationEmail = async (email: string, token: string, set: any) => { - const sendEmail = async (email: string, token: string) => { - try { - const transporter = nodemailer.createTransport({ - host: ENV.MAIL_HOST, - port: ENV.MAIL_PORT, - auth: { - user: ENV.MAIL_USER, - pass: ENV.MAIL_PASS, - }, - }); - - const url = `${ENV.SERVER_URL}:${ENV.SERVER_PORT}/api/auth/verify?token=${token}`; - const mailOptions = { - from: ENV.MAIL_USER, - to: email, - subject: 'Verify Your Email Address', - html: `

Please verify your email by clicking the following link:

+ const url = `${ENV.SERVER_URL}/auth/verify?token=${token}`; + const mailOptions = { + from: ENV.MAIL_USER, + to: email, + subject: "Verify Your Email Address", + html: `

Please verify your email by clicking the following link:

Verify email

This link will be valid for the next 10 minutes.

`, - }; + }; - await transporter.sendMail(mailOptions); - return { status: 200, message: "Verification email sent, link will valid till next 10 minutes" }; - } catch (error) { - console.error("Error sending email:", error); - return { status: 500, message: "Internal server error, unable to send email" }; - } - }; - const emailResponse = await sendEmail(email, token); - set.status = emailResponse.status; - return emailResponse; -} + await transporter.sendMail(mailOptions); + return { + status: 200, + message: + "Verification email sent, link will valid till next 10 minutes", + }; + } catch (error) { + console.error("Error sending email:", error); + return { + status: 500, + message: "Internal server error, unable to send email", + }; + } + }; + const emailResponse = await sendEmail(email, token); + set.status = emailResponse.status; + return emailResponse; +}; -export const sendResetPasswordEmail = async (email: string, token: string, set: any) => { - const sendEmail = async (email: string, token: string) => { - try { - const transporter = nodemailer.createTransport({ - host: ENV.MAIL_HOST, - port: ENV.MAIL_PORT, - auth: { - user: ENV.MAIL_USER, - pass: ENV.MAIL_PASS, - }, - }); +export const sendResetPasswordEmail = async ( + email: string, + token: string, + set: any +) => { + const sendEmail = async (email: string, token: string) => { + try { + const transporter = nodemailer.createTransport({ + host: ENV.MAIL_HOST, + port: ENV.MAIL_PORT, + auth: { + user: ENV.MAIL_USER, + pass: ENV.MAIL_PASS, + }, + }); - const url = `${ENV.SERVER_URL}:${ENV.SERVER_PORT}/api/auth/reset-password?token=${token}`; - const mailOptions = { - from: ENV.MAIL_USER, - to: email, - subject: 'Reset Your Password', - html: `

Please reset your password by clicking the following link:

+ const url = `${ENV.SERVER_URL}/auth/reset-password?token=${token}`; + const mailOptions = { + from: ENV.MAIL_USER, + to: email, + subject: "Reset Your Password", + html: `

Please reset your password by clicking the following link:

Reset password

This link will be valid for the next 10 minutes.

`, - }; - await transporter.sendMail(mailOptions); - return { status: 200, message: "Reset password email sent, link will valid till next 10 minutes" }; - } catch (error) { - console.error("Error sending email:", error); - return { status: 500, message: "Internal server error, unable to send email" }; - } - }; - const emailResponse = await sendEmail(email, token); - set.status = emailResponse.status; - return emailResponse; -} - + }; + await transporter.sendMail(mailOptions); + return { + status: 200, + message: + "Reset password email sent, link will valid till next 10 minutes", + }; + } catch (error) { + console.error("Error sending email:", error); + return { + status: 500, + message: "Internal server error, unable to send email", + }; + } + }; + const emailResponse = await sendEmail(email, token); + set.status = emailResponse.status; + return emailResponse; +};