IO-2782-Send-Promanager-Welcome-Email - Cleanup of adminRoutes / firebase-handler.js

Signed-off-by: Dave Richer <dave@imexsystems.ca>
This commit is contained in:
Dave Richer
2024-09-19 11:29:13 -04:00
parent 29f0031c1e
commit cdb2d4d2d6
2 changed files with 64 additions and 84 deletions

View File

@@ -1,11 +1,11 @@
const admin = require("firebase-admin");
const logger = require("../utils/logger");
const path = require("path"); const path = require("path");
const { sendProManagerWelcomeEmail } = require("../email/sendemail");
require("dotenv").config({ require("dotenv").config({
path: path.resolve(process.cwd(), `.env.${process.env.NODE_ENV || "development"}`) 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 client = require("../graphql-client/graphql-client").client;
const serviceAccount = require(process.env.FIREBASE_ADMINSDK_JSON); const serviceAccount = require(process.env.FIREBASE_ADMINSDK_JSON);
@@ -17,9 +17,7 @@ admin.initializeApp({
databaseURL: process.env.FIREBASE_DATABASE_URL databaseURL: process.env.FIREBASE_DATABASE_URL
}); });
exports.admin = admin; const createUser = async (req, res) => {
exports.createUser = async (req, res) => {
logger.log("admin-create-user", "ADMIN", req.user.email, null, { logger.log("admin-create-user", "ADMIN", req.user.email, null, {
request: req.body, request: req.body,
ioadmin: true ioadmin: true
@@ -61,57 +59,45 @@ exports.createUser = async (req, res) => {
} }
}; };
exports.promanagerWelcomeEmail = (req, res) => { const sendPromanagerWelcomeEmail = (req, res) => {
const { authid, email } = req.body; const { authid, email } = req.body;
// Gate the operation to only admin users // Fetch user from Firebase
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 admin
.auth() .auth()
.getUser(authid) .getUser(authid)
.then((userRecord) => { .then((userRecord) => {
if (!userRecord) { if (!userRecord) {
res.status(404).json({ message: "User not found in Firebase." }); return Promise.reject({ status: 404, message: "User not found in Firebase." });
return Promise.reject("User not found in Firebase.");
} }
// Fetch user data from the database using GraphQL // Fetch user data from the database using GraphQL
return client.request( return client.request(
` `
query GET_USER_BY_EMAIL($email: String!) { query GET_USER_BY_EMAIL($email: String!) {
users(where: { email: { _eq: $email } }) { users(where: { email: { _eq: $email } }) {
email email
validemail validemail
associations { associations {
id
shopid
bodyshop {
id id
shopid convenient_company
bodyshop {
id
convenient_company
}
} }
} }
} }
`, }`,
{ email: email.toLowerCase() } { email: email.toLowerCase() }
); );
}) })
.then((dbUserResult) => { .then((dbUserResult) => {
const dbUser = dbUserResult?.users?.[0]; const dbUser = dbUserResult?.users?.[0];
if (!dbUser) { if (!dbUser) {
res.status(404).json({ message: "User not found in database." }); return Promise.reject({ status: 404, message: "User not found in database." });
return Promise.reject("User not found in database.");
} }
// Check if the email is valid before proceeding // Validate email before proceeding
if (!dbUser.validemail) { if (!dbUser.validemail) {
logger.log("admin-send-welcome-email-skip", "ADMIN", req.user.email, null, { logger.log("admin-send-welcome-email-skip", "ADMIN", req.user.email, null, {
message: "User email is not valid, skipping email.", 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." }); 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; const convenientCompany = dbUser.associations?.[0]?.bodyshop?.convenient_company;
if (convenientCompany !== "promanager") { if (convenientCompany !== "promanager") {
logger.log("admin-send-welcome-email-skip", "ADMIN", req.user.email, null, { 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 convenientCompany
}); });
return res.status(200).json({ message: `convenient_company is not "promanager", email not sent.` }); return res.status(200).json({ message: `convenient_company is not "promanager", email not sent.` });
@@ -134,13 +120,10 @@ exports.promanagerWelcomeEmail = (req, res) => {
return admin return admin
.auth() .auth()
.generatePasswordResetLink(dbUser.email) .generatePasswordResetLink(dbUser.email)
.then((resetLink) => ({ .then((resetLink) => ({ dbUser, resetLink }));
dbUser,
resetLink
}));
}) })
.then(({ 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({ return sendProManagerWelcomeEmail({
to: dbUser.email, to: dbUser.email,
subject: "Welcome to the ProManager platform.", subject: "Welcome to the ProManager platform.",
@@ -148,17 +131,18 @@ exports.promanagerWelcomeEmail = (req, res) => {
header: "", header: "",
subHeader: "", subHeader: "",
body: ` body: `
<p>Welcome to the ProManager platform. Please click the link below to reset your password:</p> <p>Welcome to the ProManager platform. Please click the link below to reset your password:</p>
<p><a href="${resetLink}">Reset your password</a></p> <p><a href="${resetLink}">Reset your password</a></p>
<p>User Details:</p> <p>User Details:</p>
<ul> <ul>
<li>Email: ${dbUser.email}</li> <li>Email: ${dbUser.email}</li>
</ul> </ul>
` `
}) })
}); });
}) })
.then(() => { .then(() => {
// Log success and return response
logger.log("admin-send-welcome-email", "ADMIN", req.user.email, null, { logger.log("admin-send-welcome-email", "ADMIN", req.user.email, null, {
request: req.body, request: req.body,
ioadmin: true, ioadmin: true,
@@ -167,30 +151,23 @@ exports.promanagerWelcomeEmail = (req, res) => {
res.status(200).json({ message: "Welcome email sent successfully." }); res.status(200).json({ message: "Welcome email sent successfully." });
}) })
.catch((error) => { .catch((error) => {
logger.log("admin-send-welcome-email-error", "ERROR", req.user.email, null, { logger.log("admin-send-welcome-email-error", "ERROR", req.user.email, null, { error });
error
});
if (!res.headersSent) { 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, { logger.log("admin-update-user", "ADMIN", req.user.email, null, {
request: req.body, request: req.body,
ioadmin: true 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 admin
.auth() .auth()
.updateUser( .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, { logger.log("admin-get-user", "ADMIN", req.user.email, null, {
request: req.body, request: req.body,
ioadmin: true 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 admin
.auth() .auth()
.getUser(req.body.uid) .getUser(req.body.uid)
@@ -252,7 +220,7 @@ exports.getUser = (req, res) => {
}); });
}; };
exports.sendNotification = async (req, res) => { const sendNotification = async (req, res) => {
setTimeout(() => { setTimeout(() => {
// Send a message to the device corresponding to the provided // Send a message to the device corresponding to the provided
// registration token. // registration token.
@@ -285,7 +253,7 @@ exports.sendNotification = async (req, res) => {
}, 500); }, 500);
}; };
exports.subscribe = async (req, res) => { const subscribe = async (req, res) => {
const result = await admin const result = await admin
.messaging() .messaging()
.subscribeToTopic(req.body.fcm_tokens, `${req.body.imexshopid}-${req.body.type}`); .subscribeToTopic(req.body.fcm_tokens, `${req.body.imexshopid}-${req.body.type}`);
@@ -293,7 +261,7 @@ exports.subscribe = async (req, res) => {
res.json(result); res.json(result);
}; };
exports.unsubscribe = async (req, res) => { const unsubscribe = async (req, res) => {
try { try {
const result = await admin const result = await admin
.messaging() .messaging()
@@ -305,6 +273,17 @@ exports.unsubscribe = async (req, res) => {
} }
}; };
module.exports = {
admin,
createUser,
updateUser,
getUser,
sendPromanagerWelcomeEmail,
sendNotification,
subscribe,
unsubscribe
};
//Admin claims code. //Admin claims code.
// const uid = "JEqqYlsadwPEXIiyRBR55fflfko1"; // const uid = "JEqqYlsadwPEXIiyRBR55fflfko1";

View File

@@ -1,19 +1,20 @@
const express = require("express"); const express = require("express");
const router = express.Router(); const router = express.Router();
const fb = require("../firebase/firebase-handler");
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, sendPromanagerWelcomeEmail } = require("../firebase/firebase-handler");
const validateAdminMiddleware = require("../middleware/validateAdminMiddleware"); const validateAdminMiddleware = require("../middleware/validateAdminMiddleware");
router.use(validateFirebaseIdTokenMiddleware); router.use(validateFirebaseIdTokenMiddleware);
router.use(validateAdminMiddleware);
router.post("/createassociation", validateAdminMiddleware, createAssociation); router.post("/createassociation", createAssociation);
router.post("/createshop", validateAdminMiddleware, createShop); router.post("/createshop", createShop);
router.post("/updateshop", validateAdminMiddleware, updateShop); router.post("/updateshop", updateShop);
router.post("/updatecounter", validateAdminMiddleware, updateCounter); router.post("/updatecounter", updateCounter);
router.post("/updateuser", fb.updateUser); router.post("/updateuser", updateUser);
router.post("/getuser", fb.getUser); router.post("/getuser", getUser);
router.post("/createuser", fb.createUser); router.post("/createuser", createUser);
router.post("/promanagerwelcome", fb.promanagerWelcomeEmail); router.post("/promanagerwelcome", sendPromanagerWelcomeEmail);
module.exports = router; module.exports = router;