Files
meshtastic_mqtt_server/admin_help_routes.go
T
2026-06-05 19:05:04 +08:00

102 lines
2.6 KiB
Go

package main
import (
"errors"
"net/http"
"time"
"github.com/gin-gonic/gin"
"gorm.io/gorm"
)
type helpContentRequest struct {
Markdown string `json:"markdown"`
}
func registerHelpRoutes(r gin.IRouter, store *store) {
r.GET("/help", func(c *gin.Context) {
item, err := latestHelpContentDTO(store)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"item": item})
})
}
func registerAdminHelpRoutes(r gin.IRouter, store *store) {
r.GET("/help", func(c *gin.Context) {
item, err := latestHelpContentDTO(store)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"item": item})
})
r.POST("/help", func(c *gin.Context) {
var req helpContentRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid help content request"})
return
}
claims := c.MustGet("admin_claims").(*sessionClaims)
row, err := store.InsertHelpContent(req.Markdown, claims.Username)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
item, err := helpContentDTO(row.ID, row.Markdown, row.CreatedBy, &row.CreatedAt)
if err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusCreated, gin.H{"item": item})
})
r.POST("/help/preview", func(c *gin.Context) {
var req helpContentRequest
if err := c.ShouldBindJSON(&req); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": "invalid help preview request"})
return
}
html, err := renderHelpMarkdown(req.Markdown)
if err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, gin.H{"html": html})
})
}
func latestHelpContentDTO(store *store) (gin.H, error) {
row, err := store.GetLatestHelpContent()
if errors.Is(err, gorm.ErrRecordNotFound) {
return helpContentDTO(0, defaultHelpMarkdown, "", nil)
}
if err != nil {
return nil, err
}
return helpContentDTO(row.ID, row.Markdown, row.CreatedBy, &row.CreatedAt)
}
func helpContentDTO(id uint64, markdown, createdBy string, createdAt *time.Time) (gin.H, error) {
html, err := renderHelpMarkdown(markdown)
if err != nil {
return nil, err
}
return gin.H{"id": ptrHelpID(id), "markdown": markdown, "html": html, "created_by": createdBy, "created_at": ptrTime(createdAt)}, nil
}
func ptrHelpID(id uint64) any {
if id == 0 {
return nil
}
return id
}
func ptrTime(value *time.Time) any {
if value == nil {
return nil
}
return *value
}