feature/IO-3187-Admin-Enhancements - Minor cleanup

This commit is contained in:
Dave Richer
2025-04-15 13:57:50 -04:00
parent b5cb520944
commit 546ebba0bd
3 changed files with 100 additions and 128 deletions

View File

@@ -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 serviceAccount = require(process.env.FIREBASE_ADMINSDK_JSON);
const admin = require("firebase-admin");
const moment = require("moment-timezone"); 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({ admin.initializeApp({
credential: admin.credential.cert(serviceAccount), 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; const { authid, email } = req.body;
// Fetch user from Firebase try {
admin // Fetch user from Firebase
.auth() const userRecord = await admin.auth().getUser(authid);
.getUser(authid) if (!userRecord) {
.then((userRecord) => { throw { status: 404, message: "User not found in Firebase." };
if (!userRecord) { }
return Promise.reject({ status: 404, message: "User not found in Firebase." });
}
// Fetch user data from the database using GraphQL // Fetch user data from the database using GraphQL
return client.request( const dbUserResult = await client.request(GET_USER_BY_EMAIL, { email: email.toLowerCase() });
`
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." });
}
// Generate password reset link const dbUser = dbUserResult?.users?.[0];
return admin if (!dbUser) {
.auth() throw { status: 404, message: "User not found in database." };
.generatePasswordResetLink(dbUser.email) }
.then((resetLink) => ({ dbUser, resetLink }));
}) // Validate email before proceeding
.then(({ dbUser, resetLink }) => { if (!dbUser.validemail) {
// Send welcome email (replace with your actual email-sending service) logger.log("admin-send-welcome-email-skip", "debug", req.user.email, null, {
return sendWelcomeEmail({ message: "User email is not valid, skipping email.",
to: dbUser.email, email
resetLink,
dateLine: moment().tz(dbUser.associations?.[0]?.bodyshop?.timezone).format("MM/DD/YYYY @ hh:mm a"),
features: dbUser.associations?.[0]?.bodyshop?.features
}); });
}) return res.status(200).json({ message: "User email is not valid, email not sent." });
.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 });
if (!res.headersSent) { // Generate password reset link
res.status(error.status || 500).json({ const resetLink = await admin.auth().generatePasswordResetLink(dbUser.email);
message: error.message || "Error sending welcome email.",
error // 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; const { authid, email } = req.body;
logger.log("admin-reset-link", "debug", req.user.email, null, { authid: authid, email: email }); logger.log("admin-reset-link", "debug", req.user.email, null, { authid, email });
admin
.auth() try {
.getUser(authid) // Fetch user from Firebase
.then((userRecord) => { const userRecord = await admin.auth().getUser(authid);
if (!userRecord) { if (!userRecord) {
return Promise.reject({ status: 404, message: "User not found in Firebase." }); throw { status: 404, message: "User not found in Firebase." };
} }
return admin
.auth() // Generate password reset link
.generatePasswordResetLink(email) const resetLink = await admin.auth().generatePasswordResetLink(email);
.then((resetLink) => ({ userRecord, resetLink }));
}) // Log success and return response
.then(({ resetLink }) => { logger.log("admin-reset-link-success", "debug", req.user.email, null, {
logger.log("admin-reset-link-success", "debug", req.user.email, null, { request: req.body,
request: req.body, ioadmin: true
ioadmin: true,
});
res.status(200).json({ message: "Reset link generated successfully.", resetLink });
}); });
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 = { module.exports = {
@@ -318,24 +290,6 @@ module.exports = {
sendNotification, sendNotification,
subscribe, subscribe,
unsubscribe, unsubscribe,
sendwelcome, getWelcomeEmail,
resetlink 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,
// },
// });
// });

View File

@@ -2853,3 +2853,21 @@ query GET_BODYSHOP_BY_MERCHANTID($merchantID: String!) {
email 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
}
}
}
}`;

View File

@@ -2,7 +2,7 @@ const express = require("express");
const router = express.Router(); const router = express.Router();
const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware");
const { createAssociation, createShop, updateShop, updateCounter } = require("../admin/adminops"); 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"); const validateAdminMiddleware = require("../middleware/validateAdminMiddleware");
router.use(validateFirebaseIdTokenMiddleware); router.use(validateFirebaseIdTokenMiddleware);
@@ -15,7 +15,7 @@ router.post("/updatecounter", updateCounter);
router.post("/updateuser", updateUser); router.post("/updateuser", updateUser);
router.post("/getuser", getUser); router.post("/getuser", getUser);
router.post("/createuser", createUser); router.post("/createuser", createUser);
router.post("/sendwelcome", sendwelcome); router.post("/sendwelcome", getWelcomeEmail);
router.post("/resetlink", resetlink); router.post("/resetlink", getResetLink);
module.exports = router; module.exports = router;