diff --git a/server/firebase/firebase-handler.js b/server/firebase/firebase-handler.js index 2cee624dd..7223d89a8 100644 --- a/server/firebase/firebase-handler.js +++ b/server/firebase/firebase-handler.js @@ -1,11 +1,11 @@ -const admin = require("firebase-admin"); -const logger = require("../utils/logger"); const path = require("path"); -const { sendProManagerWelcomeEmail } = require("../email/sendemail"); - 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 { sendProManagerWelcomeEmail } = require("../email/sendemail"); const client = require("../graphql-client/graphql-client").client; const serviceAccount = require(process.env.FIREBASE_ADMINSDK_JSON); @@ -17,9 +17,7 @@ admin.initializeApp({ databaseURL: process.env.FIREBASE_DATABASE_URL }); -exports.admin = admin; - -exports.createUser = async (req, res) => { +const createUser = async (req, res) => { logger.log("admin-create-user", "ADMIN", req.user.email, null, { request: req.body, ioadmin: true @@ -61,57 +59,45 @@ exports.createUser = async (req, res) => { } }; -exports.promanagerWelcomeEmail = (req, res) => { +const sendPromanagerWelcomeEmail = (req, res) => { const { authid, email } = req.body; - // Gate the operation to only admin users - if (!adminEmail.includes(req.user.email) && !req.user.ioadmin) { - logger.log("admin-update-user-unauthorized", "ERROR", req.user.email, null, { - request: req.body, - user: req.user - }); - res.sendStatus(404); - return; - } - + // Fetch user from Firebase admin .auth() .getUser(authid) .then((userRecord) => { if (!userRecord) { - res.status(404).json({ message: "User not found in Firebase." }); - return Promise.reject("User not found in Firebase."); + return Promise.reject({ 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 { + query GET_USER_BY_EMAIL($email: String!) { + users(where: { email: { _eq: $email } }) { + email + validemail + associations { + id + shopid + bodyshop { id - shopid - bodyshop { - id - convenient_company - } + convenient_company } } } - `, + }`, { email: email.toLowerCase() } ); }) .then((dbUserResult) => { const dbUser = dbUserResult?.users?.[0]; if (!dbUser) { - res.status(404).json({ message: "User not found in database." }); - return Promise.reject("User not found in database."); + return Promise.reject({ status: 404, message: "User not found in database." }); } - // Check if the email is valid before proceeding + // Validate email before proceeding if (!dbUser.validemail) { logger.log("admin-send-welcome-email-skip", "ADMIN", req.user.email, null, { message: "User email is not valid, skipping email.", @@ -120,11 +106,11 @@ exports.promanagerWelcomeEmail = (req, res) => { return res.status(200).json({ message: "User email is not valid, email not sent." }); } - // Check if convenient_company is equal to "promanager" + // Check if the user's company is ProManager const convenientCompany = dbUser.associations?.[0]?.bodyshop?.convenient_company; if (convenientCompany !== "promanager") { logger.log("admin-send-welcome-email-skip", "ADMIN", req.user.email, null, { - message: `convenient_company is not "promanager", skipping email.`, + message: 'convenient_company is not "promanager", skipping email.', convenientCompany }); return res.status(200).json({ message: `convenient_company is not "promanager", email not sent.` }); @@ -134,13 +120,10 @@ exports.promanagerWelcomeEmail = (req, res) => { return admin .auth() .generatePasswordResetLink(dbUser.email) - .then((resetLink) => ({ - dbUser, - resetLink - })); + .then((resetLink) => ({ dbUser, resetLink })); }) .then(({ dbUser, resetLink }) => { - // Send email logic here (replace this with your email-sending service) + // Send welcome email (replace with your actual email-sending service) return sendProManagerWelcomeEmail({ to: dbUser.email, subject: "Welcome to the ProManager platform.", @@ -148,17 +131,18 @@ exports.promanagerWelcomeEmail = (req, res) => { header: "", subHeader: "", body: ` -

Welcome to the ProManager platform. Please click the link below to reset your password:

-

Reset your password

-

User Details:

- - ` +

Welcome to the ProManager platform. Please click the link below to reset your password:

+

Reset your password

+

User Details:

+ + ` }) }); }) .then(() => { + // Log success and return response logger.log("admin-send-welcome-email", "ADMIN", req.user.email, null, { request: req.body, ioadmin: true, @@ -167,30 +151,23 @@ exports.promanagerWelcomeEmail = (req, res) => { res.status(200).json({ message: "Welcome email sent successfully." }); }) .catch((error) => { - logger.log("admin-send-welcome-email-error", "ERROR", req.user.email, null, { - error - }); + logger.log("admin-send-welcome-email-error", "ERROR", req.user.email, null, { error }); + if (!res.headersSent) { - res.status(500).json({ message: "Error sending welcome email.", error }); + res.status(error.status || 500).json({ + message: error.message || "Error sending welcome email.", + error + }); } }); }; -exports.updateUser = (req, res) => { +const updateUser = (req, res) => { logger.log("admin-update-user", "ADMIN", req.user.email, null, { request: req.body, ioadmin: true }); - if (!adminEmail.includes(req.user.email) && !req.user.ioadmin) { - logger.log("admin-update-user-unauthorized", "ERROR", req.user.email, null, { - request: req.body, - user: req.user - }); - res.sendStatus(404); - return; - } - admin .auth() .updateUser( @@ -223,21 +200,12 @@ exports.updateUser = (req, res) => { }); }; -exports.getUser = (req, res) => { +const getUser = (req, res) => { logger.log("admin-get-user", "ADMIN", req.user.email, null, { request: req.body, ioadmin: true }); - if (!adminEmail.includes(req.user.email) && !req.user.ioadmin) { - logger.log("admin-update-user-unauthorized", "ERROR", req.user.email, null, { - request: req.body, - user: req.user - }); - res.sendStatus(404); - return; - } - admin .auth() .getUser(req.body.uid) @@ -252,7 +220,7 @@ exports.getUser = (req, res) => { }); }; -exports.sendNotification = async (req, res) => { +const sendNotification = async (req, res) => { setTimeout(() => { // Send a message to the device corresponding to the provided // registration token. @@ -285,7 +253,7 @@ exports.sendNotification = async (req, res) => { }, 500); }; -exports.subscribe = async (req, res) => { +const subscribe = async (req, res) => { const result = await admin .messaging() .subscribeToTopic(req.body.fcm_tokens, `${req.body.imexshopid}-${req.body.type}`); @@ -293,7 +261,7 @@ exports.subscribe = async (req, res) => { res.json(result); }; -exports.unsubscribe = async (req, res) => { +const unsubscribe = async (req, res) => { try { const result = await admin .messaging() @@ -305,6 +273,17 @@ exports.unsubscribe = async (req, res) => { } }; +module.exports = { + admin, + createUser, + updateUser, + getUser, + sendPromanagerWelcomeEmail, + sendNotification, + subscribe, + unsubscribe +}; + //Admin claims code. // const uid = "JEqqYlsadwPEXIiyRBR55fflfko1"; diff --git a/server/routes/adminRoutes.js b/server/routes/adminRoutes.js index 74775724d..ac0ebb6fb 100644 --- a/server/routes/adminRoutes.js +++ b/server/routes/adminRoutes.js @@ -1,19 +1,20 @@ const express = require("express"); const router = express.Router(); -const fb = require("../firebase/firebase-handler"); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); const { createAssociation, createShop, updateShop, updateCounter } = require("../admin/adminops"); +const { updateUser, getUser, createUser, sendPromanagerWelcomeEmail } = require("../firebase/firebase-handler"); const validateAdminMiddleware = require("../middleware/validateAdminMiddleware"); router.use(validateFirebaseIdTokenMiddleware); +router.use(validateAdminMiddleware); -router.post("/createassociation", validateAdminMiddleware, createAssociation); -router.post("/createshop", validateAdminMiddleware, createShop); -router.post("/updateshop", validateAdminMiddleware, updateShop); -router.post("/updatecounter", validateAdminMiddleware, updateCounter); -router.post("/updateuser", fb.updateUser); -router.post("/getuser", fb.getUser); -router.post("/createuser", fb.createUser); -router.post("/promanagerwelcome", fb.promanagerWelcomeEmail); +router.post("/createassociation", createAssociation); +router.post("/createshop", createShop); +router.post("/updateshop", updateShop); +router.post("/updatecounter", updateCounter); +router.post("/updateuser", updateUser); +router.post("/getuser", getUser); +router.post("/createuser", createUser); +router.post("/promanagerwelcome", sendPromanagerWelcomeEmail); module.exports = router;