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:
@@ -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";
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user