package services import ( "fmt" "html" "net" "net/url" "strings" "github.com/sujit-baniya/fiber-boilerplate/app" ) // 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 == "" { return fmt.Sprintf("http://localhost:%s", app.Http.Server.Port) } parsed, err := url.Parse(u) if err != nil || parsed.Host == "" { return u } host := parsed.Hostname() if parsed.Port() == "" && app.Http.Server.Port != "" { if host == "localhost" || host == "127.0.0.1" { parsed.Host = net.JoinHostPort(host, app.Http.Server.Port) return strings.TrimRight(parsed.String(), "/") } } return u } 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 getPublicURL() } if strings.HasPrefix(path, "http://") || strings.HasPrefix(path, "https://") { return path } if !strings.HasPrefix(path, "/") { path = "/" + path } return getPublicURL() + path } func adminTicketPath(ticketID uint) string { return fmt.Sprintf("/app/tickets?ticket=%d", ticketID) } func portalTicketPath(proyectoSlug string, ticketID uint) string { if proyectoSlug == "" { return "/portal/dashboard" } return fmt.Sprintf("/portal/proyecto/%s?tab=Tickets&ticket=%d", url.PathEscape(proyectoSlug), ticketID) } func escapeTelegramHTML(s string) string { return html.EscapeString(s) } func telegramHTMLLink(absURL, label string) string { return fmt.Sprintf(`%s`, escapeTelegramHTML(absURL), escapeTelegramHTML(label)) }