diff --git a/server/firebase/firebase-handler.js b/server/firebase/firebase-handler.js index 48c2baf33..f88d352f1 100644 --- a/server/firebase/firebase-handler.js +++ b/server/firebase/firebase-handler.js @@ -1,15 +1,10 @@ -const path = require("path"); -require("dotenv").config({ - path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`) -}); - -const admin = require("firebase-admin"); -const logger = require("../utils/logger"); -const { sendWelcomeEmail } = require("../email/sendemail"); -const client = require("../graphql-client/graphql-client").client; const serviceAccount = require(process.env.FIREBASE_ADMINSDK_JSON); +const admin = require("firebase-admin"); const moment = require("moment-timezone"); -//const generateEmailTemplate = require("../email/generateTemplate"); +const logger = require("../utils/logger"); +const client = require("../graphql-client/graphql-client").client; +const { sendWelcomeEmail } = require("../email/sendemail"); +const { GET_USER_BY_EMAIL } = require("../graphql-client/queries"); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), @@ -202,112 +197,89 @@ const unsubscribe = async (req, res) => { } }; -const sendwelcome = (req, res) => { +const getWelcomeEmail = async (req, res) => { const { authid, email } = req.body; - // Fetch user from Firebase - admin - .auth() - .getUser(authid) - .then((userRecord) => { - if (!userRecord) { - return Promise.reject({ status: 404, message: "User not found in Firebase." }); - } + try { + // Fetch user from Firebase + const userRecord = await admin.auth().getUser(authid); + if (!userRecord) { + throw { status: 404, message: "User not found in Firebase." }; + } - // Fetch user data from the database using GraphQL - return client.request( - ` - query GET_USER_BY_EMAIL($email: String!) { - users(where: { email: { _eq: $email } }) { - email - validemail - associations { - id - shopid - bodyshop { - id - convenient_company - features - timezone - } - } - } - }`, - { email: email.toLowerCase() } - ); - }) - .then((dbUserResult) => { - const dbUser = dbUserResult?.users?.[0]; - if (!dbUser) { - return Promise.reject({ status: 404, message: "User not found in database." }); - } - // Validate email before proceeding - if (!dbUser.validemail) { - logger.log("admin-send-welcome-email-skip", "debug", req.user.email, null, { - message: "User email is not valid, skipping email.", - email - }); - return res.status(200).json({ message: "User email is not valid, email not sent." }); - } + // Fetch user data from the database using GraphQL + const dbUserResult = await client.request(GET_USER_BY_EMAIL, { email: email.toLowerCase() }); - // Generate password reset link - return admin - .auth() - .generatePasswordResetLink(dbUser.email) - .then((resetLink) => ({ dbUser, resetLink })); - }) - .then(({ dbUser, resetLink }) => { - // Send welcome email (replace with your actual email-sending service) - return sendWelcomeEmail({ - to: dbUser.email, - resetLink, - dateLine: moment().tz(dbUser.associations?.[0]?.bodyshop?.timezone).format("MM/DD/YYYY @ hh:mm a"), - features: dbUser.associations?.[0]?.bodyshop?.features + const dbUser = dbUserResult?.users?.[0]; + if (!dbUser) { + throw { status: 404, message: "User not found in database." }; + } + + // Validate email before proceeding + if (!dbUser.validemail) { + logger.log("admin-send-welcome-email-skip", "debug", req.user.email, null, { + message: "User email is not valid, skipping email.", + email }); - }) - .then(() => { - // Log success and return response - logger.log("admin-send-welcome-email", "debug", req.user.email, null, { - request: req.body, - ioadmin: true, - emailSentTo: email - }); - res.status(200).json({ message: "Welcome email sent successfully." }); - }) - .catch((error) => { - logger.log("admin-send-welcome-email-error", "ERROR", req.user.email, null, { error }); + return res.status(200).json({ message: "User email is not valid, email not sent." }); + } - if (!res.headersSent) { - res.status(error.status || 500).json({ - message: error.message || "Error sending welcome email.", - error - }); - } + // Generate password reset link + const resetLink = await admin.auth().generatePasswordResetLink(dbUser.email); + + // Send welcome email + await sendWelcomeEmail({ + to: dbUser.email, + resetLink, + dateLine: moment().tz(dbUser.associations?.[0]?.bodyshop?.timezone).format("MM/DD/YYYY @ hh:mm a"), + features: dbUser.associations?.[0]?.bodyshop?.features }); + + // Log success and return response + logger.log("admin-send-welcome-email", "debug", req.user.email, null, { + request: req.body, + ioadmin: true, + emailSentTo: email + }); + res.status(200).json({ message: "Welcome email sent successfully." }); + } catch (error) { + logger.log("admin-send-welcome-email-error", "ERROR", req.user.email, null, { error }); + + if (!res.headersSent) { + res.status(error.status || 500).json({ + message: error.message || "Error sending welcome email.", + error + }); + } + } }; -const resetlink = (req, res) => { +const getResetLink = async (req, res) => { const { authid, email } = req.body; - logger.log("admin-reset-link", "debug", req.user.email, null, { authid: authid, email: email }); - admin - .auth() - .getUser(authid) - .then((userRecord) => { - if (!userRecord) { - return Promise.reject({ status: 404, message: "User not found in Firebase." }); - } - return admin - .auth() - .generatePasswordResetLink(email) - .then((resetLink) => ({ userRecord, resetLink })); - }) - .then(({ resetLink }) => { - logger.log("admin-reset-link-success", "debug", req.user.email, null, { - request: req.body, - ioadmin: true, - }); - res.status(200).json({ message: "Reset link generated successfully.", resetLink }); + logger.log("admin-reset-link", "debug", req.user.email, null, { authid, email }); + + try { + // Fetch user from Firebase + const userRecord = await admin.auth().getUser(authid); + if (!userRecord) { + throw { status: 404, message: "User not found in Firebase." }; + } + + // Generate password reset link + const resetLink = await admin.auth().generatePasswordResetLink(email); + + // Log success and return response + logger.log("admin-reset-link-success", "debug", req.user.email, null, { + request: req.body, + ioadmin: true }); + res.status(200).json({ message: "Reset link generated successfully.", resetLink }); + } catch (error) { + res.status(error.status || 500).json({ + message: error.message || "Error generating reset link.", + error + }); + } }; module.exports = { @@ -318,24 +290,6 @@ module.exports = { sendNotification, subscribe, unsubscribe, - sendwelcome, - resetlink + getWelcomeEmail, + getResetLink }; - -//Admin claims code. -// const uid = "JEqqYlsadwPEXIiyRBR55fflfko1"; - -// admin -// .auth() -// .getUser(uid) -// .then((user) => { -// console.log(user); -// admin.auth().setCustomUserClaims(uid, { -// ioadmin: true, -// "https://hasura.io/jwt/claims": { -// "x-hasura-default-role": "debug", -// "x-hasura-allowed-roles": ["admin"], -// "x-hasura-user-id": uid, -// }, -// }); -// }); diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js index 16c955467..e1bfbc4cc 100644 --- a/server/graphql-client/queries.js +++ b/server/graphql-client/queries.js @@ -2853,3 +2853,21 @@ query GET_BODYSHOP_BY_MERCHANTID($merchantID: String!) { email } }`; + +exports.GET_USER_BY_EMAIL = ` +query GET_USER_BY_EMAIL($email: String!) { + users(where: {email: {_eq: $email}}) { + email + validemail + associations { + id + shopid + bodyshop { + id + convenient_company + features + timezone + } + } + } +}`; diff --git a/server/routes/adminRoutes.js b/server/routes/adminRoutes.js index a8c0e98b4..909f11344 100644 --- a/server/routes/adminRoutes.js +++ b/server/routes/adminRoutes.js @@ -2,7 +2,7 @@ const express = require("express"); const router = express.Router(); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); const { createAssociation, createShop, updateShop, updateCounter } = require("../admin/adminops"); -const { updateUser, getUser, createUser, sendwelcome, resetlink } = require("../firebase/firebase-handler"); +const { updateUser, getUser, createUser, getWelcomeEmail, getResetLink } = require("../firebase/firebase-handler"); const validateAdminMiddleware = require("../middleware/validateAdminMiddleware"); router.use(validateFirebaseIdTokenMiddleware); @@ -15,7 +15,7 @@ router.post("/updatecounter", updateCounter); router.post("/updateuser", updateUser); router.post("/getuser", getUser); router.post("/createuser", createUser); -router.post("/sendwelcome", sendwelcome); -router.post("/resetlink", resetlink); +router.post("/sendwelcome", getWelcomeEmail); +router.post("/resetlink", getResetLink); module.exports = router;