Newer
Older
express-blog / src / utils / emailValidator.js
const validator = require("validator");

const MAX_EMAIL_LENGTH = 320; // RFC 5321 limit
const MESSAGES = {
  REQUIRED: "Email is required",
  INVALID: "Invalid email format",
  TOO_LONG: "Email too long",
};

function validateAndSanitizeEmail(rawEmail) {
  if (!rawEmail || typeof rawEmail !== "string") {
    return { valid: false, message: MESSAGES.REQUIRED };
  }

  const trimmed = rawEmail.trim().toLowerCase();

  if (trimmed.length > MAX_EMAIL_LENGTH) {
    return { valid: false, message: MESSAGES.TOO_LONG };
  }

  const atCount = (trimmed.match(/@/g) || []).length;
  if (atCount !== 1) {
    return { valid: false, message: MESSAGES.INVALID };
  }

  const [localPart] = trimmed.split("@");

  if (
    localPart.includes("..") ||
    localPart.startsWith(".") ||
    localPart.endsWith(".")
  ) {
    return { valid: false, message: MESSAGES.INVALID };
  }

  const email = validator.normalizeEmail(trimmed);

  if (!email) {
    return { valid: false, message: MESSAGES.INVALID };
  }

  if (!validator.isEmail(email)) {
    return { valid: false, message: MESSAGES.INVALID };
  }

  if (email.includes("..") || email.startsWith(".") || email.endsWith(".")) {
    return { valid: false, message: MESSAGES.INVALID };
  }

  return { valid: true, email };
}

module.exports = {
  validateAndSanitizeEmail,
  MESSAGES,
  MAX_EMAIL_LENGTH,
};