const express = require("express"); const nodemailer = require("nodemailer"); const dotenv = require("dotenv"); const cors = require("cors"); dotenv.config(); const app = express(); app.use(cors()); app.use(express.json()); app.use(express.static(__dirname)); const PORT = process.env.PORT || 3000; // ذخیره موقت کدها در حافظه const codes = new Map(); const transporter = nodemailer.createTransport({ service: "gmail", auth: { user: process.env.EMAIL_USER, pass: process.env.EMAIL_PASS } }); // تست اتصال SMTP transporter.verify() .then(() => { console.log("✅ SMTP Connected"); }) .catch((err) => { console.log("❌ SMTP Error:"); console.log(err.message); }); function generateCode() { return Math.floor(100000 + Math.random() * 900000).toString(); } // درخواست کد app.post("/api/auth/request-code", async (req, res) => { try { const { name, email } = req.body; if (!name || !email) { return res.status(400).json({ message: "❌ نام و ایمیل الزامی است." }); } const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; if (!emailRegex.test(email)) { return res.status(400).json({ message: "❌ ایمیل معتبر نیست." }); } const code = generateCode(); codes.set(email.toLowerCase(), { name, code, expires: Date.now() + 5 * 60 * 1000, attempts: 0 }); await transporter.sendMail({ from: `"SMP CRAFT" <${process.env.EMAIL_USER}>`, to: email, subject: "کد تأیید حساب SMP CRAFT", text: `سلام ${name} کد تأیید حساب شما: ${code} این کد تا ۵ دقیقه اعتبار دارد. اگر این درخواست توسط شما انجام نشده، این ایمیل را نادیده بگیرید. SMP CRAFT` }); console.log(`📧 Verification code sent to ${email}`); res.json({ success: true, message: "✅ کد تأیید به ایمیل شما ارسال شد." }); } catch (error) { console.log("❌ Email Error:", error.message); res.status(500).json({ success: false, message: "❌ ارسال ایمیل انجام نشد." }); } }); // تأیید کد app.post("/api/auth/verify-code", (req, res) => { try { const { email, code } = req.body; if (!email || !code) { return res.status(400).json({ message: "❌ ایمیل و کد الزامی است." }); } const key = email.toLowerCase(); const saved = codes.get(key); if (!saved) { return res.status(400).json({ message: "❌ کدی برای این ایمیل درخواست نشده است." }); } if (Date.now() > saved.expires) { codes.delete(key); return res.status(400).json({ message: "⏰ کد منقضی شده است." }); } if (saved.attempts >= 5) { codes.delete(key); return res.status(429).json({ message: "🚫 تعداد تلاش‌ها بیش از حد مجاز است." }); } saved.attempts++; if (saved.code !== String(code).trim()) { return res.status(400).json({ message: "❌ کد وارد شده اشتباه است." }); } codes.delete(key); console.log(`✅ Email verified: ${email}`); res.json({ success: true, verified: true, message: "✅ ایمیل با موفقیت تأیید شد." }); } catch (error) { console.log("❌ Verify Error:", error.message); res.status(500).json({ message: "❌ خطایی در تأیید کد رخ داد." }); } }); app.get("/api/status", (req, res) => { res.json({ online: true, server: "SMP CRAFT", time: new Date().toISOString() }); }); app.listen(PORT, () => { console.log("================================="); console.log("⚡ SMP CRAFT BACKEND"); console.log("================================="); console.log(`🟢 Server running on port ${PORT}`); });