feat(users): reemplazar confirmación por envío de credenciales con link de reset
- Eliminar envío automático de confirmación al crear usuario - Nuevo botón en cada fila: enviar credenciales (usuario + link establecer contraseña) - POST /app/users/:id/credenciales → SendUserCredencialesEmail - Email incluye username, link al login y link para establecer contraseña Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.6
parent
bf3cbd3606
commit
107178aa97
@@ -50,6 +50,40 @@ func SendConfirmationEmail(email string, baseURL string, nombreUsuario string) {
|
||||
}
|
||||
}
|
||||
|
||||
// SendUserCredencialesEmail envía al usuario admin su nombre de usuario y un link para establecer contraseña.
|
||||
func SendUserCredencialesEmail(email, nombre, nombreUsuario string) {
|
||||
resetEmail := fmt.Sprintf("%s-reset-%d", email, time.Now().Unix())
|
||||
resetLink := GeneratePasswordResetURL(resetEmail, GetPublicURL())
|
||||
loginURL := absAppURL("/login")
|
||||
|
||||
htmlBody := fmt.Sprintf(`<!DOCTYPE html>
|
||||
<html><body style="font-family:Inter,sans-serif;background:#f1f5f9;padding:32px">
|
||||
<div style="max-width:480px;margin:0 auto;background:#fff;border-radius:16px;padding:32px;border:1px solid #e2e8f0">
|
||||
<div style="text-align:center;margin-bottom:24px">
|
||||
<div style="width:48px;height:48px;border-radius:50%%;background:#8eb02f;display:inline-flex;align-items:center;justify-content:center;color:#fff;font-weight:700;font-size:20px">U</div>
|
||||
<h2 style="margin:12px 0 4px;color:#1e293b">Bienvenido a U-site</h2>
|
||||
<p style="color:#64748b;font-size:14px;margin:0">Panel de administración</p>
|
||||
</div>
|
||||
<p style="color:#334155;font-size:15px">Hola <strong>%s</strong>,</p>
|
||||
<p style="color:#334155;font-size:14px">Tu cuenta ha sido creada. Estos son tus datos de acceso:</p>
|
||||
<div style="background:#f8fafc;border-radius:10px;padding:16px;margin:20px 0;border:1px solid #e2e8f0">
|
||||
<p style="margin:0 0 8px;font-size:13px;color:#64748b"><strong>Usuario:</strong> %s</p>
|
||||
<p style="margin:0;font-size:13px;color:#64748b"><strong>Acceso:</strong> <a href="%s" style="color:#8eb02f">%s</a></p>
|
||||
</div>
|
||||
<p style="color:#334155;font-size:14px">Establece tu contraseña haciendo clic en el siguiente botón:</p>
|
||||
<a href="%s" style="display:block;text-align:center;background:#8eb02f;color:#fff;padding:12px 24px;border-radius:10px;font-weight:600;text-decoration:none;font-size:15px;margin:20px 0">Establecer contraseña</a>
|
||||
<p style="color:#64748b;font-size:13px">El enlace es válido por <strong>1 hora</strong>.</p>
|
||||
<p style="font-size:12px;color:#94a3b8;margin-top:24px;text-align:center">© U-site — Todos los derechos reservados</p>
|
||||
</div>
|
||||
</body></html>`, nombre, nombreUsuario, loginURL, loginURL, resetLink)
|
||||
|
||||
if err := app.Http.Mail.Send(email, "Bienvenido a U-site — Tus credenciales de acceso", htmlBody); err != nil {
|
||||
log.Printf("[MAIL] Error enviando credenciales a %s: %v", email, err)
|
||||
} else {
|
||||
log.Printf("[MAIL] Credenciales enviadas a %s", email)
|
||||
}
|
||||
}
|
||||
|
||||
func GenerateConfirmURL(nombreUsuario string, baseURL string) string {
|
||||
token := utils.Encrypt(nombreUsuario, app.Http.Server.Key)
|
||||
uri := fmt.Sprintf("%s/do/verify-email?t=%s", baseURL, token)
|
||||
|
||||
Reference in New Issue
Block a user