Sindbad~EG File Manager

Current Path : /home/infinitibizsol/.trash/controllers.2/
Upload File :
Current File : /home/infinitibizsol/.trash/controllers.2/authController.js

const brcrypt = require("bcrypt");
const db = require("../models");
const jwt = require("jsonwebtoken");
const crypto = require("crypto");
const nodemailer = require("nodemailer");
const { google } = require("googleapis");
const { OAuth2Client } = require("google-auth-library");

const { Op } = require("sequelize");

const loginController = async (req, res) => {
  try {
    const { email, password } = req.body;
    let [result] = await db.tblUser.findAll({
      where: {
        email: email,
      },
    });
    // return res.json({ data: result });
    if (!result) {
      return res
        .status(404)
        .json({ status: 404, message: "Invalid Credentials." });
    }

    const isMatched = await brcrypt.compare(password, result.password);
    if (!isMatched) {
      return res
        .status(403)
        .json({ status: 403, message: "Invalid Credentials." });
    }

    let token = await jwt.sign(
      { email: result.email, auctioneerId: result.auctioneer_id },
      process.env.JWT_KEY
    );
    return res.json({
      status: 200,
      message: "Success",
      data: [{ token, ...result.dataValues }],
    });
  } catch (error) {
    return res.status(500).json({
      status: 500,
      message: "Internal Server Error",
      error: error.message,
    });
  }
};
const signupController = async (req, res) => {
  try {
    const { email, password } = req.body;
    const salt = await brcrypt.genSalt(10);
    const hashedPassword = await brcrypt.hash(password, salt);
    req.body.password = hashedPassword;
    let result;
    result = await db.tblUser.findAll({ where: { email: email } });

    if (result.length > 0) {
      return res.status(402).json({
        status: 402,
        message: "Email already existed please choose another account",
      });
    }
    result = await db.tblUser.create(req.body);

    let token = await jwt.sign(
      { email: result.email, userId: result.user_id },
      process.env.JWT_KEY
    );
    return res.json({
      status: 200,
      message: "Success",
      data: [{ token, ...result.dataValues }],
    });
  } catch (error) {
    return res.status(500).json({
      status: 500,
      message: "Internal Server Error",
      error: error.message,
    });
  }
};

const updateUserPassword = async (req, res) => {
  try {
    let { userId, newPassword } = req.body;

    if (newPassword) {
      const salt = await brcrypt.genSalt(10);
      const encrypPassword = await brcrypt.hash(newPassword, salt);
      req.body.password = encrypPassword;
      let result = await db.tblUser.update(req.body, {
        where: { user_id: userId },
      });
      return res.status(200).json({ status: 200, message: "Success" });
    } else {
      return res.json({ status: 400, message: "newpassword undefined" });
    }
  } catch (error) {
    return res.status(500).json({
      status: 500,
      message: "Internal Server Error",
      error: error.message,
    });
  }
};

function getTranperter() {
  const transporter = nodemailer.createTransport({
    host: process.env.MAIL_SERVER_HOST, // Replace with your mail server host from cPanel
    port: 465, // Secure SMTP port number provided by your hosting (commonly 465 or 587)
    secure: true, // True for 465, false for other ports
    auth: {
      user: process.env.EMAIL_USERNAME, // The email account you created in cPanel
      pass: process.env.EMAIL_PASSWORD, // Email account password
    },
  });
  return transporter;
}
// Helper functions for password hashing
const generateHash = (password) => {
  return brcrypt.hashSync(password, brcrypt.genSaltSync(8), null);
};

const validPassword = (password, storedHash) => {
  return brcrypt.compareSync(password, storedHash);
};

const forgotPassword = async (req, res) => {
  const { email } = req.body;
  let transporter;
  if (!transporter) {
    try {
      transporter = getTranperter();
    } catch (error) {
      return res.status(500).json({
        status: 500,
        message: "Failed to send email due to internal error",
      });
    }
  }
  // Generate token
  const token = crypto.randomBytes(20).toString("hex");

  try {
    const user = await db.tblUser.findOne({ where: { email: email } });

    if (!user) {
      return res.status(400).json({
        status: 400,
        error: "No account with that email address exists.",
      });
    }

    user.resetPasswordToken = token;
    user.resetPasswordExpires = Date.now() + 3600000; // 1 hour

    await user.save();
 const mailOptions = {
      to: user.email,
      from: process.env.EMAIL_USERNAME,
      subject: "Password Reset Confirmation",
      text: `Hello,
    
    Please click on the following link, or paste it into your browser to complete the password reset process:
    ${process.env.CLIENT_URL}/reset/${token}
    
    If you did not request a password reset, please ignore this email.
    
    Best regards,
    infinitibizsol`,
      html: `
        <html>
        <body>
          
          <p>Hello,</p>
          
          <p>Please click on the following link, or paste it into your browser to complete the password reset process:</p>
          <a href="${process.env.CLIENT_URL}/reset/${token}" target="_blank">Reset Password</a>
          
          <p>If you did not request a password reset, please ignore this email.</p>
          
          <p>Best regards,<br>
          infinitibizsol</p>
    
        </body>
        </html>`,
    };
    
    transporter.sendMail(mailOptions, (error, info) => {
      if (error) {
        return res.status(500).send(error);
      }
      console.log("Message sent successfully!");
      console.log('Server responded with "%s"', info.response);
      transporter.close();
    });

    res.json({
      status: 200,
      message: "Success",
      data: {
        notification: `An e-mail has been sent to ${user.email} with further instructions.`,
        token: token,
      },
    });
  } catch (error) {
    return res.status(500).send(error.message);
  }
};

const resetPasswordViaToken = async (req, res) => {
  const { token } = req.params;
  const { newPassword } = req.body;

  try {
    const user = await db.tblUser.findOne({
      where: {
        resetPasswordToken: token,
        resetPasswordExpires: { [Op.gt]: Date.now() },
      },
    });

    if (!user) {
      return res.status(400).json({
        status: 400,
        error: "Password reset token is invalid or has expired.",
      });
    }

    user.password = generateHash(newPassword);
    user.resetPasswordToken = null;
    user.resetPasswordExpires = null;

    await user.save();
    res.status(200).json({
      status: 200,
      message: "Success! Your password has been changed.",
    });
  } catch (error) {
    res.status(500).send(error.message);
  }
};

module.exports = {
  loginController,
  signupController,
  updateUserPassword,
  forgotPassword,
  resetPasswordViaToken,
};

Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists