const express = require('express');
const { body, validationResult } = require('express-validator');
const router = express.Router();
// Middleware to verify service role
const verifyServiceRole = (req, res, next) => {
const authHeader = req.headers.authorization;
const token = authHeader?.split(' ')[1];
if (!token || token !== process.env.SERVICE_ROLE_KEY) {
return res.status(401).json({
code: 401,
msg: 'Invalid service role key',
details: 'Please provide a valid service role key'
});
}
next();
};
router.post('/admin/generate_link', [
verifyServiceRole,
body('type').isIn(['signup', 'magiclink', 'recovery', 'invite', 'email_change']),
body('email').isEmail().normalizeEmail(),
body('redirect_to').optional().isURL(),
body('data').optional().isObject()
], async (req, res) => {
try {
// Check validation errors
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({
code: 400,
msg: 'Invalid request data',
details: errors.array()
});
}
const { type, email, redirect_to, data, password } = req.body;
// Call Strike Auth Service
const response = await fetch(`${process.env.AUTH_SERVICE_URL}/admin/generate_link`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${process.env.SERVICE_ROLE_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
type,
email,
redirect_to,
data,
password
}),
});
const result = await response.json();
if (!response.ok) {
return res.status(response.status).json(result);
}
// Log link generation
console.log(`Link generated: ${type} for ${email}`);
res.json(result);
} catch (error) {
console.error('Link generation error:', error);
res.status(500).json({
code: 500,
msg: 'Internal server error',
details: 'Please try again later'
});
}
});
module.exports = router;