samoulla-backend / controllers /newsletterController.js
Samoulla Sync Bot
Auto-deploy Samoulla Backend: 19c8fe03f7b7b0f52ba4ad506ac1341bcb562d57
1459d1b
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,
});
}
};