From 7f309186d6157143b4e4166487d4ad00feb6da26 Mon Sep 17 00:00:00 2001 From: Lizandro Guarnizo <77708265+lizandrogd@users.noreply.github.com> Date: Mon, 18 May 2026 23:50:50 -0500 Subject: [PATCH] up --- config.sample.yml | 2 ++ config.yml | 1 + config/server.go | 1 + pkg/services/app_url.go | 34 +++++++++++++++++++++---- pkg/services/app_url_test.go | 34 ++++++++++++++++++++++--- pkg/services/mail_service.go | 2 +- rest/controllers/api/auth_controller.go | 2 +- rest/controllers/register_controller.go | 8 +++--- rest/controllers/telegram_controller.go | 9 ++----- rest/controllers/users_controller.go | 2 +- 10 files changed, 73 insertions(+), 22 deletions(-) diff --git a/config.sample.yml b/config.sample.yml index 94987c8..5672ba2 100755 --- a/config.sample.yml +++ b/config.sample.yml @@ -20,6 +20,8 @@ server: name: "iSend.to" host: localhost port: 8080 + # URL pública para enlaces en correos, Telegram y webhooks (producción) + public_url: https://admin.u-site.app redis: instances: diff --git a/config.yml b/config.yml index cc1dce0..5d9e710 100755 --- a/config.yml +++ b/config.yml @@ -30,6 +30,7 @@ server: &server name: "USITE " host: 0.0.0.0 port: 8080 + public_url: https://admin.u-site.app profiler: enabled: false diff --git a/config/server.go b/config/server.go index 988188b..f97fe4e 100755 --- a/config/server.go +++ b/config/server.go @@ -28,6 +28,7 @@ type ServerConfig struct { Env string `mapstructure:"APP_ENV" yaml:"env" env:"APP_ENV" env-default:"dev"` Key string `mapstructure:"APP_KEY" yaml:"key" env:"APP_KEY" env-default:"1894cde6c936a294a478cff0a9227fd276d86df6573b51af5dc59c9064edf426"` Url string `mapstructure:"APP_URL" yaml:"url" env:"APP_URL" env-default:"http://localhost"` + PublicUrl string `mapstructure:"APP_PUBLIC_URL" yaml:"public_url" env:"APP_PUBLIC_URL"` Host string `mapstructure:"APP_HOST" yaml:"host" env:"APP_HOST" env-default:"localhost"` Port string `mapstructure:"APP_PORT" yaml:"port" env:"APP_PORT" env-default:"8080"` Path string `mapstructure:"APP_PATH" yaml:"path" env:"APP_PATH"` diff --git a/pkg/services/app_url.go b/pkg/services/app_url.go index 8f64d51..8e33a4f 100644 --- a/pkg/services/app_url.go +++ b/pkg/services/app_url.go @@ -10,8 +10,21 @@ import ( "github.com/sujit-baniya/fiber-boilerplate/app" ) -// getAppURL devuelve la URL base absoluta (sin slash final). -// Si APP_URL es http://localhost sin puerto, añade APP_PORT para enlaces en desarrollo. +// GetPublicURL devuelve la URL pública para enlaces en correos, Telegram y webhooks. +func GetPublicURL() string { + return getPublicURL() +} + +// getPublicURL usa APP_PUBLIC_URL si está configurada; si no, APP_URL (con puerto en localhost). +func getPublicURL() string { + if u := normalizeBaseURL(app.Http.Server.PublicUrl); u != "" { + return u + } + return getAppURL() +} + +// getAppURL devuelve la URL base de la app (sin slash final). +// Si APP_URL es http://localhost sin puerto, añade APP_PORT para desarrollo local. func getAppURL() string { u := strings.TrimRight(app.Http.Server.Url, "/") if u == "" { @@ -33,10 +46,21 @@ func getAppURL() string { return u } -// absAppURL convierte una ruta relativa en URL absoluta para correo/Telegram. +func normalizeBaseURL(raw string) string { + u := strings.TrimSpace(strings.TrimRight(raw, "/")) + if u == "" { + return "" + } + if !strings.Contains(u, "://") { + u = "https://" + u + } + return strings.TrimRight(u, "/") +} + +// absAppURL convierte una ruta relativa en URL absoluta pública (correo/Telegram). func absAppURL(path string) string { if path == "" { - return getAppURL() + return getPublicURL() } if strings.HasPrefix(path, "http://") || strings.HasPrefix(path, "https://") { return path @@ -44,7 +68,7 @@ func absAppURL(path string) string { if !strings.HasPrefix(path, "/") { path = "/" + path } - return getAppURL() + path + return getPublicURL() + path } func adminTicketPath(ticketID uint) string { diff --git a/pkg/services/app_url_test.go b/pkg/services/app_url_test.go index acbadbe..2fc9b40 100644 --- a/pkg/services/app_url_test.go +++ b/pkg/services/app_url_test.go @@ -19,7 +19,35 @@ func TestGetAppURLLocalhostAddsPort(t *testing.T) { } } -func TestAbsAppURLRelativePath(t *testing.T) { +func TestGetPublicURLPrefersPublicURL(t *testing.T) { + app.Http = &config.AppConfig{ + Server: config.ServerConfig{ + Url: "http://localhost:8080", + PublicUrl: "admin.u-site.app", + Port: "8080", + }, + } + if got := getPublicURL(); got != "https://admin.u-site.app" { + t.Fatalf("getPublicURL() = %q, want https://admin.u-site.app", got) + } +} + +func TestAbsAppURLUsesPublicURL(t *testing.T) { + app.Http = &config.AppConfig{ + Server: config.ServerConfig{ + Url: "http://localhost:8080", + PublicUrl: "https://admin.u-site.app", + Port: "8080", + }, + } + got := absAppURL("/portal/proyecto/bot?tab=Tickets&ticket=1") + want := "https://admin.u-site.app/portal/proyecto/bot?tab=Tickets&ticket=1" + if got != want { + t.Fatalf("absAppURL() = %q, want %q", got, want) + } +} + +func TestAbsAppURLFallsBackToAppURL(t *testing.T) { app.Http = &config.AppConfig{ Server: config.ServerConfig{ Url: "http://localhost", @@ -34,8 +62,8 @@ func TestAbsAppURLRelativePath(t *testing.T) { } func TestTelegramHTMLLinkEscapesAmpersand(t *testing.T) { - link := telegramHTMLLink("http://localhost:8084/portal/p?tab=Tickets&ticket=1", "Ver portal") - if link != `Ver portal` { + link := telegramHTMLLink("https://admin.u-site.app/portal/p?tab=Tickets&ticket=1", "Ver portal") + if link != `Ver portal` { t.Fatalf("telegramHTMLLink() = %q", link) } } diff --git a/pkg/services/mail_service.go b/pkg/services/mail_service.go index fc3f0cd..50f37e3 100755 --- a/pkg/services/mail_service.go +++ b/pkg/services/mail_service.go @@ -80,7 +80,7 @@ func GeneratePasswordResetURL(email string, baseURL string) string { // SendPortalCredentialsEmail envía al usuario del portal su URL de acceso y contraseña inicial. func SendPortalCredentialsEmail(email, nombre, password string) { - loginURL := fmt.Sprintf("%s/portal/login", app.Http.Server.Url) + loginURL := absAppURL("/portal/login") htmlBody := fmt.Sprintf(`