Newer
Older
My-Portfolio / backend / routes / contact.js
const express = require('express');
const nodemailer = require("nodemailer");
const router = express.Router();
const pool = require("../db");
require("dotenv").config();


const BASE_URL = process.env.BASE_URL;

router.get("/contact", async (req, res) => {
    try {
        // Get the contacts query
        const contactsQuery = `SELECT * FROM social_media WHERE name IN ('instagram', 'gmail', 'linkedin');`;

        // Perform query
        const contacts = await pool.query(contactsQuery);

        // Ensure contacts is an array before using .map()
        if (Array.isArray(contacts)) {
            // Append URL to logo if needed, only if logo is not null
            const updatedContacts = contacts.map(contact => {
                // Check if logo is not null
                if (contact.logo) {
                    contact.logo = BASE_URL + contact.logo; // prepend the base URL
                }
                return contact;
            });

            // Send the updated contacts data
            res.json(updatedContacts);
        } else {
            throw new Error('Contacts data is not an array');
        }

    } catch (err) {
        console.error("Error fetching contact data:", err.message);
        res.status(500).send("Server error");
    }
});

router.post("/send", async (req, res) => {
    const { name, email, message } = req.body;
  
    if (!name || !email || !message) {
      return res.status(400).json({ error: "All fields are required." });
    }
  
    const transporter = nodemailer.createTransport({
      service: "gmail",
      auth: {
        user: process.env.EMAIL_USER,
        pass: process.env.EMAIL_PASS,
      },
    });
  
    const mailOptions = {
      from: email,
      to: process.env.EMAIL_USER,
      subject: `New Message from ${name}`,
      text: `From: ${name}\nEmail: ${email}\n\nMessage:\n${message}`,
    };
  
    const mailConfirm = {
      from: process.env.EMAIL_USER,
      to: email,
      subject: "Message Received",
      text: "Your message was received, I will contact you as soon as possible!",
    };
  
    try {
      // Respond to the frontend immediately
      res.status(200).json({ success: "Message sent successfully!" });
  
      // Send emails asynchronously
      transporter.sendMail(mailOptions, (error, info) => {
        if (error) {
          console.error("Error sending contact email:", error);
        } else {
          console.log("Contact email sent: %s", info.messageId);
        }
      });
  
      transporter.sendMail(mailConfirm, (error, info) => {
        if (error) {
          console.error("Error sending confirmation email:", error);
        } else {
          console.log("Confirmation email sent: %s", info.messageId);
        }
      });
    } catch (error) {
      console.error("Error:", error);
      res.status(500).json({ error: "Failed to send message." });
    }
  });


module.exports = router;