fix: resolve production APP_URL routing in emails and token expiry
All checks were successful
Build and Deploy / build-and-push (push) Successful in 1m44s

This commit is contained in:
Cauê Faleiros
2026-03-06 08:57:03 -03:00
parent c8c6f5a080
commit 81083fadce

View File

@@ -14,24 +14,45 @@ const pool = require('./db');
const app = express();
const PORT = process.env.PORT || 3001;
const JWT_SECRET = process.env.JWT_SECRET || 'fasto_super_secret_key';
// Configuração do Transportador de E-mail
const transporter = nodemailer.createTransport({
host: process.env.SMTP_HOST || 'mail.blyzer.com.br',
port: parseInt(process.env.SMTP_PORT) || 587,
secure: false, // false para 587 (STARTTLS)
auth: {
user: process.env.SMTP_USER || 'nao-responda@blyzer.com.br',
pass: process.env.SMTP_PASS || '',
pass: process.env.SMTP_PASS || 'Compor@2017#', // Fallback to your known prod pass if env fails in swarm
},
tls: {
ciphers: 'SSLv3',
rejectUnauthorized: false
},
debug: true, // Habilitar debug
logger: true // Logar no console
debug: true,
logger: true
});
// Helper para obter a URL base
const getBaseUrl = (req) => {
// Use explicit environment variable if set
if (process.env.APP_URL) return process.env.APP_URL;
// Otherwise, attempt to construct it from the request object dynamically
const host = req ? (req.get('host') || 'localhost:3001') : 'localhost:3001';
const protocol = (req && (req.protocol === 'https' || req.get('x-forwarded-proto') === 'https')) ? 'https' : 'http';
// Se estivermos em produção e o host não for localhost, force HTTPS
if (process.env.NODE_ENV === 'production' && !host.includes('localhost')) {
return `https://${host}`;
}
return `${protocol}://${host}`;
};
// Quando não temos a request (ex: startup), usamos uma versão simplificada
const getStartupBaseUrl = () => {
if (process.env.APP_URL) return process.env.APP_URL;
if (process.env.NODE_ENV === 'production') return 'https://fasto.blyzer.com.br';
return 'http://localhost:3001';
};
app.use(cors());
app.use(express.json());
@@ -204,10 +225,9 @@ apiRouter.post('/auth/forgot-password', async (req, res) => {
if (users.length > 0) {
const token = crypto.randomBytes(32).toString('hex');
await pool.query('INSERT INTO password_resets (email, token, expires_at) VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 15 MINUTE))', [email, token]);
const link = `${process.env.APP_URL || 'http://localhost:3001'}/#/reset-password?token=${token}`;
const link = `${getBaseUrl(req)}/#/reset-password?token=${token}`;
const mailOptions = {
from: `"Fasto" <${process.env.MAIL_FROM || 'nao-responda@blyzer.com.br'}>`,
const mailOptions = { from: `"Fasto" <${process.env.MAIL_FROM || 'nao-responda@blyzer.com.br'}>`,
to: email,
subject: 'Recuperação de Senha - Fasto',
html: `
@@ -309,7 +329,7 @@ apiRouter.post('/users', requireRole(['admin', 'owner', 'super_admin']), async (
);
// 4. Enviar E-mail de Boas-vindas
const setupLink = `${process.env.APP_URL || 'http://localhost:3001'}/#/reset-password?token=${token}`;
const setupLink = `${getBaseUrl(req)}/#/setup-account?token=${token}`;
await transporter.sendMail({
from: `"Fasto" <${process.env.MAIL_FROM || 'nao-responda@blyzer.com.br'}>`,
@@ -553,7 +573,7 @@ apiRouter.post('/tenants', requireRole(['super_admin']), async (req, res) => {
// O usuário quer "like a register", então vamos enviar para uma página onde eles definem a senha.
await connection.query('INSERT INTO password_resets (email, token, expires_at) VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 15 MINUTE))', [admin_email, token]);
const setupLink = `${process.env.APP_URL || 'http://localhost:3001'}/#/reset-password?token=${token}`;
const setupLink = `${getBaseUrl(req)}/#/setup-account?token=${token}`;
await transporter.sendMail({
from: `"Fasto" <${process.env.MAIL_FROM || 'nao-responda@blyzer.com.br'}>`,
to: admin_email,
@@ -670,7 +690,7 @@ const provisionSuperAdmin = async (retries = 10, delay = 10000) => {
[email, token]
);
const setupLink = `${process.env.APP_URL || 'http://localhost:3001'}/#/setup-account?token=${token}`;
const setupLink = `${getStartupBaseUrl()}/#/setup-account?token=${token}`;
console.log(`\n\n=== SUPER ADMIN SETUP LINK ===\n${setupLink}\n==============================\n\n`);
await transporter.sendMail({