Files
Sensitive-lexicon/cmd/server/main.go
2025-09-03 16:37:43 +08:00

97 lines
2.4 KiB
Go

package main
import (
"github.com/go-playground/validator/v10"
"github.com/gofiber/fiber/v2"
"log"
"os"
"sensitive-lexicon/internal/detect"
"sensitive-lexicon/internal/lexicon"
"strconv"
"time"
)
type User struct {
Name string `json:"name" validate:"min=5,max=20"`
Age int `json:"age" validate:"gte=18"`
Enrollment time.Time `json:"enrollment" validate:"before_today"`
Graduation time.Time `json:"graduation" validate:"gtfield=Enrollment"`
}
// BeforeToday 验证日期是否在今天之前
func BeforeToday(fl validator.FieldLevel) bool {
fieldTime, ok := fl.Field().Interface().(time.Time)
if !ok {
return false
}
return fieldTime.Before(time.Now())
}
func main() {
lexiconDir := getenv("LEXICON_DIR", "Vocabulary")
minNgram := getenvInt("FUZZY_MIN_NGRAM", 2)
maxNgram := getenvInt("FUZZY_MAX_NGRAM", 10)
maxDistance := getenvInt("FUZZY_MAX_DISTANCE", 1)
store := lexicon.NewStore()
if err := store.LoadFromDir(lexiconDir); err != nil {
log.Fatalf("failed to load lexicon: %v", err)
}
service := detect.NewService(store)
service.SetFuzzyConfig(detect.FuzzyConfig{MinNgramLen: minNgram, MaxNgramLen: maxNgram, MaxDistance: maxDistance})
app := fiber.New()
app.Get("/health", func(c *fiber.Ctx) error {
return c.JSON(fiber.Map{"status": "ok"})
})
app.Post("/detect", func(c *fiber.Ctx) error {
var req detect.DetectRequest
if err := c.BodyParser(&req); err != nil {
return fiber.NewError(fiber.StatusBadRequest, err.Error())
}
res := service.Detect(req)
return c.JSON(res)
})
app.Post("/contains", func(c *fiber.Ctx) error {
var req detect.ContainsRequest
if err := c.BodyParser(&req); err != nil {
return fiber.NewError(fiber.StatusBadRequest, err.Error())
}
res := service.Contains(req)
return c.JSON(res)
})
app.Post("/reload", func(c *fiber.Ctx) error {
if err := store.LoadFromDir(lexiconDir); err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
stats := store.Stats()
return c.JSON(stats)
})
port := getenv("PORT", "8080")
addr := ":" + port
log.Printf("listening on %s", addr)
if err := app.Listen(addr); err != nil {
log.Fatal(err)
}
}
func getenv(k, def string) string {
if v := os.Getenv(k); v != "" {
return v
}
return def
}
func getenvInt(k string, def int) int {
if v := os.Getenv(k); v != "" {
if i, err := strconv.Atoi(v); err == nil {
return i
}
}
return def
}