Newer
Older
express-blog / src / routes / newsletter.js
@Jason Jason on 18 Jul 2 KB modified: content
const express = require("express");
const router = express.Router();
const sendNewsletterSubscriptionMail = require("../utils/sendNewsletterSubscriptionMail");
const { saveEmail } = require("../services/newsletterService");
const formLimiter = require("../utils/formLimiter");
const { unsubscribeEmail } = require("../services/newsletterService");
const { ERRORS } = require("../constants/newsletterConstants");

const {
  validateAndSanitizeEmail,
  MESSAGES,
} = require("../utils/emailValidator");

const { qualifyLink } = require("../utils/qualifyLinks");

router.get("/newsletter", async (req, res) => {
  const context = {
    csrfToken: res.locals.csrfToken,
    title: "Newsletter",
    formAction: qualifyLink("/newsletter"),
    formMethod: "POST",
  };
  res.renderWithBaseContext("pages/newsletter.handlebars", context);
});

router.get("/newsletter/success", async (req, res) => {
  const context = {
    title: "Unsubscribed",
    message:
      "You’ve successfully subscribed to my newsletter. Stay tuned for updates.",
  };
  res.renderWithBaseContext("pages/newsletter-success.handlebars", context);
});

router.post("/newsletter", formLimiter, async (req, res, next) => {
  const { email: rawEmail } = req.body;
  const result = validateAndSanitizeEmail(rawEmail);

  if (!result.valid) {
    return next(new HttpError(result.message, 400));
  }

  const sanitizedEmail = result.email;

  try {
    await saveEmail(sanitizedEmail);
    await sendNewsletterSubscriptionMail({ email: sanitizedEmail });
    res.customRedirect("/newsletter/success");
  } catch (err) {
    req.log.error("Newsletter subscription error:", err);
    if (err.code === "DUPLICATE_EMAIL") {
      return res.customRedirect("/newsletter/success");
    }
    next(err);
  }
});

router.get("/unsubscribe", async (req, res) => {
  const { valid, email, message } = validateAndSanitizeEmail(req.query.email);

  if (!valid) {
    return next(new HttpError(message || ERRORS.INVALID_EMAIL, 400));
  }

  try {
    await unsubscribeEmail(email);
    const context = {
      title: "Thank You",
      message:
        "You’ve been successfully removed from the newsletter mailing list.",
    };
    res.renderGenericMessage(context);
  } catch (err) {
    next(new HttpError({ error: "Failed to unsubscribe" }, 500));
  }
});

module.exports = router;