feat: Swagger UI + OpenAPI 3.0 spec at /docs

- Full OpenAPI 3.0 spec covering all 20 endpoints
- Swagger UI served at /docs via CDN (zero deps)
- Spec at /docs/openapi.yaml (go:embed)
- Real data examples (Selic 15%, USD/BRL 5.19, etc.)
- Publicly accessible (no API key needed for docs)
This commit is contained in:
2026-02-10 12:49:47 -03:00
parent f7c8b446bf
commit 3080a60711
6 changed files with 761 additions and 0 deletions

46
internal/api/swagger.go Normal file
View File

@@ -0,0 +1,46 @@
package api
import (
_ "embed"
"github.com/gofiber/fiber/v2"
)
//go:embed docs/openapi.yaml
var openapiSpec []byte
func RegisterSwagger(app *fiber.App) {
app.Get("/docs/openapi.yaml", func(c *fiber.Ctx) error {
c.Set("Content-Type", "application/yaml")
return c.Send(openapiSpec)
})
app.Get("/docs", func(c *fiber.Ctx) error {
c.Set("Content-Type", "text/html")
return c.SendString(swaggerHTML)
})
}
const swaggerHTML = `<!DOCTYPE html>
<html>
<head>
<title>Sentinela API</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://unpkg.com/swagger-ui-dist@5/swagger-ui.css">
<style>body { margin: 0; }</style>
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://unpkg.com/swagger-ui-dist@5/swagger-ui-bundle.js"></script>
<script>
SwaggerUIBundle({
url: '/docs/openapi.yaml',
dom_id: '#swagger-ui',
deepLinking: true,
presets: [SwaggerUIBundle.presets.apis, SwaggerUIBundle.SwaggerUIStandalonePreset],
layout: "BaseLayout"
})
</script>
</body>
</html>`