Spaces:
Running
Running
| const Newsletter = require('../models/newsletterModel'); | |
| const { | |
| sendNewsletterSubscriptionEmail, | |
| sendNewsletterUnsubscribeEmail, | |
| } = require('../utils/emailService'); | |
| /** | |
| * Subscribe to newsletter | |
| * @route POST /api/v1/newsletter/subscribe | |
| * @access Public | |
| */ | |
| exports.subscribe = async (req, res) => { | |
| try { | |
| const { email } = req.body; | |
| if (!email) { | |
| return res.status(400).json({ | |
| status: 'fail', | |
| message: 'البريد الإلكتروني مطلوب', | |
| }); | |
| } | |
| // Check if email already exists | |
| const existingSubscriber = await Newsletter.findOne({ email }); | |
| if (existingSubscriber) { | |
| if (existingSubscriber.isActive) { | |
| return res.status(400).json({ | |
| status: 'fail', | |
| message: 'هذا البريد الإلكتروني مشترك بالفعل', | |
| }); | |
| } else { | |
| // Reactivate subscription | |
| existingSubscriber.isActive = true; | |
| existingSubscriber.subscribedAt = Date.now(); | |
| await existingSubscriber.save(); | |
| // Send confirmation email | |
| sendNewsletterSubscriptionEmail(email).catch((err) => | |
| console.error( | |
| 'Failed to send newsletter subscription email:', | |
| err.message, | |
| ), | |
| ); | |
| return res.status(200).json({ | |
| status: 'success', | |
| message: 'تم تفعيل اشتراكك بنجاح', | |
| }); | |
| } | |
| } | |
| // Create new subscriber | |
| const subscriber = await Newsletter.create({ email }); | |
| // Send confirmation email (don't wait for it) | |
| sendNewsletterSubscriptionEmail(email).catch((err) => | |
| console.error( | |
| 'Failed to send newsletter subscription email:', | |
| err.message, | |
| ), | |
| ); | |
| res.status(201).json({ | |
| status: 'success', | |
| message: 'تم الاشتراك بنجاح! سنرسل لك أحدث العروض قريباً', | |
| data: { | |
| subscriber: { | |
| email: subscriber.email, | |
| subscribedAt: subscriber.subscribedAt, | |
| }, | |
| }, | |
| }); | |
| } catch (err) { | |
| res.status(500).json({ | |
| status: 'error', | |
| message: 'حدث خطأ أثناء الاشتراك', | |
| error: err.message, | |
| }); | |
| } | |
| }; | |
| /** | |
| * Unsubscribe from newsletter | |
| * @route POST /api/v1/newsletter/unsubscribe | |
| * @access Public | |
| */ | |
| exports.unsubscribe = async (req, res) => { | |
| try { | |
| const { email } = req.body; | |
| if (!email) { | |
| return res.status(400).json({ | |
| status: 'fail', | |
| message: 'البريد الإلكتروني مطلوب', | |
| }); | |
| } | |
| const subscriber = await Newsletter.findOne({ email }); | |
| if (!subscriber) { | |
| return res.status(404).json({ | |
| status: 'fail', | |
| message: 'البريد الإلكتروني غير مشترك', | |
| }); | |
| } | |
| subscriber.isActive = false; | |
| await subscriber.save(); | |
| // Send unsubscribe confirmation email (don't wait for it) | |
| sendNewsletterUnsubscribeEmail(email).catch((err) => | |
| console.error( | |
| 'Failed to send newsletter unsubscribe email:', | |
| err.message, | |
| ), | |
| ); | |
| res.status(200).json({ | |
| status: 'success', | |
| message: 'تم إلغاء الاشتراك بنجاح', | |
| }); | |
| } catch (err) { | |
| res.status(500).json({ | |
| status: 'error', | |
| message: 'حدث خطأ أثناء إلغاء الاشتراك', | |
| error: err.message, | |
| }); | |
| } | |
| }; | |
| /** | |
| * Get all active subscribers (Admin only) | |
| * @route GET /api/v1/newsletter/subscribers | |
| * @access Private/Admin | |
| */ | |
| exports.getSubscribers = async (req, res) => { | |
| try { | |
| const subscribers = await Newsletter.find({ isActive: true }) | |
| .select('email subscribedAt') | |
| .lean(); | |
| res.status(200).json({ | |
| status: 'success', | |
| results: subscribers.length, | |
| data: { | |
| subscribers, | |
| }, | |
| }); | |
| } catch (err) { | |
| res.status(500).json({ | |
| status: 'error', | |
| message: 'حدث خطأ أثناء جلب المشتركين', | |
| error: err.message, | |
| }); | |
| } | |
| }; | |