Files
soft_usite/rest/routes/publicas.go
T
Lizandro GuarnizoandCopilot c3f19991c9 feat: binarios pre-compilados del agente + endpoint de descarga
- Cross-compila usite-agent para linux/amd64, linux/arm64, linux/arm
  Binarios en agent/dist/ (CGO_ENABLED=0, stripped ~6MB c/u)
- GET /agent/download/:filename sirve el binario correcto
  con Content-Disposition attachment y validación anti path-traversal
- install.sh ya apunta a /agent/download/usite-agent-linux-ARCH

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-05-21 11:37:43 -05:00

64 lines
3.4 KiB
Go
Executable File

package routes
import (
"github.com/gofiber/fiber/v2"
"github.com/sujit-baniya/fiber-boilerplate/rest/controllers"
apiControllers "github.com/sujit-baniya/fiber-boilerplate/rest/controllers/api"
"github.com/sujit-baniya/fiber-boilerplate/rest/middlewares"
)
func RutasPublicas(web fiber.Router) {
web.Get("/", controllers.Landing)
web.Get("/index", controllers.Index)
//web.Get("/login", controllers.Login)
web.Get("/ping", Pong)
web.Get("/all-routes", AllRoutes)
web.Get("/do/verify-email", middlewares.ValidateConfirmToken, controllers.VerifyRegisteredEmail)
// ─── Webhooks públicos (sin autenticación) ────────────────────────────
// Bold requiere respuesta HTTP 200 rápida, sin middleware de sesión.
web.Post("/webhooks/bold", apiControllers.BoldWebhook)
// dLocal requiere respuesta HTTP 200 inmediata.
web.Post("/webhooks/dlocal", apiControllers.DlocalWebhook)
// Webhook entrante por integración SaaS (token único por config)
web.Post("/webhooks/saas-in/:token", controllers.SaasWebhookInHandler)
web.Get("/webhooks/saas-in/:token", controllers.SaasWebhookInHandler) // algunos SaaS verifican con GET
// ─── Página de confirmación de pago ───────────────────────────────────
web.Get("/pago-exitoso", apiControllers.PagoExitosoPage)
// Ruta fuera del prefijo /api para evitar que AuthApi() la intercepte
web.Get("/pago/estado", apiControllers.PagoEstadoAPI)
// ─── Documentación pública ────────────────────────────────────────────────
web.Get("/docs/:saas", controllers.DocsPublicoIndex)
web.Get("/docs/:saas/:slug", controllers.DocsPublicaPagina)
// ─── Webhook de Telegram para vinculación del portal ──────────────────────
// Configurar en el bot: POST https://api.telegram.org/bot{TOKEN}/setWebhook?url={HOST}/webhooks/telegram-portal
web.Post("/webhooks/telegram-portal", controllers.TelegramPortalWebhook)
// ─── Agente de monitoreo de servidores ────────────────────────────────────
// El agente instalado en cada servidor reporta métricas aquí (sin sesión, auth por token).
web.Post("/agent/heartbeat", controllers.AgentHeartbeat)
// Servir el script de instalación del agente
web.Get("/agent/install.sh", func(c *fiber.Ctx) error {
c.Set("Content-Type", "text/plain; charset=utf-8")
return c.SendFile("./agent/install.sh")
})
// Descargar binario pre-compilado del agente
// Ejemplo: GET /agent/download/usite-agent-linux-amd64
web.Get("/agent/download/:filename", func(c *fiber.Ctx) error {
filename := c.Params("filename")
// Validar que sea un nombre de binario válido (sin path traversal)
for _, ch := range filename {
if ch == '/' || ch == '.' || ch == '\\' {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{"error": "nombre inválido"})
}
}
path := "./agent/dist/" + filename
c.Set("Content-Disposition", "attachment; filename=\""+filename+"\"")
c.Set("Content-Type", "application/octet-stream")
return c.SendFile(path)
})
// ─── Página de estado del sistema (Atlassian Statuspage) ────────────────
web.Get("/status", controllers.StatusPage)
}