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:
46
internal/api/swagger.go
Normal file
46
internal/api/swagger.go
Normal 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>`
|
||||
Reference in New Issue
Block a user