go-quasar-partial-ssr/backend/internal/http/routes/system_routes.go

95 lines
2.3 KiB
Go

package routes
import (
"fmt"
"os"
"path/filepath"
"sort"
"time"
"server/internal/tsgenerator"
"github.com/gofiber/fiber/v3"
"github.com/gofiber/fiber/v3/middleware/static"
"github.com/prometheus/client_golang/prometheus/promhttp"
)
const spaDistPath = "internal/http/static/spa"
// Typescript: interface
type MailDebugItem struct {
Name string `json:"name"`
Content string `json:"content"`
}
// healthHandler returns a simple application health status.
func healthHandler(c fiber.Ctx) error {
return c.JSON(fiber.Map{
"data": fiber.Map{"status": "ok", "ts": time.Now().UTC()},
"error": nil,
})
}
func registerSystemRoutes(app *fiber.App) {
// Typescript: TSEndpoint= path=/health; name=health; method=GET; response=string
app.Get("/health", healthHandler)
// Typescript: TSEndpoint= path=/metrics; name=metrics; method=GET; response=string
app.Get("/metrics", promhttp.Handler())
app.Get("/tsgenerate", func(c fiber.Ctx) error {
ts, err := tsgenerator.TsGenerate()
if err != nil {
return c.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
return c.SendString(ts)
})
// Typescript: TSEndpoint= path=/maildebug; name=mailDebug; method=GET; response=routes.[]MailDebugItem
app.Get("/maildebug", func(c fiber.Ctx) error {
entries, err := os.ReadDir("data/mail-debug")
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"data": nil,
"error": fmt.Sprintf("failed to read mail-debug directory: %v", err),
})
}
items := make([]MailDebugItem, 0, len(entries))
for _, entry := range entries {
if entry.IsDir() {
continue
}
name := entry.Name()
path := filepath.Join("data/mail-debug", name)
b, err := os.ReadFile(path)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"data": nil,
"error": fmt.Sprintf("failed to read mail file %s: %v", name, err),
})
}
items = append(items, MailDebugItem{
Name: name,
Content: string(b),
})
}
sort.Slice(items, func(i, j int) bool {
return items[i].Name < items[j].Name
})
return c.JSON(fiber.Map{
"data": items,
"error": nil,
})
})
app.Get("/", func(c fiber.Ctx) error {
return c.SendFile(filepath.Join(spaDistPath, "index.html"))
})
app.Use("/", static.New(spaDistPath))
}