240 lines
5.0 KiB
JavaScript
240 lines
5.0 KiB
JavaScript
const { TrackingToken, Company, ClickLog } = require('../models');
|
|
const tokenService = require('../services/token.service');
|
|
const logger = require('../config/logger');
|
|
|
|
// Get all tokens
|
|
exports.getAllTokens = async (req, res, next) => {
|
|
try {
|
|
const { company_id, limit = 50, offset = 0 } = req.query;
|
|
|
|
const where = {};
|
|
if (company_id) {
|
|
where.company_id = company_id;
|
|
}
|
|
|
|
const tokens = await TrackingToken.findAll({
|
|
where,
|
|
include: [{ model: Company, as: 'company', attributes: ['id', 'name', 'industry'] }],
|
|
order: [['created_at', 'DESC']],
|
|
limit: parseInt(limit),
|
|
offset: parseInt(offset),
|
|
});
|
|
|
|
const total = await TrackingToken.count({ where });
|
|
|
|
res.json({
|
|
success: true,
|
|
data: tokens,
|
|
pagination: {
|
|
total,
|
|
limit: parseInt(limit),
|
|
offset: parseInt(offset),
|
|
hasMore: parseInt(offset) + parseInt(limit) < total,
|
|
},
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
// Get token by ID
|
|
exports.getTokenById = async (req, res, next) => {
|
|
try {
|
|
const { id } = req.params;
|
|
|
|
const token = await TrackingToken.findByPk(id, {
|
|
include: [{ model: Company, as: 'company' }],
|
|
});
|
|
|
|
if (!token) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
error: 'Token not found',
|
|
});
|
|
}
|
|
|
|
res.json({
|
|
success: true,
|
|
data: token,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
// Create token (without sending mail)
|
|
exports.createToken = async (req, res, next) => {
|
|
try {
|
|
const { company_id, target_email, employee_name, template_type } = req.body;
|
|
|
|
const token = await tokenService.createToken({
|
|
company_id,
|
|
target_email,
|
|
employee_name,
|
|
template_type,
|
|
});
|
|
|
|
const trackingUrl = `${process.env.BASE_URL}/t/${token.token}`;
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
message: 'Token created successfully',
|
|
data: {
|
|
...token.toJSON(),
|
|
tracking_url: trackingUrl,
|
|
},
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
// Create token and send mail
|
|
exports.createAndSendToken = async (req, res, next) => {
|
|
try {
|
|
const { company_id, target_email, employee_name, template_type } = req.body;
|
|
|
|
// Create token
|
|
const token = await tokenService.createToken({
|
|
company_id,
|
|
target_email,
|
|
employee_name,
|
|
template_type,
|
|
});
|
|
|
|
// Send mail
|
|
try {
|
|
await tokenService.sendMail(token.id);
|
|
} catch (mailError) {
|
|
logger.error('Failed to send mail:', mailError);
|
|
return res.status(500).json({
|
|
success: false,
|
|
error: 'Token created but failed to send mail',
|
|
details: mailError.message,
|
|
token_id: token.id,
|
|
});
|
|
}
|
|
|
|
const trackingUrl = `${process.env.BASE_URL}/t/${token.token}`;
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
message: 'Token created and mail sent successfully',
|
|
data: {
|
|
...token.toJSON(),
|
|
tracking_url: trackingUrl,
|
|
mail_sent: true,
|
|
},
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
// Send mail for existing token
|
|
exports.sendTokenMail = async (req, res, next) => {
|
|
try {
|
|
const { id } = req.params;
|
|
|
|
await tokenService.sendMail(id);
|
|
|
|
res.json({
|
|
success: true,
|
|
message: 'Mail sent successfully',
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
// Update token
|
|
exports.updateToken = async (req, res, next) => {
|
|
try {
|
|
const { id } = req.params;
|
|
const { notes } = req.body;
|
|
|
|
const token = await TrackingToken.findByPk(id);
|
|
|
|
if (!token) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
error: 'Token not found',
|
|
});
|
|
}
|
|
|
|
await token.update({ notes });
|
|
|
|
logger.info(`Token updated: ${id}`);
|
|
|
|
res.json({
|
|
success: true,
|
|
message: 'Token updated successfully',
|
|
data: token,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
// Delete token
|
|
exports.deleteToken = async (req, res, next) => {
|
|
try {
|
|
const { id } = req.params;
|
|
|
|
const token = await TrackingToken.findByPk(id);
|
|
|
|
if (!token) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
error: 'Token not found',
|
|
});
|
|
}
|
|
|
|
const companyId = token.company_id;
|
|
|
|
await token.destroy();
|
|
|
|
// Update company stats
|
|
await tokenService.updateCompanyStats(companyId);
|
|
|
|
logger.info(`Token deleted: ${id}`);
|
|
|
|
res.json({
|
|
success: true,
|
|
message: 'Token deleted successfully',
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|
|
// Get token click logs
|
|
exports.getTokenClicks = async (req, res, next) => {
|
|
try {
|
|
const { id } = req.params;
|
|
|
|
const token = await TrackingToken.findByPk(id);
|
|
|
|
if (!token) {
|
|
return res.status(404).json({
|
|
success: false,
|
|
error: 'Token not found',
|
|
});
|
|
}
|
|
|
|
const clicks = await ClickLog.findAll({
|
|
where: { token_id: id },
|
|
order: [['clicked_at', 'DESC']],
|
|
});
|
|
|
|
res.json({
|
|
success: true,
|
|
data: clicks,
|
|
count: clicks.length,
|
|
});
|
|
} catch (error) {
|
|
next(error);
|
|
}
|
|
};
|
|
|