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 client = require("../graphql-client/graphql-client").client; const serviceAccount = require(process.env.FIREBASE_ADMINSDK_JSON); const adminEmail = require("../utils/adminEmail"); const generateEmailTemplate = require("../email/generateTemplate"); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: process.env.FIREBASE_DATABASE_URL }); exports.admin = admin; exports.createUser = async (req, res) => { logger.log("admin-create-user", "ADMIN", req.user.email, null, { request: req.body, ioadmin: true }); const { email, displayName, password, shopid, authlevel, validemail } = req.body; try { const userRecord = await admin.auth().createUser({ email, displayName, password }); // See the UserRecord reference doc for the contents of userRecord. const result = await client.request( ` mutation INSERT_USER($user: users_insert_input!) { insert_users_one(object: $user) { email } } `, { user: { email: email.toLowerCase(), authid: userRecord.uid, validemail, associations: { data: [{ shopid, authlevel, active: true }] } } } ); res.json({ userRecord, result }); } catch (error) { logger.log("admin-update-user-error", "ERROR", req.user.email, null, { error }); res.status(500).json(error); } }; exports.promanagerWelcomeEmail = (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; } 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."); } // 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 } } } } `, { 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."); } // Check if the email is valid 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.", email }); return res.status(200).json({ message: "User email is not valid, email not sent." }); } // Check if convenient_company is equal to "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.`, convenientCompany }); return res.status(200).json({ message: `convenient_company is not "promanager", email not sent.` }); } // Generate password reset link return admin .auth() .generatePasswordResetLink(dbUser.email) .then((resetLink) => ({ dbUser, resetLink })); }) .then(({ dbUser, resetLink }) => { // Send email logic here (replace this with your email-sending service) return sendProManagerWelcomeEmail({ to: dbUser.email, subject: "Welcome to the ProManager platform.", html: generateEmailTemplate({ header: "", subHeader: "", body: `
Welcome to the ProManager platform. Please click the link below to reset your password:
User Details: