Initial commit
This commit is contained in:
24
server/utils/apiResponse.js
Normal file
24
server/utils/apiResponse.js
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* Standardized API Response helper functions
|
||||
*/
|
||||
const successResponse = (res, message = 'Success', data = {}, statusCode = 200) => {
|
||||
return res.status(statusCode).json({
|
||||
success: true,
|
||||
message,
|
||||
data
|
||||
});
|
||||
};
|
||||
|
||||
const errorResponse = (res, message = 'Internal Server Error', errors = [], statusCode = 500) => {
|
||||
return res.status(statusCode).json({
|
||||
success: false,
|
||||
message,
|
||||
errors: Array.isArray(errors) ? errors : [errors]
|
||||
});
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
successResponse,
|
||||
errorResponse
|
||||
};
|
||||
|
||||
52
server/utils/emailSender.js
Normal file
52
server/utils/emailSender.js
Normal file
@@ -0,0 +1,52 @@
|
||||
const nodemailer = require('nodemailer');
|
||||
const EmailTemplate = require('../models/EmailTemplate');
|
||||
|
||||
const sendEmail = async ({ templateName, to, variables = {} }) => {
|
||||
try {
|
||||
const template = await EmailTemplate.findOne({ name: templateName });
|
||||
let subject = variables.subject || 'Antigravity Guitars Update';
|
||||
let htmlContent = `<p>Thank you for contacting Antigravity Guitars!</p>`;
|
||||
|
||||
if (template) {
|
||||
subject = template.subject;
|
||||
htmlContent = template.bodyHtml;
|
||||
|
||||
// Replace placeholders e.g. {{customerName}} -> variables.customerName
|
||||
Object.keys(variables).forEach((key) => {
|
||||
const regex = new RegExp(`{{${key}}}`, 'g');
|
||||
subject = subject.replace(regex, variables[key] || '');
|
||||
htmlContent = htmlContent.replace(regex, variables[key] || '');
|
||||
});
|
||||
}
|
||||
|
||||
const transporter = nodemailer.createTransport({
|
||||
host: process.env.EMAIL_HOST || 'smtp.mailtrap.io',
|
||||
port: process.env.EMAIL_PORT || 2525,
|
||||
auth: {
|
||||
user: process.env.EMAIL_USER || '',
|
||||
pass: process.env.EMAIL_PASS || ''
|
||||
}
|
||||
});
|
||||
|
||||
const mailOptions = {
|
||||
from: process.env.EMAIL_FROM || '"Antigravity Guitars" <noreply@guitars.com>',
|
||||
to,
|
||||
subject,
|
||||
html: htmlContent
|
||||
};
|
||||
|
||||
if (process.env.NODE_ENV !== 'test' && process.env.EMAIL_USER) {
|
||||
await transporter.sendMail(mailOptions);
|
||||
console.log(`[Email Sent]: Template "${templateName}" to ${to}`);
|
||||
} else {
|
||||
console.log(`[Email Logged (Mock)] To: ${to} | Subject: ${subject}`);
|
||||
}
|
||||
return true;
|
||||
} catch (error) {
|
||||
console.error(`[Email Sender Exception]: ${error.message}`);
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
module.exports = { sendEmail };
|
||||
|
||||
12
server/utils/jwt.js
Normal file
12
server/utils/jwt.js
Normal file
@@ -0,0 +1,12 @@
|
||||
const jwt = require('jsonwebtoken');
|
||||
|
||||
const generateToken = (userId, role) => {
|
||||
return jwt.sign(
|
||||
{ id: userId, role },
|
||||
process.env.JWT_SECRET || 'guitar_ecommerce_super_secret_jwt_key_2026',
|
||||
{ expiresIn: process.env.JWT_EXPIRE || '30d' }
|
||||
);
|
||||
};
|
||||
|
||||
module.exports = { generateToken };
|
||||
|
||||
Reference in New Issue
Block a user